Changeset 156:e2dc300819b3 in freeDiameter
- Timestamp:
- Jan 20, 2010, 4:04:25 PM (14 years ago)
- Branch:
- default
- Phase:
- public
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
freeDiameter/cnxctx.c
r155 r156 1258 1258 #ifndef DISABLE_SCTP 1259 1259 if (conn->cc_sctp_para.pairs > 1) { 1260 /* Master session */1260 /* Bye on master session */ 1261 1261 CHECK_GNUTLS_DO( gnutls_bye(conn->cc_tls_para.session, GNUTLS_SHUT_WR), /* Continue */ ); 1262 1262 -
freeDiameter/dict_base_proto.c
r119 r156 144 144 } 145 145 146 static void Address_dump(union avp_value * avp_value) 147 { 148 fd_log_debug("*todo: dump address*"); 149 } 150 151 static void UTF8String_dump(union avp_value * avp_value) 152 { 153 size_t len = avp_value->os.len; 154 if (len > 42) 155 len = 42; /* avoid very long strings */ 156 fd_log_debug("%.*s", len, avp_value->os.data); 157 } 158 159 146 160 147 161 … … 231 245 the content and format of the remaining octets. 232 246 */ 233 struct dict_type_data data = { AVP_TYPE_OCTETSTRING, "Address" , Address_interpret , Address_encode };247 struct dict_type_data data = { AVP_TYPE_OCTETSTRING, "Address" , Address_interpret , Address_encode, Address_dump }; 234 248 CHECK_dict_new( DICT_TYPE, &data , NULL, NULL); 235 249 } … … 250 264 This procedure MUST be supported by all DIAMETER nodes. 251 265 */ 252 struct dict_type_data data = { AVP_TYPE_OCTETSTRING, "Time" , NULL , NULL };266 struct dict_type_data data = { AVP_TYPE_OCTETSTRING, "Time" , NULL , NULL , NULL }; 253 267 CHECK_dict_new( DICT_TYPE, &data , NULL, NULL); 254 268 } … … 288 302 octets, not characters. 289 303 */ 290 struct dict_type_data data = { AVP_TYPE_OCTETSTRING, "UTF8String" , NULL , NULL 304 struct dict_type_data data = { AVP_TYPE_OCTETSTRING, "UTF8String" , NULL , NULL , UTF8String_dump }; 291 305 CHECK_dict_new( DICT_TYPE, &data , NULL, NULL); 292 306 } … … 317 331 Domain Name (IDNs). 318 332 */ 319 struct dict_type_data data = { AVP_TYPE_OCTETSTRING, "DiameterIdentity" , NULL , NULL };333 struct dict_type_data data = { AVP_TYPE_OCTETSTRING, "DiameterIdentity" , NULL , NULL , UTF8String_dump }; 320 334 CHECK_dict_new( DICT_TYPE, &data , NULL, NULL); 321 335 } … … 372 386 aaa://host.example.com:1813;transport=udp;protocol=radius 373 387 */ 374 struct dict_type_data data = { AVP_TYPE_OCTETSTRING, "DiameterURI" , NULL , NULL };388 struct dict_type_data data = { AVP_TYPE_OCTETSTRING, "DiameterURI" , NULL , NULL , UTF8String_dump }; 375 389 CHECK_dict_new( DICT_TYPE, &data , NULL, NULL); 376 390 } … … 434 448 infrastructure. 435 449 */ 436 struct dict_type_data data = { AVP_TYPE_OCTETSTRING, "IPFilterRule" , NULL , NULL };450 struct dict_type_data data = { AVP_TYPE_OCTETSTRING, "IPFilterRule" , NULL , NULL , UTF8String_dump }; 437 451 CHECK_dict_new( DICT_TYPE, &data , NULL, NULL); 438 452 } … … 604 618 */ 605 619 struct dict_object * type; 606 struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Disconnect-Cause)" , NULL, NULL };620 struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Disconnect-Cause)" , NULL, NULL, NULL }; 607 621 struct dict_enumval_data t_0 = { "REBOOTING", { .i32 = 0 }}; 608 622 struct dict_enumval_data t_1 = { "BUSY", { .i32 = 1 }}; … … 909 923 910 924 struct dict_object * type; 911 struct dict_type_data tdata = { AVP_TYPE_UNSIGNED32, "Enumerated*(Inband-Security-Id)" , NULL, NULL };925 struct dict_type_data tdata = { AVP_TYPE_UNSIGNED32, "Enumerated*(Inband-Security-Id)" , NULL, NULL, NULL }; 912 926 struct dict_enumval_data t_0 = { "NO_INBAND_SECURITY", { .u32 = ACV_ISI_NO_INBAND_SECURITY }}; 913 927 struct dict_enumval_data t_1 = { "TLS", { .u32 = ACV_ISI_TLS }}; … … 1103 1117 */ 1104 1118 struct dict_object * type; 1105 struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Redirect-Host-Usage)" , NULL, NULL };1119 struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Redirect-Host-Usage)" , NULL, NULL, NULL }; 1106 1120 struct dict_enumval_data t_0 = { "DONT_CACHE", { .i32 = 0 }}; 1107 1121 struct dict_enumval_data t_1 = { "ALL_SESSION", { .i32 = 1 }}; … … 1197 1211 */ 1198 1212 struct dict_object * type; 1199 struct dict_type_data tdata = { AVP_TYPE_UNSIGNED32, "Enumerated*(Result-Code)" , NULL, NULL };1213 struct dict_type_data tdata = { AVP_TYPE_UNSIGNED32, "Enumerated*(Result-Code)" , NULL, NULL, NULL }; 1200 1214 struct dict_avp_data data = { 1201 1215 268, /* Code */ … … 1796 1810 */ 1797 1811 struct dict_object * type; 1798 struct dict_type_data tdata = { AVP_TYPE_UNSIGNED32, "Enumerated*(Experimental-Result-Code)" , NULL, NULL };1812 struct dict_type_data tdata = { AVP_TYPE_UNSIGNED32, "Enumerated*(Experimental-Result-Code)" , NULL, NULL, NULL }; 1799 1813 struct dict_avp_data data = { 1800 1814 298, /* Code */ … … 1843 1857 */ 1844 1858 struct dict_object * type; 1845 struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Auth-Request-Type)" , NULL, NULL };1859 struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Auth-Request-Type)" , NULL, NULL, NULL }; 1846 1860 struct dict_enumval_data t_1 = { "AUTHENTICATE_ONLY", { .i32 = 1 }}; 1847 1861 struct dict_enumval_data t_2 = { "AUTHORIZE_ONLY", { .i32 = 2 }}; … … 1985 1999 */ 1986 2000 struct dict_object * type; 1987 struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Auth-Session-State)" , NULL, NULL };2001 struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Auth-Session-State)" , NULL, NULL, NULL }; 1988 2002 struct dict_enumval_data t_0 = { "STATE_MAINTAINED", { .i32 = 0 }}; 1989 2003 struct dict_enumval_data t_1 = { "NO_STATE_MAINTAINED", { .i32 = 1 }}; … … 2028 2042 */ 2029 2043 struct dict_object * type; 2030 struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Re-Auth-Request-Type)" , NULL, NULL };2044 struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Re-Auth-Request-Type)" , NULL, NULL, NULL }; 2031 2045 struct dict_enumval_data t_0 = { "AUTHORIZE_ONLY", { .i32 = 0 }}; 2032 2046 struct dict_enumval_data t_1 = { "AUTHORIZE_AUTHENTICATE", { .i32 = 1 }}; … … 2155 2169 */ 2156 2170 struct dict_object * type; 2157 struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Termination-Cause)" , NULL, NULL };2171 struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Termination-Cause)" , NULL, NULL, NULL }; 2158 2172 struct dict_enumval_data t_1 = { "DIAMETER_LOGOUT", { .i32 = 1 }}; 2159 2173 struct dict_enumval_data t_2 = { "DIAMETER_SERVICE_NOT_PROVIDED", { .i32 = 2 }}; … … 2267 2281 2268 2282 struct dict_object * type; 2269 struct dict_type_data tdata = { AVP_TYPE_UNSIGNED32, "Enumerated*(Session-Binding)" , NULL, NULL };2283 struct dict_type_data tdata = { AVP_TYPE_UNSIGNED32, "Enumerated*(Session-Binding)" , NULL, NULL, NULL }; 2270 2284 struct dict_enumval_data t_1 = { "RE_AUTH", { .u32 = 1 }}; 2271 2285 struct dict_enumval_data t_2 = { "STR", { .u32 = 2 }}; … … 2329 2343 */ 2330 2344 struct dict_object * type; 2331 struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Session-Server-Failover)" , NULL, NULL };2345 struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Session-Server-Failover)" , NULL, NULL, NULL }; 2332 2346 struct dict_enumval_data t_0 = { "REFUSE_SERVICE", { .i32 = 0 }}; 2333 2347 struct dict_enumval_data t_1 = { "TRY_AGAIN", { .i32 = 1 }}; … … 2461 2475 */ 2462 2476 struct dict_object * type; 2463 struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Accounting-Record-Type)" , NULL, NULL };2477 struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Accounting-Record-Type)" , NULL, NULL, NULL }; 2464 2478 struct dict_enumval_data t_1 = { "EVENT_RECORD", { .i32 = 1 }}; 2465 2479 struct dict_enumval_data t_2 = { "START_RECORD", { .i32 = 2 }}; … … 2655 2669 */ 2656 2670 struct dict_object * type; 2657 struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Accounting-Realtime-Required)" , NULL, NULL };2671 struct dict_type_data tdata = { AVP_TYPE_INTEGER32, "Enumerated(Accounting-Realtime-Required)" , NULL, NULL, NULL }; 2658 2672 struct dict_enumval_data t_1 = { "DELIVER_AND_GRANT", { .i32 = 1 }}; 2659 2673 struct dict_enumval_data t_2 = { "GRANT_AND_STORE", { .i32 = 2 }}; -
freeDiameter/sctps.c
r155 r156 91 91 case FDEVP_CNX_MSG_RECV: 92 92 /* Demux this message in the appropriate fifo, another thread will pull, gnutls process, and send in target queue */ 93 CHECK_FCT_DO(fd_event_send(conn->cc_sctps_data.array[strid].raw_recv, event, bufsz, buf), goto error ); 93 if (strid < conn->cc_sctp_para.pairs) { 94 CHECK_FCT_DO(fd_event_send(conn->cc_sctps_data.array[strid].raw_recv, event, bufsz, buf), goto error ); 95 } else { 96 TRACE_DEBUG(INFO, "Received packet (%d bytes) on out-of-range stream #%s from %s, discarded.", bufsz, strid, conn->cc_remid); 97 free(buf); 98 } 94 99 break; 95 100 … … 113 118 CHECK_FCT_DO( fd_event_send( Target_Queue(conn), FDEVP_CNX_ERROR, 0, NULL), /* continue or destroy everything? */); 114 119 } 120 121 /* Since the demux thread terminates, we must trig an error for all decipher threads. We do this by destroying all demuxed FIFO queues */ 122 for (strid = 0; strid < conn->cc_sctp_para.pairs; strid++) { 123 fd_event_destroy( &conn->cc_sctps_data.array[strid].raw_recv, free ); 124 } 125 115 126 goto out; 116 127 } … … 583 594 } 584 595 585 static void * bye_th(void * arg) 586 { 587 struct sctps_ctx * ctx = (struct sctps_ctx *) arg; 588 TRACE_ENTRY("%p", arg); 589 590 /* Set the thread name */ 591 { 592 char buf[48]; 593 snprintf(buf, sizeof(buf), "gnutls_bye (%hu@%d)", ctx->strid, ctx->parent->cc_socket); 594 fd_log_threadname ( buf ); 595 } 596 597 CHECK_GNUTLS_DO( gnutls_bye(ctx->session, GNUTLS_SHUT_WR), /* Continue */ ); 598 599 /* Finish */ 600 return NULL; 601 } 602 603 /* Initiate a "bye" on all stream pairs in paralel */ 596 /* Initiate a "bye" on all stream pairs */ 604 597 void fd_sctps_bye(struct cnxctx * conn) 605 598 { … … 608 601 CHECK_PARAMS_DO( conn && conn->cc_sctps_data.array, return ); 609 602 610 /* End all TLS sessions, in parallel*/603 /* End all TLS sessions, in series (not as efficient as paralel, but simpler) */ 611 604 for (i = 1; i < conn->cc_sctp_para.pairs; i++) { 612 CHECK_POSIX_DO( pthread_create( &conn->cc_sctps_data.array[i].thr, NULL, bye_th, &conn->cc_sctps_data.array[i] ), break ); 613 } 614 for (--i; i > 0; --i) { 615 CHECK_POSIX_DO( pthread_join( conn->cc_sctps_data.array[i].thr, NULL ), continue ); 605 CHECK_GNUTLS_DO( gnutls_bye(conn->cc_sctps_data.array[i].session, GNUTLS_SHUT_WR), /* Continue */ ); 616 606 } 617 607 } … … 677 667 /* Free remaining data in the array */ 678 668 for (i = 0; i < conn->cc_sctp_para.pairs; i++) { 679 fd_event_destroy( &conn->cc_sctps_data.array[i].raw_recv, free ); 669 if (conn->cc_sctps_data.array[i].raw_recv) 670 fd_event_destroy( &conn->cc_sctps_data.array[i].raw_recv, free ); 680 671 free(conn->cc_sctps_data.array[i].partial.buf); 681 672 if (i > 0) -
include/freeDiameter/libfreeDiameter.h
r137 r156 666 666 void fd_dict_dump(struct dictionary * dict); 667 667 668 669 668 /* 670 669 *************************************************************************** … … 895 894 dict_avpdata_interpret type_interpret;/* cb to convert the AVP value in more comprehensive format (or NULL) */ 896 895 dict_avpdata_encode type_encode; /* cb to convert formatted data into an AVP value (or NULL) */ 896 void (*type_dump)(union avp_value * val); /* cb called by fd_msg_dump_one for this type of data (if != NULL) */ 897 897 }; 898 898 -
libfreeDiameter/dictionary.c
r111 r156 1284 1284 } 1285 1285 1286 /**************************** Dump AVP values ********************************/ 1287 1288 /* Default dump functions */ 1289 static void dump_val_os(union avp_value * value) 1290 { 1291 int i; 1292 for (i = 0; i < value->os.len; i++) { 1293 if (i == 16) { /* Dump only up to 16 bytes of the buffer */ 1294 fd_log_debug("(trunc, len=%zd)", value->os.len); 1295 break; 1296 } 1297 fd_log_debug("%02.2X ", value->os.data[i]); 1298 } 1299 } 1300 1301 static void dump_val_i32(union avp_value * value) 1302 { 1303 fd_log_debug("%i", value->i32); 1304 } 1305 1306 static void dump_val_i64(union avp_value * value) 1307 { 1308 fd_log_debug("%lli (0x%llx)", value->i64, value->i64); 1309 } 1310 1311 static void dump_val_u32(union avp_value * value) 1312 { 1313 fd_log_debug("%u", value->u32); 1314 } 1315 1316 static void dump_val_u64(union avp_value * value) 1317 { 1318 fd_log_debug("%llu", value->u64); 1319 } 1320 1321 static void dump_val_f32(union avp_value * value) 1322 { 1323 fd_log_debug("%f", value->f32); 1324 } 1325 1326 static void dump_val_f64(union avp_value * value) 1327 { 1328 fd_log_debug("%g", value->f64); 1329 } 1330 1331 /* Get the dump function for basic dict_avp_basetype */ 1332 static void (*get_default_dump_val_cb(enum dict_avp_basetype datatype))(union avp_value *) 1333 { 1334 switch (datatype) { 1335 case AVP_TYPE_OCTETSTRING: 1336 return &dump_val_os; 1337 1338 case AVP_TYPE_INTEGER32: 1339 return &dump_val_i32; 1340 1341 case AVP_TYPE_INTEGER64: 1342 return &dump_val_i64; 1343 1344 case AVP_TYPE_UNSIGNED32: 1345 return &dump_val_u32; 1346 1347 case AVP_TYPE_UNSIGNED64: 1348 return &dump_val_u64; 1349 1350 case AVP_TYPE_FLOAT32: 1351 return &dump_val_f32; 1352 1353 case AVP_TYPE_FLOAT64: 1354 return &dump_val_f64; 1355 1356 case AVP_TYPE_GROUPED: 1357 TRACE_DEBUG(FULL, "error: grouped AVP with a value!"); 1358 } 1359 return NULL; 1360 } 1361 1362 /* indent inside an object (duplicate from messages.c) */ 1363 #define INOBJHDR "%*s " 1364 #define INOBJHDRVAL indent<0 ? 1 : indent, indent<0 ? "-" : "|" 1365 1366 /* Formater for the AVP value dump line */ 1367 static void dump_avp_val(union avp_value *avp_value, void (*dump_val_cb)(union avp_value *avp_value), enum dict_avp_basetype datatype, char * type_name, char * const_name, int indent) 1368 { 1369 /* Header for all AVP values dumps: */ 1370 fd_log_debug(INOBJHDR "value ", INOBJHDRVAL); 1371 1372 /* If the type is provided, write it */ 1373 if (type_name) 1374 fd_log_debug("t: '%s' ", type_name); 1375 1376 /* Always give the base datatype anyway */ 1377 fd_log_debug("(%s) ", type_base_name[datatype]); 1378 1379 /* Now, the value */ 1380 fd_log_debug("v: "); 1381 if (const_name) 1382 fd_log_debug("'%s' (", const_name); 1383 (*dump_val_cb)(avp_value); 1384 if (const_name) 1385 fd_log_debug(")"); 1386 1387 /* Done! */ 1388 fd_log_debug("\n"); 1389 } 1390 1391 /* Dump the value of an AVP of known type */ 1392 void fd_dict_dump_avp_value(union avp_value *avp_value, struct dict_object * model, int indent) 1393 { 1394 void (*dump_val_cb)(union avp_value *avp_value); 1395 struct dict_object * type = NULL; 1396 char * type_name = NULL; 1397 char * const_name = NULL; 1398 1399 /* Check the parameters are correct */ 1400 CHECK_PARAMS_DO( avp_value && verify_object(model) && (model->type == DICT_AVP), return ); 1401 1402 /* Default: display the value with the formatter for the AVP datatype */ 1403 CHECK_PARAMS_DO( dump_val_cb = get_default_dump_val_cb(model->data.avp.avp_basetype), return ); 1404 1405 /* Get the type definition of this AVP */ 1406 type = model->parent; 1407 if (type) { 1408 struct dict_enumval_request request; 1409 struct dict_object * enumval = NULL; 1410 1411 type_name = type->data.type.type_name; 1412 1413 /* overwrite the dump function ? */ 1414 if (type->data.type.type_dump) 1415 dump_val_cb = type->data.type.type_dump; 1416 1417 /* Now check if the AVP value matches a constant */ 1418 memset(&request, 0, sizeof(request)); 1419 request.type_obj = type; 1420 memcpy(&request.search.enum_value, avp_value, sizeof(union avp_value)); 1421 /* bypass checks */ 1422 if ((search_enumval( type->dico, ENUMVAL_BY_STRUCT, &request, &enumval ) == 0) && (enumval)) { 1423 /* We found a cosntant, get its name */ 1424 const_name = enumval->data.enumval.enum_name; 1425 } 1426 } 1427 1428 /* And finally, dump the value */ 1429 dump_avp_val(avp_value, dump_val_cb, model->data.avp.avp_basetype, type_name, const_name, indent); 1430 } 1431 1286 1432 /*******************************************************************************************************/ 1287 1433 /*******************************************************************************************************/ -
libfreeDiameter/fifo.c
r139 r156 159 159 q->eyec = 0xdead; 160 160 161 /* Have all waiting threads return an error */ 161 162 while (q->thrs) { 162 163 CHECK_POSIX( pthread_mutex_unlock( &q->mtx )); -
libfreeDiameter/libfD.h
r85 r156 52 52 /* Dispatch / messages / dictionary API */ 53 53 int fd_dict_disp_cb(enum dict_object_type type, struct dict_object *obj, struct fd_list ** cb_list); 54 void fd_dict_dump_avp_value(union avp_value *avp_value, struct dict_object * model, int indent); 54 55 int fd_disp_call_cb_int( struct fd_list * cb_list, struct msg ** msg, struct avp *avp, struct session *sess, enum disp_action *action, 55 56 struct dict_object * obj_app, struct dict_object * obj_cmd, struct dict_object * obj_avp, struct dict_object * obj_enu); -
libfreeDiameter/messages.c
r132 r156 691 691 } 692 692 693 #define DUMP_VALUE(_format, _parms...) fd_log_debug(INOBJHDR "value : t:'%s' v:'" _format "'\n", INOBJHDRVAL, typename, ## _parms);694 /* Dump an AVP value that is not a constant */695 static void dump_basic_type(union avp_value * value, enum dict_avp_basetype type, const char * typename, int indent)696 {697 switch (type) {698 case AVP_TYPE_GROUPED:699 DUMP_VALUE("%s", "error: grouped AVP with a value!");700 break;701 702 case AVP_TYPE_OCTETSTRING:703 {704 /* Dump only up to 16 bytes of the buffer */705 unsigned char buf[8];706 memset(buf, 0, sizeof(buf));707 memcpy(buf, value->os.data, value->os.len < sizeof(buf) ? value->os.len : sizeof(buf) );708 DUMP_VALUE("l:%d, v:%02.2X %02.2X %02.2X %02.2X %02.2X %02.2X %02.2X %02.2X ... ('%.*s')",709 value->os.len,710 buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7],711 value->os.len, value->os.data712 );713 }714 break;715 716 case AVP_TYPE_INTEGER32:717 DUMP_VALUE("%i",value->i32);718 break;719 720 case AVP_TYPE_INTEGER64:721 DUMP_VALUE("%lli (0x%llx)",value->i64,value->i64);722 break;723 724 case AVP_TYPE_UNSIGNED32:725 DUMP_VALUE("%u",value->u32);726 break;727 728 case AVP_TYPE_UNSIGNED64:729 DUMP_VALUE("%llu",value->u64);730 break;731 732 case AVP_TYPE_FLOAT32:733 DUMP_VALUE("%f",value->f32);734 break;735 736 case AVP_TYPE_FLOAT64:737 DUMP_VALUE("%g",value->f64);738 break;739 740 default:741 DUMP_VALUE("%s %d", "error: invalid type :", type);742 }743 }744 745 /* Dump an AVP value that is a constant */746 #define DUMP_CONST(_format, _parms...) fd_log_debug(INOBJHDR "value : t:'%s' v:'%s' ( " _format " )\n", INOBJHDRVAL, typename, value->enum_name, ## _parms);747 static void dump_constant_type(struct dict_enumval_data * value, enum dict_avp_basetype type, char * typename, int indent)748 {749 switch (type) {750 case AVP_TYPE_GROUPED:751 DUMP_CONST("%s", "error: grouped AVP with a constant value!");752 break;753 case AVP_TYPE_OCTETSTRING:754 DUMP_CONST("%s", "value skipped");755 break;756 757 case AVP_TYPE_INTEGER32:758 DUMP_CONST("%i",value->enum_value.i32);759 break;760 761 case AVP_TYPE_INTEGER64:762 DUMP_CONST("%li",value->enum_value.i64);763 break;764 765 case AVP_TYPE_UNSIGNED32:766 DUMP_CONST("%u",value->enum_value.u32);767 break;768 769 case AVP_TYPE_UNSIGNED64:770 DUMP_CONST("%lu",value->enum_value.u64);771 break;772 773 case AVP_TYPE_FLOAT32:774 DUMP_CONST("%f",value->enum_value.f32);775 break;776 777 case AVP_TYPE_FLOAT64:778 DUMP_CONST("%g",value->enum_value.f64);779 break;780 781 default:782 DUMP_CONST("%s %d", "error: invalid type :", type);783 }784 }785 786 693 /* Dump an avp object */ 787 694 static void obj_dump_avp ( struct avp * avp, int indent ) … … 834 741 fd_log_debug(INOBJHDR "(data set but no model: ERROR)\n", INOBJHDRVAL); 835 742 } else { 836 /* Try and find a constant name for this value */ 837 struct dictionary * dict = NULL; 838 struct dict_object * avp_type = NULL; 839 struct dict_object * avp_constant = NULL; 840 struct dict_type_data type_data; 841 struct dict_enumval_request request; 842 ret = fd_dict_getdict(avp->avp_model, & dict); 843 if (ret != 0) { 844 dump_basic_type(avp->avp_public.avp_value, type, type_base_name[type], indent); 845 goto end; 846 } 847 ret = fd_dict_search(dict, DICT_TYPE, TYPE_OF_AVP, avp->avp_model, &avp_type, ENOENT); 848 if (ret != 0) { 849 dump_basic_type(avp->avp_public.avp_value, type, type_base_name[type], indent); 850 goto end; 851 } 852 ret = fd_dict_getval(avp_type, &type_data); 853 if (ret != 0) { 854 dump_basic_type(avp->avp_public.avp_value, type, "(error getting type data)", indent); 855 goto end; 856 } 857 if (type_data.type_base != type) { 858 dump_basic_type(avp->avp_public.avp_value, type, "(mismatching type information!)", indent); 859 goto end; 860 } 861 /* Create a query for a constant */ 862 memset(&request, 0, sizeof(request)); 863 request.type_obj = avp_type; 864 memcpy(&request.search.enum_value, avp->avp_public.avp_value, sizeof(union avp_value)); 865 ret = fd_dict_search(dict, DICT_ENUMVAL, ENUMVAL_BY_STRUCT, &request, &avp_constant, ENOENT); 866 if (ret != 0) { 867 dump_basic_type(avp->avp_public.avp_value, type, type_data.type_name, indent); 868 goto end; 869 } 870 /* get the constant's information; we re-use request.search field */ 871 ret = fd_dict_getval(avp_constant, &request.search); 872 if (ret != 0) { 873 dump_basic_type(avp->avp_public.avp_value, type, "(error getting constant data)", indent); 874 goto end; 875 } 876 dump_constant_type(&request.search, type, type_data.type_name, indent); 743 fd_dict_dump_avp_value(avp->avp_public.avp_value, avp->avp_model, indent); 877 744 } 878 745 }
Note: See TracChangeset
for help on using the changeset viewer.