libisdn
|
00001 #include <stdlib.h> 00002 #include <assert.h> 00003 #include <string.h> 00004 00005 #include "Q931.h" 00006 #include "Q931priv.h" 00007 00008 /* 00009 * Internal data structures 00010 */ 00011 struct Q931Dialect { 00012 L3INT id; 00013 L3INT flags; 00014 L3UCHAR mode; 00015 L3UCHAR codesets; 00017 const char *name; 00019 /* Tables */ 00020 struct Q931MessageIE *mesIEMap; 00021 Q931State states[Q931MAXSTATE]; 00023 /* Callbacks */ 00024 q931proc_func_t *proc_unknown_cb; 00025 q931proc_func_t *proc_invalid_cb; 00026 00027 q931proc_func_t *proc_cb[Q931MAXMES]; 00028 q931umes_func_t *umes_cb[Q931MAXMES]; 00029 q931pmes_func_t *pmes_cb[Q931MAXMES]; 00030 00031 q931uie_func_t *uie_cb[Q931MAXIE]; 00032 q931pie_func_t *pie_cb[Q931MAXIE]; 00033 q931die_func_t *die_cb[Q931MAXIE]; 00034 00035 q931timeout_func_t *timeout_cb[Q931MAXTIMER]; 00036 q931timer_t timeout[Q931MAXTIMER]; 00037 }; 00038 00039 /* 00040 * Private global 00041 */ 00042 static struct Q931Dialect dialects[Q931MAXDLCT]; 00043 static L3BOOL initialized = L3FALSE; 00044 00045 /* 00046 * 00047 */ 00048 void Q931DialectRegistryInit(void) 00049 { 00050 int x; 00051 00052 if (initialized) { 00053 return; 00054 } 00055 00056 memset(dialects, 0, sizeof(dialects)); 00057 00058 for (x = 0; x < Q931MAXDLCT; x++) { 00059 dialects[x].id = -1; 00060 } 00061 00062 initialized = L3TRUE; 00063 } 00064 00065 void Q931DialectRegister(L3UCHAR id, L3INT mode, void (* create_func)(struct Q931Dialect *dialect)) 00066 { 00067 int x; 00068 00069 for (x = 0; x < Q931MAXDLCT; x++) { 00070 if (dialects[x].id == -1) { 00071 continue; 00072 } 00073 if (dialects[x].id == id && dialects[x].mode == mode) { 00074 return; 00075 } 00076 } 00077 00078 for (x = 0; x < Q931MAXDLCT; x++) { 00079 if (dialects[x].id == -1) { 00080 dialects[x].id = id; 00081 dialects[x].mode = mode; 00082 create_func(&dialects[x]); 00083 break; 00084 } 00085 } 00086 } 00087 00088 struct Q931Dialect *Q931DialectGet(L3UCHAR id, L3INT mode) 00089 { 00090 int x; 00091 00092 for (x = 0; x < Q931MAXDLCT; x++) { 00093 if (dialects[x].id == -1) { 00094 continue; 00095 } 00096 if (dialects[x].id == id && dialects[x].mode == mode) { 00097 return &dialects[x]; 00098 } 00099 } 00100 return NULL; 00101 } 00102 00103 void Q931DialectSetMesIEMap(struct Q931Dialect *dialect, struct Q931MessageIE *map) 00104 { 00105 assert(dialect); 00106 assert(map); 00107 00108 dialect->mesIEMap = map; 00109 } 00110 00111 struct Q931MessageIE* Q931DialectGetMesIEMap(struct Q931Dialect *dialect) 00112 { 00113 assert(dialect); 00114 assert(dialect->mesIEMap); 00115 00116 return dialect->mesIEMap; 00117 } 00118 00119 /* 00120 * Dialect codesets 00121 */ 00122 void Q931DialectAddCodeset(struct Q931Dialect *dialect, L3UCHAR codeset) 00123 { 00124 assert(dialect); 00125 00126 if (codeset == Q931_CODESET_ALL) { 00127 dialect->codesets = Q931_CODESET_ALL; 00128 } else { 00129 dialect->codesets |= (1 << codeset); 00130 } 00131 } 00132 00133 L3BOOL Q931DialectIsValidCodeset(struct Q931Dialect *dialect, L3UCHAR codeset) 00134 { 00135 assert(dialect); 00136 00137 return ((dialect->codesets & codeset) != 0); 00138 } 00139 00140 /* 00141 * Dialect flags 00142 */ 00143 void Q931DialectSetFlag(struct Q931Dialect *dialect, L3INT flag) 00144 { 00145 assert(dialect); 00146 00147 dialect->flags |= flag; 00148 } 00149 00150 L3BOOL Q931DialectIsSetFlag(struct Q931Dialect *dialect, L3INT flag) 00151 { 00152 assert(dialect); 00153 00154 return ((dialect->flags & flag) != 0); 00155 } 00156 00157 void Q931DialectSetMesProc(struct Q931Dialect *dialect, L3UCHAR mes, q931proc_func_t *Q931ProcFunc, q931umes_func_t *Q931UmesFunc, q931pmes_func_t *Q931PmesFunc) 00158 { 00159 assert(dialect); 00160 00161 dialect->proc_cb[mes] = Q931ProcFunc; 00162 dialect->umes_cb[mes] = Q931UmesFunc; 00163 dialect->pmes_cb[mes] = Q931PmesFunc; 00164 } 00165 00166 /* 00167 * IE cb table 00168 */ 00169 void Q931DialectSetIEProc(struct Q931Dialect *dialect, L3UCHAR iec, q931pie_func_t *PieProc, q931uie_func_t *UieProc, q931die_func_t *DieProc) 00170 { 00171 assert(dialect); 00172 00173 dialect->uie_cb[iec] = UieProc; 00174 dialect->pie_cb[iec] = PieProc; 00175 dialect->die_cb[iec] = DieProc; 00176 } 00177 00178 /* 00179 * Timer 00180 */ 00181 void Q931DialectSetTimerProc(struct Q931Dialect *dialect, L3UCHAR timer, q931timeout_func_t *Q931TimeoutProc) 00182 { 00183 assert(dialect); 00184 00185 dialect->timeout_cb[timer] = Q931TimeoutProc; 00186 } 00187 00188 void Q931DialectSetTimerProcAll(struct Q931Dialect *dialect, q931timeout_func_t *Q931TimeoutProc) 00189 { 00190 int i; 00191 00192 assert(dialect); 00193 00194 for (i = 0; i < Q931MAXTIMER; i++) { 00195 dialect->timeout_cb[i] = Q931TimeoutProc; 00196 } 00197 } 00198 00199 void Q931DialectSetTimeout(struct Q931Dialect *dialect, L3UCHAR timer, q931timer_t timeout) 00200 { 00201 assert(dialect); 00202 00203 dialect->timeout[timer] = timeout; 00204 } 00205 00206 /* 00207 * State table 00208 */ 00209 void Q931DialectAddStateEntry(struct Q931Dialect *dialect, L3INT state, L3INT mes, L3UCHAR flags) 00210 { 00211 int x; 00212 00213 assert(dialect); 00214 assert(dialect->states); 00215 00216 for (x = 0; x < Q931MAXSTATE; x++) { 00217 if (dialect->states[x].Message == 0) { 00218 dialect->states[x].State = state; 00219 dialect->states[x].Message = mes; 00220 dialect->states[x].Flags = flags; 00221 break; 00222 } 00223 } 00224 } 00225 00226 L3BOOL Q931DialectIsEventLegal(struct Q931Dialect *dialect, L3INT state, L3INT mes, L3UCHAR dirflags) 00227 { 00228 int x; 00229 00230 assert(dialect); 00231 assert(dialect->states); 00232 00233 /* strip other flags */ 00234 dirflags &= MSGF_FROM_BOTH; 00235 00236 for (x = 0; x < Q931MAXSTATE; x++) { 00237 if(!dialect->states[x].Message) { 00238 break; 00239 } 00240 if ((dialect->states[x].State & state) == state && 00241 dialect->states[x].Message == mes && 00242 dialect->states[x].Flags & dirflags) { 00243 return L3TRUE; 00244 } 00245 } 00246 return L3FALSE; 00247 } 00248 00249 00250 /* 00251 * Callback helpers 00252 */ 00253 void Q931DialectSetUnknownMesProc(struct Q931Dialect *dialect, q931proc_func_t proc) 00254 { 00255 dialect->proc_unknown_cb = proc; 00256 } 00257 00258 q931proc_func_t *Q931DialectGetUnknownMesProc(const struct Q931Dialect *dialect) 00259 { 00260 return dialect->proc_unknown_cb; 00261 } 00262 00263 void Q931DialectSetInvalidMesProc(struct Q931Dialect *dialect, q931proc_func_t proc) 00264 { 00265 dialect->proc_invalid_cb = proc; 00266 } 00267 00268 q931proc_func_t *Q931DialectGetInvalidMesProc(const struct Q931Dialect *dialect) 00269 { 00270 return dialect->proc_invalid_cb; 00271 } 00272 00273 00274 q931proc_func_t *Q931DialectGetMesProc(const struct Q931Dialect *dialect, L3UCHAR type) 00275 { 00276 return dialect->proc_cb[type]; 00277 } 00278 00279 q931umes_func_t *Q931DialectGetUmesProc(const struct Q931Dialect *dialect, L3UCHAR type) 00280 { 00281 return dialect->umes_cb[type]; 00282 } 00283 00284 q931pmes_func_t *Q931DialectGetPmesProc(const struct Q931Dialect *dialect, L3UCHAR type) 00285 { 00286 return dialect->pmes_cb[type]; 00287 } 00288 00289 00290 q931uie_func_t *Q931DialectGetUieProc(const struct Q931Dialect *dialect, L3UCHAR type) 00291 { 00292 return dialect->uie_cb[type]; 00293 } 00294 00295 q931pie_func_t *Q931DialectGetPieProc(const struct Q931Dialect *dialect, L3UCHAR type) 00296 { 00297 return dialect->pie_cb[type]; 00298 } 00299 00300 q931die_func_t *Q931DialectGetDieProc(const struct Q931Dialect *dialect, L3UCHAR type) 00301 { 00302 return dialect->die_cb[type]; 00303 } 00304 00305 00306 q931timeout_func_t *Q931DialectGetTimerProc(const struct Q931Dialect *dialect, L3UCHAR timer) 00307 { 00308 return dialect->timeout_cb[timer]; 00309 } 00310 00311 q931timer_t Q931DialectGetTimeout(const struct Q931Dialect *dialect, L3UCHAR timer) 00312 { 00313 return dialect->timeout[timer]; 00314 } 00315 00316 /* 00317 * Toolfunctions 00318 */ 00319 L3INT Q931DialectGetID(const struct Q931Dialect *dialect) 00320 { 00321 return dialect->id; 00322 } 00323 00324 Q931Dialect_t Q931DialectGetType(const struct Q931Dialect *dialect) 00325 { 00326 return (dialect->id & (~Q931_NT)); 00327 } 00328 00329 Q931NetUser_t Q931DialectGetMode(const struct Q931Dialect *dialect) 00330 { 00331 return (dialect->id & Q931_NT); 00332 } 00333 00334 const char * Q931DialectGetName(const struct Q931Dialect *dialect) 00335 { 00336 return dialect->name; 00337 } 00338 00339 void Q931DialectSetName(struct Q931Dialect *dialect, const char *name) 00340 { 00341 dialect->name = name; 00342 }