Changeset 1036:aecdc2fbf222 in freeDiameter for libfdproto
- Timestamp:
- Apr 17, 2013, 1:53:51 AM (11 years ago)
- Branch:
- default
- Phase:
- public
- Location:
- libfdproto
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
libfdproto/dictionary.c
r1030 r1036 1180 1180 n = enumval->enum_value.os.len; 1181 1181 for (i=0; i < n; i++) 1182 fd_log_debug("0x%02 hhX/'%c' ", enumval->enum_value.os.data[i], ASCII(enumval->enum_value.os.data[i]));1182 fd_log_debug("0x%02.2X/'%c' ", enumval->enum_value.os.data[i], ASCII(enumval->enum_value.os.data[i])); 1183 1183 if (n == LEN_MAX) 1184 1184 fd_log_debug("..."); … … 1343 1343 { 1344 1344 int i; 1345 CHECK_FCT( dump_add_str(outstr, offset, outlen, "<") ); 1345 1346 for (i = 0; i < value->os.len; i++) { 1346 if (i == 24) { /* Dump only up to24 bytes of the buffer */1347 if (i == 1024) { /* Dump only up to 1024 bytes of the buffer */ 1347 1348 CHECK_FCT( dump_add_str(outstr, offset, outlen, "[...] (len=%zd)", value->os.len) ); 1348 1349 break; 1349 1350 } 1350 CHECK_FCT( dump_add_str(outstr, offset, outlen, "%02.2X ", value->os.data[i]) ); 1351 } 1351 CHECK_FCT( dump_add_str(outstr, offset, outlen, "%s%02.2X", (i==0 ? "" : " "), value->os.data[i]) ); 1352 } 1353 CHECK_FCT( dump_add_str(outstr, offset, outlen, ">") ); 1352 1354 return 0; 1353 1355 } … … 1424 1426 #define INOBJHDRVAL indent<0 ? 1 : indent, indent<0 ? "-" : "|" 1425 1427 1426 /* Format er for the AVP value dump line */1428 /* Formatter for the AVP value dump line */ 1427 1429 static int dump_avp_val(union avp_value *avp_value, 1428 1430 int (*def_dump_val_cb)(union avp_value *, char **, size_t *, size_t *), … … 1434 1436 char **outstr, 1435 1437 size_t *offset, 1436 size_t *outlen) 1437 { 1438 /* Header for all AVP values dumps: */ 1439 CHECK_FCT( dump_add_str(outstr, offset, outlen, INOBJHDR "value ", INOBJHDRVAL) ); 1440 1441 /* If the type is provided, write it */ 1442 if (type_name) { 1443 CHECK_FCT( dump_add_str(outstr, offset, outlen, "t: '%s' ", type_name) ); 1444 } 1445 1446 /* Always give the base datatype anyway */ 1447 CHECK_FCT( dump_add_str(outstr, offset, outlen, "(%s) ", type_base_name[datatype]) ); 1448 1449 /* Now, the value */ 1450 CHECK_FCT( dump_add_str(outstr, offset, outlen, "v: ") ); 1438 size_t *outlen, 1439 int header) 1440 { 1441 if (header) { 1442 /* Header for all AVP values dumps: */ 1443 CHECK_FCT( dump_add_str(outstr, offset, outlen, INOBJHDR "value ", INOBJHDRVAL) ); 1444 1445 /* If the type is provided, write it */ 1446 if (type_name) { 1447 CHECK_FCT( dump_add_str(outstr, offset, outlen, "t: '%s' ", type_name) ); 1448 } 1449 1450 /* Always give the base datatype anyway */ 1451 CHECK_FCT( dump_add_str(outstr, offset, outlen, "(%s) ", type_base_name[datatype]) ); 1452 1453 /* Now, the value */ 1454 CHECK_FCT( dump_add_str(outstr, offset, outlen, "v: ") ); 1455 } 1451 1456 if (const_name) { 1452 1457 CHECK_FCT( dump_add_str(outstr, offset, outlen, "'%s' (", const_name) ); … … 1469 1474 1470 1475 /* Dump the value of an AVP of known type into the returned str */ 1471 int fd_dict_dump_avp_value(union avp_value *avp_value, struct dict_object * model, int indent, char **outstr, size_t *offset, size_t *outlen )1476 int fd_dict_dump_avp_value(union avp_value *avp_value, struct dict_object * model, int indent, char **outstr, size_t *offset, size_t *outlen, int header) 1472 1477 { 1473 1478 char * (*dump_val_cb)(union avp_value *avp_value) = NULL; … … 1503 1508 1504 1509 /* And finally, dump the value */ 1505 CHECK_FCT( dump_avp_val(avp_value, get_default_dump_val_cb(model->data.avp.avp_basetype), dump_val_cb, model->data.avp.avp_basetype, type_name, const_name, indent, outstr, offset, outlen ) );1510 CHECK_FCT( dump_avp_val(avp_value, get_default_dump_val_cb(model->data.avp.avp_basetype), dump_val_cb, model->data.avp.avp_basetype, type_name, const_name, indent, outstr, offset, outlen, header) ); 1506 1511 return 0; 1507 1512 } -
libfdproto/fdproto-internal.h
r928 r1036 60 60 /* Dispatch / messages / dictionary API */ 61 61 int fd_dict_disp_cb(enum dict_object_type type, struct dict_object *obj, struct fd_list ** cb_list); 62 int fd_dict_dump_avp_value(union avp_value *avp_value, struct dict_object * model, int indent, char **outstr, size_t *offset, size_t *outlen );62 int fd_dict_dump_avp_value(union avp_value *avp_value, struct dict_object * model, int indent, char **outstr, size_t *offset, size_t *outlen, int header); 63 63 int fd_disp_call_cb_int( struct fd_list * cb_list, struct msg ** msg, struct avp *avp, struct session *sess, enum disp_action *action, 64 64 struct dict_object * obj_app, struct dict_object * obj_cmd, struct dict_object * obj_avp, struct dict_object * obj_enu); -
libfdproto/messages.c
r1027 r1036 829 829 CHECK_FCT( dump_add_str(outstr, offset, outlen, INOBJHDR "(data set but no model: ERROR)|", INOBJHDRVAL) ); 830 830 } else { 831 CHECK_FCT( fd_dict_dump_avp_value(avp->avp_public.avp_value, avp->avp_model, indent, outstr, offset, outlen ) );831 CHECK_FCT( fd_dict_dump_avp_value(avp->avp_public.avp_value, avp->avp_model, indent, outstr, offset, outlen, 1) ); 832 832 } 833 833 } … … 899 899 fd_log_debug_fstr(fstr, "%s", outstr); 900 900 901 free(outstr); 902 } 903 904 /* Completely dump a msg_t object */ 905 static int full_obj_dump_msg (struct msg * msg, struct dictionary *dict, char **outstr, size_t *offset, size_t *outlen) 906 { 907 int ret = 0; 908 int success = 0; 909 struct dict_cmd_data dictdata; 910 char buf[20]; 911 912 if (!CHECK_MSG(msg)) { 913 CHECK_FCT( dump_add_str(outstr, offset, outlen, "INVALID MESSAGE") ); 914 return 0; 915 } 916 917 if (!msg->msg_model) { 918 fd_msg_parse_dict(msg, dict, NULL); 919 } 920 if (!msg->msg_model) { 921 CHECK_FCT( dump_add_str(outstr, offset, outlen, "(no model) ") ); 922 } else { 923 enum dict_object_type dicttype; 924 ret = fd_dict_gettype(msg->msg_model, &dicttype); 925 if (ret || (dicttype != DICT_COMMAND)) { 926 CHECK_FCT( dump_add_str(outstr, offset, outlen, "(invalid model: %d %d) ", ret, dicttype) ); 927 } else { 928 ret = fd_dict_getval(msg->msg_model, &dictdata); 929 if (ret != 0) { 930 CHECK_FCT( dump_add_str(outstr, offset, outlen, "(error getting model data: %s) ", strerror(ret)) ); 931 } else { 932 success = 1; 933 } 934 } 935 } 936 937 if (msg->msg_public.msg_appl) { 938 snprintf(buf, sizeof(buf), "%u/", msg->msg_public.msg_appl); 939 } else { 940 buf[0] = '\0'; 941 } 942 CHECK_FCT( dump_add_str(outstr, offset, outlen, "%s(%s%u)[" DUMP_CMDFL_str "], Length=%u, Hop-By-Hop-Id=0x%08x, End-to-End=0x%08x", 943 success ? dictdata.cmd_name : "unknown", buf, msg->msg_public.msg_code, DUMP_CMDFL_val(msg->msg_public.msg_flags), 944 msg->msg_public.msg_length, msg->msg_public.msg_hbhid, msg->msg_public.msg_eteid)); 945 946 return 0; 947 } 948 949 /* Dump an avp object completely */ 950 static int full_obj_dump_avp ( struct avp * avp, char **outstr, size_t *offset, size_t *outlen, int first ) 951 { 952 int success = 0; 953 struct dict_avp_data dictdata; 954 char buf[20]; 955 956 CHECK_FCT( dump_add_str(outstr, offset, outlen, first ? ((*outstr)[*offset-1] == '=' ? "{ " : ", { ") : ", ") ); 957 958 if (!CHECK_AVP(avp)) { 959 CHECK_FCT( dump_add_str(outstr, offset, outlen, "INVALID AVP") ); 960 return 0; 961 } 962 963 if (avp->avp_model) { 964 enum dict_object_type dicttype; 965 int ret; 966 ret = fd_dict_gettype(avp->avp_model, &dicttype); 967 if (ret || (dicttype != DICT_AVP)) { 968 CHECK_FCT( dump_add_str(outstr, offset, outlen, "(invalid model: %d %d) ", ret, dicttype) ); 969 } else { 970 ret = fd_dict_getval(avp->avp_model, &dictdata); 971 if (ret != 0) { 972 CHECK_FCT( dump_add_str(outstr, offset, outlen, "(error getting model data: %s) ", strerror(ret)) ); 973 } else { 974 success = 1; 975 } 976 } 977 } 978 979 if (avp->avp_public.avp_vendor) { 980 snprintf(buf, sizeof(buf), "%u/", avp->avp_public.avp_vendor); 981 } else { 982 buf[0] = '\0'; 983 } 984 /* \todo add full vendorname? */ 985 CHECK_FCT(dump_add_str(outstr, offset, outlen, "%s(%s%u)[" DUMP_AVPFL_str "]=", success ? dictdata.avp_name : "unknown", buf, avp->avp_public.avp_code, DUMP_AVPFL_val(avp->avp_public.avp_flags))); 986 987 /* Dump the value if set */ 988 if (avp->avp_public.avp_value) { 989 if (!avp->avp_model) { 990 CHECK_FCT( dump_add_str(outstr, offset, outlen, "(unknown data type)") ); 991 } else { 992 CHECK_FCT( fd_dict_dump_avp_value(avp->avp_public.avp_value, avp->avp_model, 1, outstr, offset, outlen, 0) ); 993 } 994 } 995 996 return 0; 997 } 998 999 /* Dump full message */ 1000 void fd_msg_dump_full ( int level, struct dictionary *dict, const char *prefix, msg_or_avp *obj ) 1001 { 1002 msg_or_avp * ref = obj; 1003 char *outstr; 1004 int indent = 1; 1005 int first = 1; 1006 int previous; 1007 size_t offset, outlen; 1008 CHECK_FCT_DO( dump_init_str(&outstr, &offset, &outlen), 1009 { fd_log_error("Error initializing string for dumping %p", obj); return; } ); 1010 CHECK_FCT_DO( dump_add_str(&outstr, &offset, &outlen, "%s: ", prefix), 1011 { fd_log_error("Error while dumping %p", ref); return; }); 1012 1013 do { 1014 /* Check the object */ 1015 if (!VALIDATE_OBJ(ref)) { 1016 CHECK_FCT_DO( dump_add_str(&outstr, &offset, &outlen, ">>> invalid object (%p)", ref), 1017 { fd_log_error("Error in error handling dumping %p", ref); break; }); 1018 } 1019 /* Dump the object */ 1020 switch (_C(ref)->type) { 1021 case MSG_AVP: 1022 CHECK_FCT_DO( full_obj_dump_avp ( _A(ref), &outstr, &offset, &outlen, first ), 1023 { fd_log_error("Error in error handling dumping %p", ref); }); 1024 break; 1025 case MSG_MSG: 1026 CHECK_FCT_DO( full_obj_dump_msg ( _M(obj), dict, &outstr, &offset, &outlen ), 1027 { fd_log_error("Error in error handling dumping %p", ref); }); 1028 break; 1029 default: 1030 ASSERT(0); 1031 } 1032 1033 first = 0; 1034 previous = indent; 1035 /* Now find the next object */ 1036 CHECK_FCT_DO( fd_msg_browse ( ref, MSG_BRW_WALK, &ref, &indent ), break ); 1037 if (previous < indent) { 1038 first = 1; 1039 } else while (previous-- > indent) { 1040 CHECK_FCT_DO( dump_add_str(&outstr, &offset, &outlen, " }"), 1041 { fd_log_error("Error while dumping %p", ref); return; }); 1042 } 1043 /* dump next object */ 1044 } while (ref); 1045 1046 fd_log(level, "%s", outstr); 901 1047 free(outstr); 902 1048 }
Note: See TracChangeset
for help on using the changeset viewer.