Changeset 1093:44f3e48dfe27 in freeDiameter for libfdproto/messages.c
- Timestamp:
- May 6, 2013, 5:33:22 PM (11 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
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;
Note: See TracChangeset
for help on using the changeset viewer.