Navigation


Changeset 1036:aecdc2fbf222 in freeDiameter


Ignore:
Timestamp:
Apr 17, 2013, 1:53:51 AM (11 years ago)
Author:
Thomas Klausner <tk@giga.or.at>
Branch:
default
Phase:
public
Message:

Add fd_msg_dump_full function that dumps a message in human-readable format.
(not hooked in yet)

For this, add an argument to dump_avp_val if it should print a
header before each value or not.

Files:
4 edited

Legend:

Unmodified
Added
Removed
  • include/freeDiameter/libfdproto.h

    r1033 r1036  
    23192319void fd_msg_dump_walk ( int level, msg_or_avp *obj );
    23202320void fd_msg_dump_one  ( int level, msg_or_avp *obj );
     2321/* Dump full message to log */
     2322void fd_msg_dump_full ( int level, struct dictionary *dict, const char *prefix, msg_or_avp *obj );
    23212323
    23222324/*
  • libfdproto/dictionary.c

    r1030 r1036  
    11801180                                        n = enumval->enum_value.os.len;
    11811181                                for (i=0; i < n; i++)
    1182                                         fd_log_debug("0x%02hhX/'%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]));
    11831183                                if (n == LEN_MAX)
    11841184                                        fd_log_debug("...");
     
    13431343{
    13441344        int i;
     1345        CHECK_FCT( dump_add_str(outstr, offset, outlen, "<") );
    13451346        for (i = 0; i < value->os.len; i++) {
    1346                 if (i == 24) { /* Dump only up to 24 bytes of the buffer */
     1347                if (i == 1024) { /* Dump only up to 1024 bytes of the buffer */
    13471348                        CHECK_FCT( dump_add_str(outstr, offset, outlen, "[...] (len=%zd)", value->os.len) );
    13481349                        break;
    13491350                }
    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, ">") );
    13521354        return 0;
    13531355}
     
    14241426#define INOBJHDRVAL     indent<0 ? 1 : indent, indent<0 ? "-" : "|"
    14251427
    1426 /* Formater for the AVP value dump line */
     1428/* Formatter for the AVP value dump line */
    14271429static int dump_avp_val(union avp_value *avp_value,
    14281430                        int (*def_dump_val_cb)(union avp_value *, char **, size_t *, size_t *),
     
    14341436                        char **outstr,
    14351437                        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        }
    14511456        if (const_name) {
    14521457                CHECK_FCT( dump_add_str(outstr, offset, outlen, "'%s' (", const_name) );
     
    14691474
    14701475/* 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)
     1476int 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)
    14721477{
    14731478        char * (*dump_val_cb)(union avp_value *avp_value) = NULL;
     
    15031508       
    15041509        /* 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) );
    15061511        return 0;
    15071512}
  • libfdproto/fdproto-internal.h

    r928 r1036  
    6060/* Dispatch / messages / dictionary API */
    6161int 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);
     62int 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);
    6363int fd_disp_call_cb_int( struct fd_list * cb_list, struct msg ** msg, struct avp *avp, struct session *sess, enum disp_action *action,
    6464                        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  
    829829                        CHECK_FCT( dump_add_str(outstr, offset, outlen, INOBJHDR "(data set but no model: ERROR)|", INOBJHDRVAL) );
    830830                } 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) );
    832832                }
    833833        }
     
    899899        fd_log_debug_fstr(fstr, "%s", outstr);
    900900       
     901        free(outstr);
     902}
     903
     904/* Completely dump a msg_t object */
     905static 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 */
     950static 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 */
     1000void 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);
    9011047        free(outstr);
    9021048}
Note: See TracChangeset for help on using the changeset viewer.