Changeset 1093:44f3e48dfe27 in freeDiameter
- Timestamp:
- May 6, 2013, 5:33:22 PM (11 years ago)
- Branch:
- default
- Phase:
- public
- Files:
-
- 15 edited
Legend:
- Unmodified
- Added
- Removed
-
include/freeDiameter/libfdproto.h
r1088 r1093 222 222 223 223 224 /* Helper functions for the *dump functions that add into a buffer */ 225 char * fd_dump_extend(char ** buf, size_t *len, size_t *offset, const char * format, ... ) _ATTRIBUTE_PRINTFLIKE_(4,5); 226 char * fd_dump_extend_hexdump(char ** buf, size_t *len, size_t *offset, uint8_t *data, size_t datalen, size_t trunc, size_t wrap ); 227 228 /* All dump functions follow the same prototype: 229 * PARAMETERS: 230 * buf : *buf can be NULL on entry, it will be malloc'd. Otherwise it can be realloc'd if needed. 224 /* All dump functions follow this same prototype: 225 * PARAMETERS: 226 * buf : *buf can be NULL on entry, it will be malloc'd. Otherwise it is realloc'd if needed. 231 227 * len : the current size of the buffer (in/out) 232 228 * offset: (optional) if provided, starts writing dump at offset in the buffer, and updated upon exit. if NULL, starts at offset O. … … 234 230 * RETURN VALUE: 235 231 * *buf upon success, NULL upon failure. 236 * After the buffer has been used, it should be freed. 232 * 233 * REMARKS: 234 * - After the buffer has been used, it should be freed. 235 * - Depending on the function, the created string may be multi-line. However, it should never be terminated with a '\n'. 237 236 */ 238 237 #define DECLARE_FD_DUMP_PROTOTYPE( function_name, args... ) \ 239 238 char * function_name(char ** buf, size_t *len, size_t *offset, ##args) 240 239 240 241 /* Helper functions for the *dump functions that add into a buffer */ 242 DECLARE_FD_DUMP_PROTOTYPE( fd_dump_extend, const char * format, ... ) _ATTRIBUTE_PRINTFLIKE_(4,5); 243 DECLARE_FD_DUMP_PROTOTYPE( fd_dump_extend_hexdump, uint8_t *data, size_t datalen, size_t trunc, size_t wrap ); 244 245 246 /* Some helpers macro for writing such *_dump routine */ 241 247 #define FD_DUMP_STD_PARAMS buf, len, offset 248 #define FD_DUMP_HANDLE_OFFSET() size_t o = 0; if (!offset) offset = &o 249 #define FD_DUMP_HANDLE_TRAIL() while ((*buf) && (*offset > 0) && ((*buf)[*offset - 1] == '\n')) { *offset -= 1; (*buf)[*offset] = '\0'; } 250 242 251 243 252 … … 1016 1025 VENDOR_BY_ID = 10, /* "what" points to a vendor_id_t */ 1017 1026 VENDOR_BY_NAME, /* "what" points to a char * */ 1018 VENDOR_OF_APPLICATION /* "what" points to a struct dict_object containing an application (see below) */ 1027 VENDOR_OF_APPLICATION, /* "what" points to a struct dict_object containing an application (see below) */ 1028 VENDOR_OF_AVP, /* "what" points to a struct dict_object containing an avp (see below) */ 1019 1029 }; 1020 1030 … … 1405 1415 1406 1416 /* For dumping flags and values */ 1407 #define DUMP_AVPFL_str "%c%c" 1408 #define DUMP_AVPFL_val(_val) (_val & AVP_FLAG_VENDOR)?'V':'-' , (_val & AVP_FLAG_MANDATORY)?'M':'-' 1417 #define DUMP_AVPFL_str "%c%c%s%s%s%s%s%s" 1418 #define DUMP_AVPFL_val(_val) (_val & AVP_FLAG_VENDOR)?'V':'-' , (_val & AVP_FLAG_MANDATORY)?'M':'-', \ 1419 (_val & AVP_FLAG_RESERVED3)?"3":"", (_val & AVP_FLAG_RESERVED4)?"4":"", \ 1420 (_val & AVP_FLAG_RESERVED5)?"5":"", (_val & AVP_FLAG_RESERVED6)?"6":"", (_val & AVP_FLAG_RESERVED7)?"7":"", (_val & AVP_FLAG_RESERVED8)?"8":"" 1409 1421 1410 1422 /* Type to hold data associated to an avp */ … … 1555 1567 1556 1568 /* For dumping flags and values */ 1557 #define DUMP_CMDFL_str "%c%c%c%c" 1558 #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':'-' 1569 #define DUMP_CMDFL_str "%c%c%c%c%s%s%s%s" 1570 #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':'-', \ 1571 (_val & CMD_FLAG_RESERVED5)?"5":"", (_val & CMD_FLAG_RESERVED6)?"6":"", (_val & CMD_FLAG_RESERVED7)?"7":"", (_val & CMD_FLAG_RESERVED8)?"8":"" 1559 1572 1560 1573 /* Type to hold data associated to a command */ -
libfdcore/config.c
r1085 r1093 83 83 DECLARE_FD_DUMP_PROTOTYPE(fd_conf_dump) 84 84 { 85 size_t o=0; 86 if (!offset) 87 offset = &o; 85 FD_DUMP_HANDLE_OFFSET(); 88 86 89 87 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "{freeDiameter configuration}(@%p): \n", fd_g_config), return NULL); -
libfdcore/endpoints.c
r1085 r1093 287 287 DECLARE_FD_DUMP_PROTOTYPE(fd_ep_dump_one, struct fd_endpoint * ep ) 288 288 { 289 size_t o = 0; 290 if (!offset) 291 offset=&o; 289 FD_DUMP_HANDLE_OFFSET(); 292 290 293 291 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "{ep}(@%p): ", ep), return NULL); 294 292 295 293 if (!ep) { 296 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "INVALID/NULL \n"), return NULL);294 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "INVALID/NULL"), return NULL); 297 295 return *buf; 298 296 } … … 311 309 { 312 310 struct fd_list * li; 313 size_t o = 0; 314 if (!offset) 315 offset=&o; 316 317 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "%*s{eps}(@%p):\n", indent, "", eps), return NULL); 311 312 FD_DUMP_HANDLE_OFFSET(); 313 314 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "%*s{eps}(@%p):", indent, "", eps), return NULL); 318 315 if (eps) { 319 316 for (li = eps->next; li != eps; li = li->next) { 320 317 struct fd_endpoint * ep = (struct fd_endpoint *)li; 321 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, " %*s", indent+1, ""), return NULL);318 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "\n%*s", indent+1, ""), return NULL); 322 319 CHECK_MALLOC_DO( fd_ep_dump_one( FD_DUMP_STD_PARAMS, ep ), return NULL); 323 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "\n"), return NULL); 324 } 325 } 326 } 327 320 } 321 } 322 } 323 -
libfdcore/events.c
r1085 r1093 165 165 { 166 166 struct fd_list * li; 167 size_t o=0; 168 if (!offset) 169 offset=&o; 167 FD_DUMP_HANDLE_OFFSET(); 170 168 171 169 CHECK_POSIX_DO( pthread_rwlock_rdlock(&trig_rwl), ); … … 173 171 for (li = trig_list.next; li != &trig_list; li = li->next) { 174 172 struct trig_item *t = li->o; 175 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "{ trigger sig:%d}'%s'->%p ", t->trig_value, t->trig_module, t->cb), break);173 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "{signal:%d}'%s'->%p ", t->trig_value, t->trig_module, t->cb), break); 176 174 } 177 175 -
libfdcore/extensions.c
r1085 r1093 88 88 { 89 89 struct fd_ext_info * ext = (struct fd_ext_info *)li; 90 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "{extension}(@%p): '%s'[%s], %sloaded \n", ext, ext->filename, ext->conffile?:"no conf", ext->handler ? "" : "not"), return NULL);90 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "{extension}(@%p): '%s'[%s], %sloaded%s", ext, ext->filename, ext->conffile?:"no conf", ext->handler ? "" : "not ", (li->next == &ext_list) ? "":"\n"), return NULL); 91 91 } 92 92 return *buf; -
libfdcore/peers.c
r1085 r1093 412 412 DECLARE_FD_DUMP_PROTOTYPE(fd_peer_dump, struct peer_hdr * p, int details) 413 413 { 414 size_t o=0; 415 if (!offset) 416 offset = &o; 414 FD_DUMP_HANDLE_OFFSET(); 417 415 418 416 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "{peer}(@%p): ", p), return NULL); … … 454 452 { 455 453 struct fd_list * li; 456 size_t o=0; 457 if (!offset) 458 offset = &o; 454 FD_DUMP_HANDLE_OFFSET(); 459 455 460 456 CHECK_FCT_DO( pthread_rwlock_rdlock(&fd_g_peers_rw), /* continue */ ); … … 462 458 for (li = fd_g_peers.next; li != &fd_g_peers; li = li->next) { 463 459 CHECK_MALLOC_DO( fd_peer_dump(FD_DUMP_STD_PARAMS, (struct peer_hdr *)li->o, details), break); 464 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "\n"), break); 460 if (li->next != &fd_g_peers) { 461 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "\n"), break); 462 } 465 463 } 466 464 -
libfdcore/server.c
r1085 r1093 97 97 { 98 98 struct fd_list * li, *cli; 99 size_t o=0; 100 if (!offset) 101 offset = &o; 99 100 FD_DUMP_HANDLE_OFFSET(); 102 101 103 102 for (li = FD_SERVERS.next; li != &FD_SERVERS; li = li->next) { … … 105 104 enum s_state st = get_status(s); 106 105 107 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "{server}(@%p)'%s': %s, %s, %s \n", s, fd_cnx_getid(s->conn),106 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "{server}(@%p)'%s': %s, %s, %s", s, fd_cnx_getid(s->conn), 108 107 IPPROTO_NAME( s->proto ), 109 108 s->secur ? "Secur" : "NotSecur", … … 117 116 struct client * c = (struct client *)cli; 118 117 char bufts[128]; 119 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, " {client}(@%p)'%s': to:%s\n", c, fd_cnx_getid(c->conn), fd_log_time(&c->ts, bufts, sizeof(bufts))), break);118 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "\n {client}(@%p)'%s': to:%s", c, fd_cnx_getid(c->conn), fd_log_time(&c->ts, bufts, sizeof(bufts))), break); 120 119 } 121 120 CHECK_POSIX_DO( pthread_mutex_unlock(&s->clients_mtx), ); 121 122 if (li->next != &FD_SERVERS) { 123 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "\n"), return NULL); 124 } 122 125 } 123 126 -
libfdproto/dictionary.c
r1085 r1093 719 719 } 720 720 721 /* For searchs of type "xxx_OF_xxx": if the search object is sentinel list for the "what" object */ 722 #define SEARCH_sentinel( type_of_what, what_list_nr, sentinel_list_nr ) { \ 723 struct dict_object *__what = (struct dict_object *) what; \ 724 CHECK_PARAMS_DO( verify_object(__what) && \ 725 (__what->type == (type_of_what)), \ 726 { ret = EINVAL; goto end; } ); \ 727 ret = 0; \ 728 if (result) { \ 729 /* this is similar to the "container_of" */ \ 730 *result = (struct dict_object *)((char *)(__what->list[what_list_nr].head) - \ 731 (size_t)&(((struct dict_object *)0)->list[sentinel_list_nr])); \ 732 } \ 733 } 734 735 721 736 static int search_vendor ( struct dictionary * dict, int criteria, const void * what, struct dict_object **result ) 722 737 { … … 740 755 /* "what" should be an application object */ 741 756 SEARCH_childs_parent( DICT_APPLICATION, &dict->dict_vendors ); 757 break; 758 759 case VENDOR_OF_AVP: 760 /* "what" should be an avp object */ 761 SEARCH_sentinel( DICT_AVP, 0, 1 ); 742 762 break; 743 763 … … 1248 1268 struct fd_list * li = sentinel; 1249 1269 /* We don't lock here, the caller must have taken the dictionary lock for reading already */ 1250 while (li->next != sentinel) 1251 { 1252 li = li->next; 1253 CHECK_MALLOC_DO( dump_object (FD_DUMP_STD_PARAMS, _O(li->o), parents, depth, indent ), return NULL); 1270 if (FD_IS_LIST_EMPTY(sentinel)) { 1271 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "\n%*s{empty list}", indent, ""), return NULL); 1272 } else { 1273 while (li->next != sentinel) 1274 { 1275 li = li->next; 1276 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "\n"), return NULL); 1277 CHECK_MALLOC_DO( dump_object (FD_DUMP_STD_PARAMS, _O(li->o), parents, depth, indent ), return NULL); 1278 } 1254 1279 } 1255 1280 } … … 1260 1285 1261 1286 if (!verify_object(obj)) { 1262 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "INVALID/NULL \n"), return NULL);1287 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "INVALID/NULL"), return NULL); 1263 1288 return *buf; 1264 1289 } … … 1274 1299 } 1275 1300 1276 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "\n"), return NULL);1277 1278 1301 if (parents) { 1279 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, " %*sparent:", indent + 1, ""), return NULL);1302 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "\n%*sparent:", indent + 1, ""), return NULL); 1280 1303 CHECK_MALLOC_DO( dump_object (FD_DUMP_STD_PARAMS, obj->parent, parents-1, 0, 0 ), return NULL); 1281 1304 } … … 1285 1308 for (i=0; i<NB_LISTS_PER_OBJ; i++) { 1286 1309 if ((obj->list[i].o == NULL) && (obj->list[i].next != &obj->list[i])) { 1287 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "%*slist[%d]:\n", indent + 1, "", i), return NULL);1288 1310 CHECK_MALLOC_DO( dump_list(FD_DUMP_STD_PARAMS, &obj->list[i], 0, depth - 1, indent + 2), return NULL); 1311 break; /* we get duplicate information sorted by another criteria otherwise, which is not very useful */ 1289 1312 } 1290 1313 } … … 1296 1319 DECLARE_FD_DUMP_PROTOTYPE(fd_dict_dump_object, struct dict_object * obj) 1297 1320 { 1298 size_t o = 0; 1299 1300 if (!offset) 1301 offset = &o; 1321 FD_DUMP_HANDLE_OFFSET(); 1302 1322 1303 1323 CHECK_MALLOC_DO( dump_object(FD_DUMP_STD_PARAMS, obj, 1, 2, 0), return NULL); … … 1310 1330 int i; 1311 1331 struct fd_list * li; 1312 size_t o = 0; 1313 1314 if (!offset) 1315 offset = &o; 1332 1333 FD_DUMP_HANDLE_OFFSET(); 1316 1334 1317 1335 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "{dictionary}(@%p): ", dict), return NULL); 1318 1336 1319 1337 if ((dict == NULL) || (dict->dict_eyec != DICT_EYECATCHER)) { 1320 return fd_dump_extend(FD_DUMP_STD_PARAMS, "INVALID/NULL \n");1338 return fd_dump_extend(FD_DUMP_STD_PARAMS, "INVALID/NULL"); 1321 1339 } 1322 1340 1323 1341 CHECK_POSIX_DO( pthread_rwlock_rdlock( &dict->dict_lock ), /* ignore */ ); 1324 1342 1325 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "\n {dict :%p > vendors, AVPs and related rules}\n", dict), goto error);1343 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "\n {dict(%p) : VENDORS / AVP / RULES}\n", dict), goto error); 1326 1344 CHECK_MALLOC_DO( dump_object (FD_DUMP_STD_PARAMS, &dict->dict_vendors, 0, 3, 3 ), goto error); 1327 for (li = dict->dict_vendors.list[0].next; li != &dict->dict_vendors.list[0]; li = li->next) 1345 for (li = dict->dict_vendors.list[0].next; li != &dict->dict_vendors.list[0]; li = li->next) { 1346 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "\n"), return NULL); 1328 1347 CHECK_MALLOC_DO( dump_object (FD_DUMP_STD_PARAMS, li->o, 0, 3, 3 ), goto error); 1329 1330 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, " {dict:%p > applications}\n", dict), goto error); 1348 } 1349 1350 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "\n {dict(%p) : APPLICATIONS}\n", dict), goto error); 1331 1351 CHECK_MALLOC_DO( dump_object (FD_DUMP_STD_PARAMS, &dict->dict_applications, 0, 1, 3 ), goto error); 1332 for (li = dict->dict_applications.list[0].next; li != &dict->dict_applications.list[0]; li = li->next) 1352 for (li = dict->dict_applications.list[0].next; li != &dict->dict_applications.list[0]; li = li->next) { 1353 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "\n"), return NULL); 1333 1354 CHECK_MALLOC_DO( dump_object (FD_DUMP_STD_PARAMS, li->o, 0, 1, 3 ), goto error); 1334 1335 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, " {dict:%p > types}\n", dict), goto error); 1355 } 1356 1357 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "\n {dict(%p) : TYPES / ENUMVAL}", dict), goto error); 1336 1358 CHECK_MALLOC_DO( dump_list(FD_DUMP_STD_PARAMS, &dict->dict_types, 0, 2, 3 ), goto error); 1337 1359 1338 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, " {dict:%p > commands}\n", dict), goto error);1360 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "\n {dict(%p) : COMMANDS / RULES}", dict), goto error); 1339 1361 CHECK_MALLOC_DO( dump_list(FD_DUMP_STD_PARAMS, &dict->dict_cmd_code, 0, 0, 3 ), goto error); 1340 1362 1341 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, " {dict:%p > statistics}\n", dict), goto error);1363 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "\n {dict(%p) : statistics}", dict), goto error); 1342 1364 for (i=1; i<=DICT_TYPE_MAX; i++) 1343 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, " %5d: %s\n", dict->dict_count[i], dict_obj_info[i].name), goto error);1365 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "\n %5d: %s", dict->dict_count[i], dict_obj_info[i].name), goto error); 1344 1366 1345 1367 CHECK_POSIX_DO( pthread_rwlock_unlock( &dict->dict_lock ), /* ignore */ ); … … 1485 1507 char * type_name = NULL; 1486 1508 char * const_name = NULL; 1487 size_t o = 0; 1488 1489 if (!offset) 1490 offset = &o; 1509 1510 FD_DUMP_HANDLE_OFFSET(); 1491 1511 1492 1512 /* Check the parameters are correct */ -
libfdproto/dictionary_functions.c
r1085 r1093 162 162 } s; 163 163 uint16_t fam; 164 size_t o = 0; 165 166 if (!offset) 167 offset = &o; 164 165 FD_DUMP_HANDLE_OFFSET(); 168 166 169 167 memset(&s, 0, sizeof(s)); … … 213 211 DECLARE_FD_DUMP_PROTOTYPE(fd_dictfct_UTF8String_dump, union avp_value * avp_value) 214 212 { 215 size_t o = 0, l; 216 if (!offset) 217 offset = &o; 213 size_t l; 214 FD_DUMP_HANDLE_OFFSET(); 218 215 219 216 l = avp_value->os.len; … … 305 302 DECLARE_FD_DUMP_PROTOTYPE(fd_dictfct_Time_dump, union avp_value * avp_value) 306 303 { 307 size_t o = 0;308 304 time_t val; 309 305 struct tm conv; 310 306 311 if (!offset) 312 offset = &o; 307 FD_DUMP_HANDLE_OFFSET(); 313 308 314 309 if (avp_value->os.len != 4) { -
libfdproto/fifo.c
r1085 r1093 121 121 DECLARE_FD_DUMP_PROTOTYPE(fd_fifo_dump, char * name, struct fifo * queue, fd_fifo_dump_item_cb dump_item) 122 122 { 123 size_t o = 0; 124 if (!offset) 125 offset = &o; 123 FD_DUMP_HANDLE_OFFSET(); 126 124 127 125 if (name) { … … 132 130 133 131 if (!CHECK_FIFO( queue )) { 134 return fd_dump_extend(FD_DUMP_STD_PARAMS, "INVALID/NULL \n");132 return fd_dump_extend(FD_DUMP_STD_PARAMS, "INVALID/NULL"); 135 133 } 136 134 137 135 CHECK_POSIX_DO( pthread_mutex_lock( &queue->mtx ), /* continue */ ); 138 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "items:%d,%d,%d threads:%d,%d stats:%lld/%ld.%06ld,%ld.%06ld,%ld.%06ld thresholds:%d,%d,%d,%p,%p,%p \n",136 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "items:%d,%d,%d threads:%d,%d stats:%lld/%ld.%06ld,%ld.%06ld,%ld.%06ld thresholds:%d,%d,%d,%p,%p,%p", 139 137 queue->count, queue->highest_ever, queue->max, 140 138 queue->thrs, queue->thrs_push, … … 148 146 for (li = queue->list.next; li != &queue->list; li = li->next) { 149 147 struct fifo_item * fi = (struct fifo_item *)li; 150 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, " [#%i](@%p)@%ld.%06ld: ",148 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "\n [#%i](@%p)@%ld.%06ld: ", 151 149 i++, fi->item.o, (long)fi->posted_on.tv_sec,(long)(fi->posted_on.tv_nsec/1000)), 152 150 goto error); … … 155 153 } 156 154 CHECK_POSIX_DO( pthread_mutex_unlock( &queue->mtx ), /* continue */ ); 155 157 156 return *buf; 158 157 error: -
libfdproto/messages.c
r1092 r1093 721 721 /* Debug functions: dumping */ 722 722 723 /* messages and AVP formatters */ 724 typedef DECLARE_FD_DUMP_PROTOTYPE( (*msg_dump_formatter_msg), struct msg * msg ); 725 typedef DECLARE_FD_DUMP_PROTOTYPE( (*msg_dump_formatter_avp), struct avp * avp, int level ); 726 727 /* Core function to process the dumping */ 728 static DECLARE_FD_DUMP_PROTOTYPE( msg_dump_process, msg_dump_formatter_msg msg_format, msg_dump_formatter_avp avp_format, msg_or_avp *obj, struct dictionary *dict, int force_parsing, int recurse ) 729 { 730 FD_DUMP_HANDLE_OFFSET(); 731 732 if (force_parsing) { 733 (void) fd_msg_parse_dict(obj, dict, NULL); 734 } 735 736 switch (_C(obj)->type) { 737 case MSG_AVP: 738 CHECK_MALLOC_DO( (*avp_format)(FD_DUMP_STD_PARAMS, (struct avp *)obj, 0), return NULL); 739 break; 740 741 case MSG_MSG: 742 CHECK_MALLOC_DO( (*msg_format)(FD_DUMP_STD_PARAMS, (struct msg *)obj), return NULL); 743 break; 744 745 default: 746 ASSERT(0); 747 } 748 749 if (recurse) { 750 struct avp * avp = NULL; 751 CHECK_FCT_DO( fd_msg_browse ( obj, MSG_BRW_FIRST_CHILD, &avp, NULL ), avp = NULL ); 752 while (avp) { 753 CHECK_MALLOC_DO( (*avp_format)(FD_DUMP_STD_PARAMS, avp, 1), return NULL); 754 CHECK_FCT_DO( fd_msg_browse ( avp, MSG_BRW_NEXT, &avp, NULL ), avp = NULL ); 755 }; 756 } 757 758 /* we remove the final \n if any */ 759 FD_DUMP_HANDLE_TRAIL(); 760 761 return *buf; 762 } 763 764 /* 765 * Tree View message dump 766 */ 767 768 static DECLARE_FD_DUMP_PROTOTYPE( msg_format_treeview, struct msg * msg ) 769 { 770 if (!CHECK_MSG(msg)) { 771 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "{message}(@%p): INVALID\n", msg), return NULL); 772 return *buf; 773 } 774 775 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "{message}(@%p): ", msg), return NULL); 776 if (!msg->msg_model) { 777 if (msg->msg_model_not_found.mnf_code) { 778 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "(not found in dictionary)\n"), return NULL); 779 } else { 780 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "(not searched in dictionary)\n"), return NULL); 781 } 782 } else { 783 enum dict_object_type dicttype; 784 struct dict_cmd_data dictdata; 785 if (fd_dict_gettype(msg->msg_model, &dicttype) || (dicttype != DICT_COMMAND)) { 786 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "(invalid model information)\n"), return NULL); 787 } else if (fd_dict_getval(msg->msg_model, &dictdata)) { 788 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "(error getting model information)\n"), return NULL); 789 } else { 790 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "'%s'\n", dictdata.cmd_name), return NULL); 791 } 792 } 793 794 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, " Version: 0x%02hhX\n", msg->msg_public.msg_version), return NULL); 795 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, " Length: %d\n", msg->msg_public.msg_length), return NULL); 796 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, " Flags: 0x%02hhX (" DUMP_CMDFL_str ")\n", msg->msg_public.msg_flags, DUMP_CMDFL_val(msg->msg_public.msg_flags)), return NULL); 797 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, " Command Code: %u\n", msg->msg_public.msg_code), return NULL); 798 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, " ApplicationId: %d\n", msg->msg_public.msg_appl), return NULL); 799 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, " Hop-by-Hop Identifier: 0x%8X\n", msg->msg_public.msg_hbhid), return NULL); 800 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, " End-to-End Identifier: 0x%8X\n", msg->msg_public.msg_eteid), return NULL); 801 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, " {debug data}: src:%s(%zd) rwb:%p rt:%d cb:%p,%p(%p) qry:%p asso:%d sess:%p\n", msg->msg_src_id?:"(nil)", msg->msg_src_id_len, msg->msg_rawbuffer, msg->msg_routable, msg->msg_cb.anscb, msg->msg_cb.expirecb, msg->msg_cb.data, msg->msg_query, msg->msg_associated, msg->msg_sess), return NULL); 802 803 return *buf; 804 } 805 806 static DECLARE_FD_DUMP_PROTOTYPE( avp_format_treeview, struct avp * avp, int level ) 807 { 808 char * name; 809 struct dict_avp_data dictdata; 810 struct dict_avp_data *dictinfo = NULL; 811 struct dict_vendor_data vendordata; 812 struct dict_vendor_data *vendorinfo = NULL; 813 if (!CHECK_AVP(avp)) { 814 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "{avp}(@%p): INVALID\n", avp), return NULL); 815 return *buf; 816 } 817 818 if (!level) { 819 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "{avp}(@%p): ", avp), return NULL); 820 } else { 821 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "%*sAVP: ", level * 3, ""), return NULL); 822 } 823 824 if (!avp->avp_model) { 825 if (avp->avp_model_not_found.mnf_code) { 826 name = "(not found in dictionary)"; 827 } else { 828 name = "(not searched in dictionary)"; 829 } 830 } else { 831 enum dict_object_type dicttype; 832 if (fd_dict_gettype(avp->avp_model, &dicttype) || (dicttype != DICT_AVP)) { 833 name = "(invalid model information)"; 834 } else if (fd_dict_getval(avp->avp_model, &dictdata)) { 835 name = "(error getting model information)"; 836 } else { 837 name = dictdata.avp_name; 838 dictinfo = &dictdata; 839 if (avp->avp_public.avp_flags & AVP_FLAG_VENDOR) { 840 struct dictionary * dict; 841 struct dict_object * vendor; 842 if ((!fd_dict_getdict(avp->avp_model, &dict)) 843 && (!fd_dict_search(dict, DICT_VENDOR, VENDOR_OF_AVP, avp->avp_model, &vendor, ENOENT)) 844 && (!fd_dict_getval(vendor, &vendordata))) { 845 vendorinfo = &vendordata; 846 } 847 } 848 } 849 } 850 851 if (dictinfo) { 852 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "'%s'(%u)", name, avp->avp_public.avp_code), return NULL); 853 } else { 854 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "%u%s", avp->avp_public.avp_code, name), return NULL); 855 } 856 857 if (avp->avp_public.avp_flags & AVP_FLAG_VENDOR) { 858 if (vendorinfo) { 859 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, " vend='%s'(%u)", vendorinfo->vendor_name, avp->avp_public.avp_vendor), return NULL); 860 } else { 861 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, " vend=%u", avp->avp_public.avp_vendor), return NULL); 862 } 863 } 864 865 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, " l=%d f=" DUMP_AVPFL_str " val=", avp->avp_public.avp_len, DUMP_AVPFL_val(avp->avp_public.avp_flags)), return NULL); 866 867 if (dictinfo && (dictinfo->avp_basetype == AVP_TYPE_GROUPED)) { 868 struct avp * inavp = NULL; 869 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "(grouped)\n"), return NULL); 870 CHECK_FCT_DO( fd_msg_browse ( avp, MSG_BRW_FIRST_CHILD, &inavp, NULL ), inavp = NULL ); 871 while (inavp) { 872 CHECK_MALLOC_DO( avp_format_treeview(FD_DUMP_STD_PARAMS, inavp, level + 1), return NULL); 873 CHECK_FCT_DO( fd_msg_browse ( inavp, MSG_BRW_NEXT, &inavp, NULL ), inavp = NULL ); 874 }; 875 } else { 876 if (avp->avp_public.avp_value) { 877 CHECK_MALLOC_DO( fd_dict_dump_avp_value(FD_DUMP_STD_PARAMS, avp->avp_public.avp_value, avp->avp_model, 0, 0), return NULL); 878 } else if (avp->avp_rawdata) { 879 CHECK_MALLOC_DO( fd_dump_extend_hexdump(FD_DUMP_STD_PARAMS, avp->avp_rawdata, avp->avp_rawlen, 0, 0), return NULL); 880 } else { 881 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "(not set)"), return NULL); 882 } 883 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "\n"), return NULL); 884 } 885 886 return *buf; 887 } 888 889 /* multi-line human-readable dump similar to wireshark output */ 890 DECLARE_FD_DUMP_PROTOTYPE( fd_msg_dump_treeview, msg_or_avp *obj, struct dictionary *dict, int force_parsing, int recurse ) 891 { 892 return msg_dump_process(FD_DUMP_STD_PARAMS, msg_format_treeview, avp_format_treeview, obj, dict, force_parsing, recurse); 893 } 894 895 723 896 #warning "todo" 724 DECLARE_FD_DUMP_PROTOTYPE( fd_msg_dump_summary, msg_or_avp *obj, struct dictionary *dict, int force_parsing, int recurse )725 {726 return NULL;727 }728 897 /* one-line dump with all the contents of the message */ 729 898 DECLARE_FD_DUMP_PROTOTYPE( fd_msg_dump_full, msg_or_avp *obj, struct dictionary *dict, int force_parsing, int recurse ) … … 731 900 return NULL; 732 901 } 733 /* multi-line human-readable dump similar to wireshark output */ 734 DECLARE_FD_DUMP_PROTOTYPE( fd_msg_dump_treeview, msg_or_avp *obj, struct dictionary *dict, int force_parsing, int recurse ) 902 903 /* This one only prints a short display, does not go into the complete tree */ 904 DECLARE_FD_DUMP_PROTOTYPE( fd_msg_dump_summary, msg_or_avp *obj, struct dictionary *dict, int force_parsing, int recurse ) 735 905 { 736 906 return NULL; -
libfdproto/sessions.c
r1088 r1093 877 877 DECLARE_FD_DUMP_PROTOTYPE(fd_sess_dump, struct session * session, int with_states) 878 878 { 879 size_t o = 0; 880 if (!offset) 881 offset = &o; 879 FD_DUMP_HANDLE_OFFSET(); 882 880 883 881 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "{session}(@%p): ", session), return NULL); 884 882 885 883 if (!VALIDATE_SI(session)) { 886 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "INVALID/NULL \n"), return NULL);884 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "INVALID/NULL"), return NULL); 887 885 } else { 888 886 char timebuf[30]; … … 890 888 891 889 strftime(timebuf, sizeof(timebuf), "%D,%T", localtime_r( &session->timeout.tv_sec , &tm )); 892 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "'%s'(%zd) h:%x m:%d d:%d to:%s.%06ld \n",890 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "'%s'(%zd) h:%x m:%d d:%d to:%s.%06ld", 893 891 session->sid, session->sidlen, session->hash, session->msg_cnt, session->is_destroyed, 894 892 timebuf, session->timeout.tv_nsec/1000), … … 902 900 for (li = session->states.next; li != &session->states; li = li->next) { 903 901 struct state * st = (struct state *)(li->o); 904 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, " {state i:%d}(@%p): \n", st->hdl->id, st), return NULL);902 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "\n {state i:%d}(@%p): ", st->hdl->id, st), return NULL); 905 903 if (st->hdl->state_dump) { 906 904 CHECK_MALLOC_DO( (*st->hdl->state_dump)( FD_DUMP_STD_PARAMS, st->state), 907 fd_dump_extend( FD_DUMP_STD_PARAMS, "[dumper error] \n"));905 fd_dump_extend( FD_DUMP_STD_PARAMS, "[dumper error]")); 908 906 } else { 909 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "<%p> \n", st->state), return NULL);907 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "<%p>", st->state), return NULL); 910 908 } 911 909 } … … 915 913 } 916 914 } 915 917 916 return *buf; 918 917 } … … 920 919 DECLARE_FD_DUMP_PROTOTYPE(fd_sess_dump_hdl, struct session_handler * handler) 921 920 { 922 size_t o = 0; 923 if (!offset) 924 offset = &o; 921 FD_DUMP_HANDLE_OFFSET(); 925 922 926 923 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "{sesshdl}(@%p): ", handler), return NULL); 927 924 928 925 if (!VALIDATE_SH(handler)) { 929 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "INVALID/NULL \n"), return NULL);926 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "INVALID/NULL"), return NULL); 930 927 } else { 931 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "i:%d cl:%p d:%p o:%p \n", handler->id, handler->cleanup, handler->state_dump, handler->opaque), return NULL);928 CHECK_MALLOC_DO( fd_dump_extend( FD_DUMP_STD_PARAMS, "i:%d cl:%p d:%p o:%p", handler->id, handler->cleanup, handler->state_dump, handler->opaque), return NULL); 932 929 } 933 930 return *buf; -
libfdproto/utils.c
r1085 r1093 39 39 { 40 40 char addrbuf[INET6_ADDRSTRLEN]; 41 size_t o = 0; 42 if (!offset) 43 offset = &o; 41 FD_DUMP_HANDLE_OFFSET(); 44 42 45 43 if (sa) { … … 61 59 char addrbuf[INET6_ADDRSTRLEN]; 62 60 char servbuf[32]; 63 size_t o = 0; 64 if (!offset) 65 offset = &o; 61 FD_DUMP_HANDLE_OFFSET(); 66 62 67 63 if (sa) { -
tests/testdict.c
r1088 r1093 204 204 } 205 205 206 LOG_D( "Dictionary at the end of %s: %s", __FILE__, fd_dict_dump(FD_DUMP_TEST_PARAMS, fd_g_config->cnf_dict) ?: "error"); 207 206 208 /* That's all for the tests yet */ 207 209 PASSTEST(); -
tests/testmesg_stress.c
r1090 r1093 374 374 CHECK( 0, fd_msg_bufferize( msg, &buf, NULL ) ); 375 375 376 LOG_D( "Test message: %s", fd_msg_dump_treeview(FD_DUMP_TEST_PARAMS, msg, NULL, 0, 1)); 377 376 378 /* Now free the message, we keep only the buffer. */ 377 379 CHECK( 0, fd_msg_free( msg ) ); … … 390 392 struct timespec start, end; 391 393 392 unsigned char * buf_cpy = NULL;393 394 struct msg * msg; 394 395 395 #define CPYBUF() { \396 buf_cpy = malloc(344); \397 CHECK( buf_cpy ? 1 : 0, 1); \398 memcpy(buf_cpy, buf, 344); \399 }400 396 401 397 /* Create the copies of the message buffer */ … … 404 400 405 401 for (i=0; i < test_parameter; i++) { 406 CPYBUF(); 407 stress_array[i].b = buf_cpy; 408 } 402 stress_array[i].b = malloc(344); 403 if (!stress_array[i].b) 404 break; 405 memcpy(stress_array[i].b, buf, 344); 406 } 407 CHECK( test_parameter, i ); /* if false, a malloc failed */ 409 408 410 409 /* fd_msg_parse_buffer */ … … 414 413 /* Test the msg_parse_buffer function */ 415 414 for (i=0; i < test_parameter; i++) { 416 CHECK( 0, fd_msg_parse_buffer( &stress_array[i].b, 344, &stress_array[i].m) ); 417 } 415 if (0 != fd_msg_parse_buffer( &stress_array[i].b, 344, &stress_array[i].m) ) 416 break; 417 } 418 CHECK( test_parameter, i ); /* if false, a call failed */ 418 419 419 420 CHECK( 0, clock_gettime(CLOCK_REALTIME, &end) ); … … 426 427 /* Test the fd_msg_parse_dict function */ 427 428 for (i=0; i < test_parameter; i++) { 428 CHECK( 0, fd_msg_parse_dict( stress_array[i].m, fd_g_config->cnf_dict, NULL ) ); 429 } 429 if (0 != fd_msg_parse_dict( stress_array[i].m, fd_g_config->cnf_dict, NULL ) ) 430 break; 431 } 432 CHECK( test_parameter, i ); /* if false, a call failed */ 430 433 431 434 CHECK( 0, clock_gettime(CLOCK_REALTIME, &end) ); … … 439 442 /* Test the fd_msg_parse_rules function */ 440 443 for (i=0; i < test_parameter; i++) { 441 CHECK( 0, fd_msg_parse_rules( stress_array[i].m, fd_g_config->cnf_dict, NULL ) ); 442 } 444 if (0 != fd_msg_parse_rules( stress_array[i].m, fd_g_config->cnf_dict, NULL ) ) 445 break; 446 } 447 CHECK( test_parameter, i ); /* if false, a call failed */ 443 448 444 449 CHECK( 0, clock_gettime(CLOCK_REALTIME, &end) ); … … 452 457 /* Test the fd_msg_new_answer_from_req function */ 453 458 for (i=0; i < test_parameter; i++) { 454 CHECK( 0, fd_msg_new_answer_from_req( fd_g_config->cnf_dict, &stress_array[i].m, 0 ) ); 455 } 459 if (0 != fd_msg_new_answer_from_req( fd_g_config->cnf_dict, &stress_array[i].m, 0 ) ) 460 break; 461 } 462 CHECK( test_parameter, i ); /* if false, a call failed */ 456 463 457 464 CHECK( 0, clock_gettime(CLOCK_REALTIME, &end) ); … … 461 468 for (i=0; i < test_parameter; i++) { 462 469 struct msg * ans = stress_array[i].m; 463 CHECK( 0, fd_msg_answ_getq( ans, &stress_array[i].m ) ); 464 CHECK( 0, fd_msg_answ_detach( ans ) ); 470 if (0 != fd_msg_answ_getq( ans, &stress_array[i].m ) ) 471 break; 472 if (0 != fd_msg_answ_detach( ans ) ) 473 break; 465 474 fd_msg_free( ans ); 466 475 } 476 CHECK( test_parameter, i ); /* if false, a call failed */ 467 477 468 478 … … 473 483 /* Test the fd_msg_new_answer_from_req function */ 474 484 for (i=0; i < test_parameter; i++) { 475 CHECK( 0, fd_msg_new_answer_from_req( fd_g_config->cnf_dict, &stress_array[i].m, MSGFL_ANSW_ERROR ) ); 476 } 485 if ( 0 != fd_msg_new_answer_from_req( fd_g_config->cnf_dict, &stress_array[i].m, MSGFL_ANSW_ERROR ) ) 486 break; 487 } 488 CHECK( test_parameter, i ); /* if false, a call failed */ 477 489 478 490 CHECK( 0, clock_gettime(CLOCK_REALTIME, &end) ); … … 482 494 for (i=0; i < test_parameter; i++) { 483 495 struct msg * ans = stress_array[i].m; 484 CHECK( 0, fd_msg_answ_getq( ans, &stress_array[i].m ) ); 485 CHECK( 0, fd_msg_answ_detach( ans ) ); 496 if (0 != fd_msg_answ_getq( ans, &stress_array[i].m ) ) 497 break; 498 if (0 != fd_msg_answ_detach( ans ) ) 499 break; 486 500 fd_msg_free( ans ); 487 501 } … … 496 510 for (i=0; i < test_parameter; i++) { 497 511 size_t len = 0; 498 CHECK( 0, fd_msg_bufferize( stress_array[i].m, &stress_array[i].b, &len ) ); 499 } 512 if (0 != fd_msg_bufferize( stress_array[i].m, &stress_array[i].b, &len ) ) 513 break; 514 } 515 CHECK( test_parameter, i ); /* if false, a call failed */ 500 516 501 517 CHECK( 0, clock_gettime(CLOCK_REALTIME, &end) );
Note: See TracChangeset
for help on using the changeset viewer.