Changes in include/freeDiameter/libfreeDiameter.h [1:bafb831ba688:3:ef303f1078ab] in freeDiameter
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
include/freeDiameter/libfreeDiameter.h
r1 r3 122 122 char * fd_log_time ( char * buf, size_t len ); 123 123 124 /************************** DEBUG MACROS ************************************/125 124 126 125 /* levels definitions */ … … 137 136 #endif /* TRACE_LEVEL */ 138 137 139 /* The level of the file being compiled */138 /* The level of the file being compiled. */ 140 139 static int local_debug_level = TRACE_LEVEL; 141 140 142 /* helper macros (pre-processor hacks) */ 143 #define __str( arg ) #arg 144 #define _stringize( arg ) __str( arg ) 145 #define __agr( arg1, arg2 ) arg1 ## arg2 146 #define _aggregate( arg1, arg2 ) __agr( arg1, arg2 ) 147 148 /* Some portability tricks to get nice function name in __PRETTY_FUNCTION__ */ 141 /* A global level, changed by configuration or cmd line for example. default is 0. */ 142 extern int fd_g_debug_lvl; 143 144 /* Some portability code to get nice function name in __PRETTY_FUNCTION__ */ 149 145 #if __STDC_VERSION__ < 199901L 150 146 # if __GNUC__ >= 2 … … 159 155 160 156 /* Boolean for tracing at a certain level */ 161 #define TRACE_BOOL(_level_) ( (_level_) <= local_debug_level )162 163 /* The general debug macro, each call results in two lines of debug messages */157 #define TRACE_BOOL(_level_) ( (_level_) <= local_debug_level + fd_g_debug_lvl ) 158 159 /* The general debug macro, each call results in two lines of debug messages (change the macro for more compact output) */ 164 160 #define TRACE_DEBUG(level,format,args... ) { \ 165 161 if ( TRACE_BOOL(level) ) { \ … … 173 169 } 174 170 175 /* Helper for function entry */171 /* Helper for function entry -- for very detailed trace of the execution */ 176 172 #define TRACE_ENTRY(_format,_args... ) \ 177 173 TRACE_DEBUG(FCTS, "->%s (" #_args ") = (" _format ") >", __PRETTY_FUNCTION__, ##_args ); 178 174 179 /* Helper for debugging by adding traces */175 /* Helper for debugging by adding traces -- for debuging a specific location of the code */ 180 176 #define TRACE_HERE() \ 181 TRACE_DEBUG( INFO, " -- debug checkpoint -- ");182 183 /* Helper for tracing the CHECK_* macros bellow */177 TRACE_DEBUG(NONE, " -- debug checkpoint -- "); 178 179 /* Helper for tracing the CHECK_* macros bellow -- very very verbose code execution! */ 184 180 #define TRACE_DEBUG_ALL( str ) \ 185 181 TRACE_DEBUG(CALL, str ); … … 284 280 } 285 281 286 /****************************** Socket helpers ************************************/ 282 283 /*============================================================*/ 284 /* MACROS */ 285 /*============================================================*/ 286 287 /* helper macros (pre-processor hacks to allow macro arguments) */ 288 #define __str( arg ) #arg 289 #define _stringize( arg ) __str( arg ) 290 #define __agr( arg1, arg2 ) arg1 ## arg2 291 #define _aggregate( arg1, arg2 ) __agr( arg1, arg2 ) 287 292 288 293 /* Some aliases to socket addresses structures */ … … 337 342 (((in_addr_t *)(a6))[3]) 338 343 339 /*340 * Other macros341 */342 344 343 345 /* We provide macros to convert 64 bit values to and from network byte-order, on systems where it is not already provided. */ … … 354 356 #endif /* HAVE_NTOHLL */ 355 357 356 /* This macro will pad a size to the next multiple of 4. */358 /* This macro will give the next multiple of 4 for an integer (used for padding sizes of AVP). */ 357 359 #define PAD4(_x) ((_x) + ( (4 - (_x)) & 3 ) ) 358 360 359 /* Useful to display as ASCII some bytes values*/361 /* Useful to display as safe ASCII a value (will garbage UTF-8 output...) */ 360 362 #define ASCII(_c) ( ((_c < 32) || (_c > 127)) ? ( _c ? '?' : ' ' ) : _c ) 361 363 … … 365 367 || ((ts1)->tv_nsec < (ts2)->tv_nsec) ) 366 368 367 /* Some constants for dumping flags and values */368 #define DUMP_AVPFL_str "%c%c"369 #define DUMP_AVPFL_val(_val) (_val & AVP_FLAG_VENDOR)?'V':'-' , (_val & AVP_FLAG_MANDATORY)?'M':'-'370 #define DUMP_CMDFL_str "%c%c%c%c"371 #define DUMP_CMDFL_val(_val) (_val & CMD_FLAG_REQUEST)?'R':'-' , (_val & CMD_FLAG_PROXIABLE)?'P':'-' , (_val & CMD_FLAG_ERROR)?'E':'-' , (_val & CMD_FLAG_RETRANSMIT)?'T':'-'372 369 373 370 /*============================================================*/ … … 403 400 } 404 401 405 /* Cleanups for cancellation (all threads should be safely cancelable !) */402 /* Cleanups for cancellation (all threads should be safely cancelable...) */ 406 403 static __inline__ void fd_cleanup_mutex( void * mutex ) 407 404 { … … 591 588 be freed automatically along with the object itself with call to dict_fini later. 592 589 593 - dict_new:590 - fd_dict_new: 594 591 The "parent" parameter is not used for vendors. 595 592 Sample code to create a vendor: … … 598 595 struct dict_object * myvendor; 599 596 struct dict_vendor_data myvendordata = { 23455, "my vendor name" }; -- just an example... 600 ret = dict_new (DICT_VENDOR, &myvendordata, NULL, &myvendor );597 ret = fd_dict_new ( dict, DICT_VENDOR, &myvendordata, NULL, &myvendor ); 601 598 } 602 599 603 - dict_search:600 - fd_dict_search: 604 601 Sample codes to look for a vendor object, by its id or name: 605 602 { … … 607 604 struct dict_object * vendor_found; 608 605 vendor_id_t vendorid = 23455; 609 ret = dict_search (DICT_VENDOR, VENDOR_BY_ID, &vendorid, &vendor_found, ENOENT);606 ret = fd_dict_search ( dict, DICT_VENDOR, VENDOR_BY_ID, &vendorid, &vendor_found, ENOENT); 610 607 - or - 611 ret = dict_search (DICT_VENDOR, VENDOR_BY_NAME, "my vendor name", &vendor_found, ENOENT);608 ret = fd_dict_search ( dict, DICT_VENDOR, VENDOR_BY_NAME, "my vendor name", &vendor_found, ENOENT); 612 609 } 613 610 614 - dict_getval:611 - fd_dict_getval: 615 612 Sample code to retrieve the data from a vendor object: 616 613 { … … 618 615 struct dict_object * myvendor; 619 616 struct dict_vendor_data myvendordata; 620 ret = dict_search (DICT_VENDOR, VENDOR_BY_NAME, "my vendor name", &myvendor, ENOENT);621 ret = dict_getval ( myvendor, &myvendordata );617 ret = fd_dict_search ( dict, DICT_VENDOR, VENDOR_BY_NAME, "my vendor name", &myvendor, ENOENT); 618 ret = fd_dict_getval ( myvendor, &myvendordata ); 622 619 printf("my vendor id: %d\n", myvendordata.vendor_id ); 623 620 } … … 660 657 The vendor associated to an application is retrieved with VENDOR_OF_APPLICATION search criteria on vendors. 661 658 662 - dict_new:659 - fd_dict_new: 663 660 Sample code for application creation: 664 661 { … … 675 672 }; 676 673 677 ret = dict_new (DICT_VENDOR, &vendor_data, NULL, &vendor );678 ret = dict_new (DICT_APPLICATION, &app_data, vendor, &appl );674 ret = fd_dict_new ( dict, DICT_VENDOR, &vendor_data, NULL, &vendor ); 675 ret = fd_dict_new ( dict, DICT_APPLICATION, &app_data, vendor, &appl ); 679 676 } 680 677 681 - dict_search:678 - fd_dict_search: 682 679 Sample code to retrieve the vendor of an application 683 680 { … … 685 682 struct dict_object * vendor, * appli; 686 683 687 ret = dict_search (DICT_APPLICATION, APPLICATION_BY_NAME, "my vendor's application", &appli, ENOENT);688 ret = dict_search (DICT_VENDOR, VENDOR_OF_APPLICATION, appli, &vendor, ENOENT);684 ret = fd_dict_search ( dict, DICT_APPLICATION, APPLICATION_BY_NAME, "my vendor's application", &appli, ENOENT); 685 ret = fd_dict_search ( dict, DICT_VENDOR, VENDOR_OF_APPLICATION, appli, &vendor, ENOENT); 689 686 } 690 687 691 - dict_getval:688 - fd_dict_getval: 692 689 Sample code to retrieve the data from an application object: 693 690 { … … 695 692 struct dict_object * appli; 696 693 struct dict_application_data appl_data; 697 ret = dict_search (DICT_APPLICATION, APPLICATION_BY_NAME, "my vendor's application", &appli, ENOENT);698 ret = dict_getval ( appli, &appl_data );694 ret = fd_dict_search ( dict, DICT_APPLICATION, APPLICATION_BY_NAME, "my vendor's application", &appli, ENOENT); 695 ret = fd_dict_getval ( appli, &appl_data ); 699 696 printf("my application id: %s\n", appl_data.application_id ); 700 697 } … … 797 794 * API usage : 798 795 799 - dict_new:796 - fd_dict_new: 800 797 The "parent" parameter may point to an application object, when a type is defined by a Diameter application. 801 798 … … 811 808 NULL 812 809 }; 813 ret = dict_new (DICT_TYPE, &mytypedata, NULL, &mytype );810 ret = fd_dict_new ( dict, DICT_TYPE, &mytypedata, NULL, &mytype ); 814 811 } 815 812 816 - dict_search:813 - fd_dict_search: 817 814 Sample code: 818 815 { 819 816 int ret; 820 817 struct dict_object * address_type; 821 ret = dict_search (DICT_TYPE, TYPE_BY_NAME, "Address", &address_type, ENOENT);818 ret = fd_dict_search ( dict, DICT_TYPE, TYPE_BY_NAME, "Address", &address_type, ENOENT); 822 819 } 823 820 … … 858 855 * API usage : 859 856 860 - dict_new:857 - fd_dict_new: 861 858 The "parent" parameter must point to a derived type object. 862 859 Sample code to create a type "Boolean" with two constants "True" and "False": … … 881 878 .enum_value.i32 = -1 882 879 }; 883 ret = dict_new (DICT_TYPE, &type_boolean_data, NULL, &type_boolean );884 ret = dict_new (DICT_ENUMVAL, &boolean_false, type_boolean, NULL );885 ret = dict_new (DICT_ENUMVAL, &boolean_true , type_boolean, NULL );880 ret = fd_dict_new ( dict, DICT_TYPE, &type_boolean_data, NULL, &type_boolean ); 881 ret = fd_dict_new ( dict, DICT_ENUMVAL, &boolean_false, type_boolean, NULL ); 882 ret = fd_dict_new ( dict, DICT_ENUMVAL, &boolean_true , type_boolean, NULL ); 886 883 887 884 } 888 885 889 - dict_search:886 - fd_dict_search: 890 887 Sample code to look for a constant name, by its value: 891 888 { … … 899 896 }; 900 897 901 ret = dict_search (DICT_ENUMVAL, ENUMVAL_BY_STRUCT, &boolean_by_value, &value_found, ENOENT);898 ret = fd_dict_search ( dict, DICT_ENUMVAL, ENUMVAL_BY_STRUCT, &boolean_by_value, &value_found, ENOENT); 902 899 } 903 900 904 - dict_getval:901 - fd_dict_getval: 905 902 Sample code to retrieve the data from a constant object: 906 903 { … … 915 912 }; 916 913 917 ret = dict_search (DICT_ENUMVAL, ENUMVAL_BY_STRUCT, &boolean_by_value, &value_found, ENOENT);918 ret = dict_getval ( value_found, &boolean_data );914 ret = fd_dict_search ( dict, DICT_ENUMVAL, ENUMVAL_BY_STRUCT, &boolean_by_value, &value_found, ENOENT); 915 ret = fd_dict_getval ( value_found, &boolean_data ); 919 916 printf(" Boolean with value 0: %s", boolean_data.enum_name ); 920 917 } … … 944 941 #define AVP_FLAG_RESERVED8 0x01 945 942 943 /* For dumping flags and values */ 944 #define DUMP_AVPFL_str "%c%c" 945 #define DUMP_AVPFL_val(_val) (_val & AVP_FLAG_VENDOR)?'V':'-' , (_val & AVP_FLAG_MANDATORY)?'M':'-' 946 946 947 947 /* Type to hold data associated to an avp */ … … 981 981 To create the rules (ABNF) for children of Grouped AVP, see the DICT_RULE related part. 982 982 983 - dict_new:983 - fd_dict_new: 984 984 Sample code for AVP creation: 985 985 { … … 1006 1006 1007 1007 -- Create an AVP with a base type -- 1008 ret = dict_new (DICT_AVP, &user_name_data, NULL, &user_name_avp );1008 ret = fd_dict_new ( dict, DICT_AVP, &user_name_data, NULL, &user_name_avp ); 1009 1009 1010 1010 -- Create an AVP with a derived type -- 1011 ret = dict_search (DICT_TYPE, TYPE_BY_NAME, "Boolean", &boolean_type, ENOENT);1012 ret = dict_new (DICT_AVP, &sample_boolean_data , boolean_type, &sample_boolean_avp );1011 ret = fd_dict_search ( dict, DICT_TYPE, TYPE_BY_NAME, "Boolean", &boolean_type, ENOENT); 1012 ret = fd_dict_new ( dict, DICT_AVP, &sample_boolean_data , boolean_type, &sample_boolean_avp ); 1013 1013 1014 1014 } 1015 1015 1016 - dict_search:1016 - fd_dict_search: 1017 1017 Sample code to look for an AVP 1018 1018 { … … 1026 1026 }; 1027 1027 1028 ret = dict_search (DICT_AVP, AVP_BY_NAME, "User-Name", &avp_username, ENOENT);1028 ret = fd_dict_search ( dict, DICT_AVP, AVP_BY_NAME, "User-Name", &avp_username, ENOENT); 1029 1029 1030 ret = dict_search (DICT_AVP, AVP_BY_NAME_AND_VENDOR, &avpvendorboolean, &avp_sampleboolean, ENOENT);1030 ret = fd_dict_search ( dict, DICT_AVP, AVP_BY_NAME_AND_VENDOR, &avpvendorboolean, &avp_sampleboolean, ENOENT); 1031 1031 1032 1032 } 1033 1033 1034 - dict_getval:1034 - fd_dict_getval: 1035 1035 Sample code to retrieve the data from an AVP object: 1036 1036 { … … 1038 1038 struct dict_object * avp_username; 1039 1039 struct dict_avp_data user_name_data; 1040 ret = dict_search (DICT_AVP, AVP_BY_NAME, "User-Name", &avp_username, ENOENT);1041 ret = dict_getval ( avp_username, &user_name_data );1040 ret = fd_dict_search ( dict, DICT_AVP, AVP_BY_NAME, "User-Name", &avp_username, ENOENT); 1041 ret = fd_dict_getval ( avp_username, &user_name_data ); 1042 1042 printf("User-Name code: %d\n", user_name_data.avp_code ); 1043 1043 } … … 1068 1068 #define CMD_FLAG_RESERVED8 0x01 1069 1069 1070 /* For dumping flags and values */ 1071 #define DUMP_CMDFL_str "%c%c%c%c" 1072 #define DUMP_CMDFL_val(_val) (_val & CMD_FLAG_REQUEST)?'R':'-' , (_val & CMD_FLAG_PROXIABLE)?'P':'-' , (_val & CMD_FLAG_ERROR)?'E':'-' , (_val & CMD_FLAG_RETRANSMIT)?'T':'-' 1073 1070 1074 /* Type to hold data associated to a command */ 1071 1075 struct dict_cmd_data { … … 1095 1099 Note that the "Request" and "Answer" commands are two independant objects. This allows to have different rules for each. 1096 1100 1097 - dict_new:1101 - fd_dict_new: 1098 1102 Sample code for command creation: 1099 1103 { … … 1108 1112 }; 1109 1113 1110 ret = dict_new (DICT_COMMAND, &ce_data, NULL, &cer );1114 ret = fd_dict_new (dict, DICT_COMMAND, &ce_data, NULL, &cer ); 1111 1115 1112 1116 ce_data.cmd_name = "Capabilities-Exchange-Answer"; 1113 1117 ce_data.cmd_flag_val = 0; // Same constraint on "R" flag, but this time it must be cleared. 1114 1118 1115 ret = dict_new (DICT_COMMAND, &ce_data, NULL, &cea );1119 ret = fd_dict_new ( dict, DICT_COMMAND, &ce_data, NULL, &cea ); 1116 1120 } 1117 1121 1118 - dict_search:1122 - fd_dict_search: 1119 1123 Sample code to look for a command 1120 1124 { … … 1122 1126 struct dict_object * cer, * cea; 1123 1127 command_code_t code = 257; 1124 ret = dict_search (DICT_COMMAND, CMD_BY_NAME, "Capabilities-Exchange-Request", &cer, ENOENT);1125 ret = dict_search (DICT_COMMAND, CMD_BY_CODE_R, &code, &cer, ENOENT);1128 ret = fd_dict_search ( dict, DICT_COMMAND, CMD_BY_NAME, "Capabilities-Exchange-Request", &cer, ENOENT); 1129 ret = fd_dict_search ( dict, DICT_COMMAND, CMD_BY_CODE_R, &code, &cer, ENOENT); 1126 1130 } 1127 1131 1128 - dict_getval:1132 - fd_dict_getval: 1129 1133 Sample code to retrieve the data from a command object: 1130 1134 { … … 1133 1137 struct dict_object * cea; 1134 1138 struct dict_cmd_data cea_data; 1135 ret = dict_search (DICT_COMMAND, CMD_BY_NAME, "Capabilities-Exchange-Request", &cer, ENOENT);1136 ret = dict_search (DICT_COMMAND, CMD_ANSWER, cer, &cea, ENOENT);1137 ret = dict_getval ( cea, &cea_data );1139 ret = fd_dict_search ( dict, DICT_COMMAND, CMD_BY_NAME, "Capabilities-Exchange-Request", &cer, ENOENT); 1140 ret = fd_dict_search ( dict, DICT_COMMAND, CMD_ANSWER, cer, &cea, ENOENT); 1141 ret = fd_dict_getval ( cea, &cea_data ); 1138 1142 printf("Answer to CER: %s\n", cea_data.cmd_name ); 1139 1143 } … … 1186 1190 The "parent" parameter can not be NULL. It points to the object (grouped avp or command) to which this rule apply (i.e. for which the ABNF is defined). 1187 1191 1188 - dict_new:1192 - fd_dict_new: 1189 1193 Sample code for rule creation. Let's create the Proxy-Info grouped AVP for example. 1190 1194 { … … 1201 1205 1202 1206 -- Create the parent AVP 1203 ret = dict_new (DICT_AVP, &proxy_info_data, NULL, &proxy_info_avp );1207 ret = fd_dict_new ( dict, DICT_AVP, &proxy_info_data, NULL, &proxy_info_avp ); 1204 1208 1205 1209 -- Create the first child AVP. 1206 ret = dict_new (DICT_TYPE, &di_type_data, NULL, &diameteridentity_type );1207 ret = dict_new (DICT_AVP, &proxy_host_data, diameteridentity_type, &proxy_host_avp );1210 ret = fd_dict_new ( dict, DICT_TYPE, &di_type_data, NULL, &diameteridentity_type ); 1211 ret = fd_dict_new ( dict, DICT_AVP, &proxy_host_data, diameteridentity_type, &proxy_host_avp ); 1208 1212 1209 1213 -- Create the other child AVP 1210 ret = dict_new (DICT_AVP, &proxy_state_data, NULL, &proxy_state_avp );1214 ret = fd_dict_new ( dict, DICT_AVP, &proxy_state_data, NULL, &proxy_state_avp ); 1211 1215 1212 1216 -- Now we can create the rules. Both children AVP are mandatory. … … 1216 1220 1217 1221 rule_data.rule_avp = proxy_host_avp; 1218 ret = dict_new (DICT_RULE, &rule_data, proxy_info_avp, NULL );1222 ret = fd_dict_new ( dict, DICT_RULE, &rule_data, proxy_info_avp, NULL ); 1219 1223 1220 1224 rule_data.rule_avp = proxy_state_avp; 1221 ret = dict_new (DICT_RULE, &rule_data, proxy_info_avp, NULL );1225 ret = fd_dict_new ( dict, DICT_RULE, &rule_data, proxy_info_avp, NULL ); 1222 1226 } 1223 1227 1224 - dict_search anddict_getval are similar to previous examples.1228 - fd_dict_search and fd_dict_getval are similar to previous examples. 1225 1229 1226 1230 */ … … 1274 1278 #define ER_DIAMETER_REDIRECT_INDICATION 3006 1275 1279 1276 /* Iterator on the rules of a parent object */ 1277 int fd_dict_iterate_rules ( struct dict_object *parent, void * data, int (*cb)(void *, struct dict_rule_data *) ); 1280 1281 /*============================================================*/ 1282 /* SESSIONS */ 1283 /*============================================================*/ 1284 1285 /* Modules that want to associate a state with a Session-Id must first register a handler of this type */ 1286 struct session_handler; 1287 1288 /* This opaque structure represents a session associated with a Session-Id */ 1289 struct session; 1290 1291 /* The state information that a module associate with a session -- each module define its own data format */ 1292 typedef void session_state; 1293 1294 /* 1295 * FUNCTION: fd_sess_handler_create 1296 * 1297 * PARAMETERS: 1298 * handler : location where the new handler must be stored. 1299 * cleanup : a callback function that must be called when the session with associated data is destroyed. 1300 * 1301 * DESCRIPTION: 1302 * Create a new session handler. This is needed by a module to associate a state with a session object. 1303 * The cleanup handler is called when the session timeout expires, or fd_sess_destroy is called. It must free 1304 * the state associated with the session, and eventually trig other actions (send a STR, ...). 1305 * 1306 * RETURN VALUE: 1307 * 0 : The new handler has been created. 1308 * EINVAL : A parameter is invalid. 1309 * ENOMEM : Not enough memory to complete the operation 1310 */ 1311 int fd_sess_handler_create_int ( struct session_handler ** handler, void (*cleanup)(char * sid, session_state * state) ); 1312 /* Macro to avoid casting everywhere */ 1313 #define fd_sess_handler_create( _handler, _cleanup ) \ 1314 fd_sess_handler_create_int( (_handler), (void (*)(char *, session_state *))(_cleanup) ) 1315 1316 /* 1317 * FUNCTION: fd_sess_handler_destroy 1318 * 1319 * PARAMETERS: 1320 * handler : location of an handler created by fd_sess_handler_create. 1321 * 1322 * DESCRIPTION: 1323 * This destroys a session handler (typically called when an application is shutting down). 1324 * If sessions states are registered with this handler, the cleanup callback is called on them. 1325 * 1326 * RETURN VALUE: 1327 * 0 : The handler was destroyed. 1328 * EINVAL : A parameter is invalid. 1329 * ENOMEM : Not enough memory to complete the operation 1330 */ 1331 int fd_sess_handler_destroy ( struct session_handler ** handler ); 1332 1333 1334 1335 /* 1336 * FUNCTION: fd_sess_new 1337 * 1338 * PARAMETERS: 1339 * session : The location where the session object will be created upon success. 1340 * diamId : \0-terminated string containing a Diameter Identity. 1341 * opt : Additional string. Usage is described bellow. 1342 * optlen : if opt is \0-terminated, this can be 0. Otherwise, the length of opt. 1343 * 1344 * DESCRIPTION: 1345 * Create a new session object. The Session-Id string associated with this session is generated as follow: 1346 * If diamId parameter is provided, the string is created according to the RFC: <diamId>;<high32>;<low32>[;opt] where 1347 * diamId is a Diameter Identity. 1348 * high32 and low32 are the parts of a monotonic 64 bits counter initialized to (time, 0) at startup. 1349 * opt is an optional string that can be concatenated to the identifier. 1350 * If diamId is NULL, the string is exactly the content of opt. 1351 * 1352 * RETURN VALUE: 1353 * 0 : The session is created. 1354 * EINVAL : A parameter is invalid. 1355 * EALREADY : A session with the same name already exists (returned in *session) 1356 * ENOMEM : Not enough memory to complete the operation 1357 */ 1358 int fd_sess_new ( struct session ** session, char * diamId, char * opt, size_t optlen ); 1359 1360 /* 1361 * FUNCTION: fd_sess_fromsid 1362 * 1363 * PARAMETERS: 1364 * sid : pointer to a string containing a Session-Id (UTF-8). 1365 * len : length of the sid string (which does not need to be '\0'-terminated) 1366 * session : On success, pointer to the session object created / retrieved. 1367 * new : if not NULL, set to 1 on return if the session object has been created, 0 if it was simply retrieved. 1368 * 1369 * DESCRIPTION: 1370 * Retrieve a session object from a Session-Id string. Calling this function makes an implicit call to the 1371 * fd_sess_link function on the returned session. In case no session object was previously existing with this 1372 * id, a new object is silently created (equivalent to fd_sess_new with flag SESSION_NEW_FULL). 1373 * 1374 * RETURN VALUE: 1375 * 0 : The session parameter has been updated. 1376 * EINVAL : A parameter is invalid. 1377 * ENOMEM : Not enough memory to complete the operation 1378 */ 1379 int fd_sess_fromsid ( char * sid, size_t len, struct session ** session, int * new); 1380 1381 /* 1382 * FUNCTION: fd_sess_getsid 1383 * 1384 * PARAMETERS: 1385 * session : Pointer to a session object. 1386 * sid : On success, the location of a (\0-terminated) string is stored here. 1387 * 1388 * DESCRIPTION: 1389 * Retrieve the session identifier (Session-Id) corresponding to a session object. 1390 * The returned sid is an UTF-8 string terminated by \0, suitable for calls to strlen and strcpy. 1391 * It may be used for example to set the value of an AVP. 1392 * Note that the sid string is not copied, just its reference... do not free it! 1393 * 1394 * RETURN VALUE: 1395 * 0 : The sid parameter has been updated. 1396 * EINVAL : A parameter is invalid. 1397 */ 1398 int fd_sess_getsid ( struct session * session, char ** sid ); 1399 1400 /* 1401 * FUNCTION: fd_sess_settimeout 1402 * 1403 * PARAMETERS: 1404 * session : The session for which to set the timeout. 1405 * timeout : The date when the session times out. 1406 * 1407 * DESCRIPTION: 1408 * Set the lifetime for a given session object. This function may be 1409 * called several times on the same object to update the timeout value. 1410 * When the timeout date is reached, the cleanup handler of each 1411 * module that registered data with this session is called, then the 1412 * session is cleared. 1413 * 1414 * There is a possible race condition between cleanup of the session 1415 * and use of its data; applications should ensure that they are not 1416 * using data from a session that is about to expire / expired. 1417 * 1418 * RETURN VALUE: 1419 * 0 : The session timeout has been updated. 1420 * EINVAL : A parameter is invalid. 1421 */ 1422 int fd_sess_settimeout( struct session * session, const struct timespec * timeout ); 1423 1424 /* 1425 * FUNCTION: fd_sess_destroy 1426 * 1427 * PARAMETERS: 1428 * session : Pointer to a session object. 1429 * 1430 * DESCRIPTION: 1431 * Destroys a session an all associated data, if any. 1432 * Equivalent to a session timeout expired, but the effect is immediate. 1433 * 1434 * RETURN VALUE: 1435 * 0 : The session no longer exists. 1436 * EINVAL : A parameter is invalid. 1437 */ 1438 int fd_sess_destroy ( struct session ** session ); 1439 1440 1441 1442 /* 1443 * FUNCTION: fd_sess_state_store 1444 * 1445 * PARAMETERS: 1446 * handler : The handler with which the state is registered. 1447 * session : The session object with which the state is registered. 1448 * state : An application state (opaque data) to store with the session. 1449 * 1450 * DESCRIPTION: 1451 * Stores an application state with a session. This state can later be retrieved 1452 * with fd_sess_state_retrieve, or implicitly in the cleanup handler when the session 1453 * is destroyed. 1454 * 1455 * RETURN VALUE: 1456 * 0 : The state has been stored. 1457 * EINVAL : A parameter is invalid. 1458 * EALREADY : Data was already associated with this session and client. 1459 * ENOMEM : Not enough memory to complete the operation 1460 */ 1461 int fd_sess_state_store ( struct session_handler * handler, struct session * session, session_state ** state ); 1462 1463 /* 1464 * FUNCTION: fd_sess_state_retrieve 1465 * 1466 * PARAMETERS: 1467 * handler : The handler with which the state was registered. 1468 * session : The session object with which the state was registered. 1469 * state : Location where the state must be saved if it is found. 1470 * 1471 * DESCRIPTION: 1472 * Retrieves a state saved by fd_sess_state_store. 1473 * After this function has been called, the state is no longer associated with 1474 * the session. A new call to fd_sess_state_store must be performed in order to 1475 * store again the data with the session. 1476 * 1477 * RETURN VALUE: 1478 * 0 : *state is updated (NULL or points to the state if it was found). 1479 * EINVAL : A parameter is invalid. 1480 */ 1481 int fd_sess_state_retrieve ( struct session_handler * handler, struct session * session, session_state ** state ); 1482 1483 1484 /* For debug */ 1485 void fd_sess_dump(int level, struct session * session); 1486 void fd_sess_dump_hdl(int level, struct session_handler * handler); 1487 1488 1489 /*============================================================*/ 1490 /* DISPATCH */ 1491 /*============================================================*/ 1492 1493 /* The dispatch process consists in passing a message to some handlers 1494 (typically provided by extensions) based on its content (app id, cmd code...) */ 1495 1496 /* The dispatch module has two main roles: 1497 * - help determine if a message can be handled locally (during the routing step) 1498 * - pass the message to the callback(s) that will handle it (during the dispatch step) 1499 * 1500 * These are the possibilities for registering a callback: 1501 * 1502 * -> For All messages. 1503 * This callback is called for all messages that are handled locally. This should be used only 1504 * internally by the daemon, or for debug purpose. 1505 * 1506 * -> by AVP value (constants). 1507 * This callback will be called when a message is received and contains a certain AVP with a specified value. 1508 * 1509 * -> by AVP. 1510 * This callback will be called when the received message contains a certain AVP. 1511 * 1512 * -> by command-code. 1513 * This callback will be called when the message is a specific command. 1514 * 1515 * -> by application. 1516 * This callback will be called when the message has a specific application-id. 1517 * 1518 * ( by vendor: would this be useful? it may be added later) 1519 * 1520 * Note that several criteria may be selected at the same time, for example command-code AND application id. 1521 * 1522 * When a callback is called, it receives the message as parameter, and eventually a pointer to 1523 * the AVP in the message when this is appropriate. 1524 * 1525 * The callback must process the message, and eventually create an answer to it. See the definition 1526 * bellow for more information. 1527 * 1528 * If no callback has handled the message, a default handler will be called with the effect of 1529 * requeuing the message for forwarding on the network to another peer (for requests, if possible), or 1530 * discarding the message (for answers). 1531 */ 1532 1533 1278 1534 1279 1535
Note: See TracChangeset
for help on using the changeset viewer.