]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-pgm.c
OpenFlow: Have a function for each message type.
[tcpdump] / print-pgm.c
index 306c50d03ee91c6446071944c1fc06bc425b977e..ccb0b46afef9982c4e1851063baa355f101e8b05 100644 (file)
@@ -74,17 +74,17 @@ struct pgm_ack {
 struct pgm_poll {
     nd_uint32_t        pgmp_seq;
     nd_uint16_t        pgmp_round;
+    nd_uint16_t        pgmp_subtype;
+    nd_uint16_t        pgmp_nla_afi;
     nd_uint16_t        pgmp_reserved;
+    /* ... uint8_t     pgmp_nla[0]; */
     /* ... options */
 };
 
 struct pgm_polr {
     nd_uint32_t        pgmp_seq;
     nd_uint16_t        pgmp_round;
-    nd_uint16_t        pgmp_subtype;
-    nd_uint16_t        pgmp_nla_afi;
     nd_uint16_t        pgmp_reserved;
-    /* ... uint8_t     pgmp_nla[0]; */
     /* ... options */
 };
 
@@ -167,12 +167,12 @@ pgm_print(netdissect_options *ndo,
        if (!ND_TTEST_2(pgm->pgm_dport)) {
                if (ip6) {
                        ND_PRINT("%s > %s:",
-                               ip6addr_string(ndo, ip6->ip6_src),
-                               ip6addr_string(ndo, ip6->ip6_dst));
+                               GET_IP6ADDR_STRING(ip6->ip6_src),
+                               GET_IP6ADDR_STRING(ip6->ip6_dst));
                } else {
                        ND_PRINT("%s > %s:",
-                               ipaddr_string(ndo, ip->ip_src),
-                               ipaddr_string(ndo, ip->ip_dst));
+                               GET_IPADDR_STRING(ip->ip_src),
+                               GET_IPADDR_STRING(ip->ip_dst));
                }
                nd_print_trunc(ndo);
                return;
@@ -184,9 +184,9 @@ pgm_print(netdissect_options *ndo,
        if (ip6) {
                if (GET_U_1(ip6->ip6_nxt) == IPPROTO_PGM) {
                        ND_PRINT("%s.%s > %s.%s: ",
-                               ip6addr_string(ndo, ip6->ip6_src),
+                               GET_IP6ADDR_STRING(ip6->ip6_src),
                                tcpport_string(ndo, sport),
-                               ip6addr_string(ndo, ip6->ip6_dst),
+                               GET_IP6ADDR_STRING(ip6->ip6_dst),
                                tcpport_string(ndo, dport));
                } else {
                        ND_PRINT("%s > %s: ",
@@ -195,9 +195,9 @@ pgm_print(netdissect_options *ndo,
        } else {
                if (GET_U_1(ip->ip_p) == IPPROTO_PGM) {
                        ND_PRINT("%s.%s > %s.%s: ",
-                               ipaddr_string(ndo, ip->ip_src),
+                               GET_IPADDR_STRING(ip->ip_src),
                                tcpport_string(ndo, sport),
-                               ipaddr_string(ndo, ip->ip_dst),
+                               GET_IPADDR_STRING(ip->ip_dst),
                                tcpport_string(ndo, dport));
                } else {
                        ND_PRINT("%s > %s: ",
@@ -253,25 +253,14 @@ pgm_print(netdissect_options *ndo,
        }
 
        case PGM_POLL: {
-           const struct pgm_poll *poll_msg;
-
-           poll_msg = (const struct pgm_poll *)(pgm + 1);
-           ND_TCHECK_SIZE(poll_msg);
-           ND_PRINT("POLL seq %u round %u",
-                        GET_BE_U_4(poll_msg->pgmp_seq),
-                        GET_BE_U_2(poll_msg->pgmp_round));
-           bp = (const u_char *) (poll_msg + 1);
-           break;
-       }
-       case PGM_POLR: {
-           const struct pgm_polr *polr;
+           const struct pgm_poll *pgm_poll;
            uint32_t ivl, rnd, mask;
 
-           polr = (const struct pgm_polr *)(pgm + 1);
-           ND_TCHECK_SIZE(polr);
-           bp = (const u_char *) (polr + 1);
+           pgm_poll = (const struct pgm_poll *)(pgm + 1);
+           ND_TCHECK_SIZE(pgm_poll);
+           bp = (const u_char *) (pgm_poll + 1);
 
-           switch (GET_BE_U_2(polr->pgmp_nla_afi)) {
+           switch (GET_BE_U_2(pgm_poll->pgmp_nla_afi)) {
            case AFNUM_INET:
                ND_TCHECK_LEN(bp, sizeof(nd_ipv4));
                addrtostr(bp, nla_buf, sizeof(nla_buf));
@@ -287,24 +276,32 @@ pgm_print(netdissect_options *ndo,
                break;
            }
 
-           ND_TCHECK_LEN(bp, sizeof(uint32_t));
            ivl = GET_BE_U_4(bp);
            bp += sizeof(uint32_t);
 
-           ND_TCHECK_LEN(bp, sizeof(uint32_t));
            rnd = GET_BE_U_4(bp);
            bp += sizeof(uint32_t);
 
-           ND_TCHECK_LEN(bp, sizeof(uint32_t));
            mask = GET_BE_U_4(bp);
            bp += sizeof(uint32_t);
 
-           ND_PRINT("POLR seq %u round %u nla %s ivl %u rnd 0x%08x "
-                        "mask 0x%08x", GET_BE_U_4(polr->pgmp_seq),
-                        GET_BE_U_2(polr->pgmp_round), nla_buf, ivl, rnd,
+           ND_PRINT("POLL seq %u round %u nla %s ivl %u rnd 0x%08x "
+                        "mask 0x%08x", GET_BE_U_4(pgm_poll->pgmp_seq),
+                        GET_BE_U_2(pgm_poll->pgmp_round), nla_buf, ivl, rnd,
                         mask);
            break;
        }
+       case PGM_POLR: {
+           const struct pgm_polr *polr_msg;
+
+           polr_msg = (const struct pgm_polr *)(pgm + 1);
+           ND_TCHECK_SIZE(polr_msg);
+           ND_PRINT("POLR seq %u round %u",
+                        GET_BE_U_4(polr_msg->pgmp_seq),
+                        GET_BE_U_2(polr_msg->pgmp_round));
+           bp = (const u_char *) (polr_msg + 1);
+           break;
+       }
        case PGM_ODATA: {
            const struct pgm_data *odata;
 
@@ -364,7 +361,6 @@ pgm_print(netdissect_options *ndo,
             * and stopping if we don't have enough.
             */
            bp += (2 * sizeof(uint16_t));
-           ND_TCHECK_2(bp);
            switch (GET_BE_U_2(bp)) {
            case AFNUM_INET:
                ND_TCHECK_LEN(bp, sizeof(nd_ipv4));
@@ -459,7 +455,6 @@ pgm_print(netdissect_options *ndo,
                    ND_PRINT("[Total option length leaves no room for final option]");
                    return;
                }
-               ND_TCHECK_2(bp);
                opt_type = GET_U_1(bp);
                bp++;
                opt_len = GET_U_1(bp);
@@ -515,7 +510,6 @@ pgm_print(netdissect_options *ndo,
                            ND_PRINT("[Option length not a multiple of 4]");
                            return;
                        }
-                       ND_TCHECK_4(bp);
                        ND_PRINT(" %u", GET_BE_U_4(bp));
                        bp += 4;
                        opt_len -= 4;
@@ -594,7 +588,7 @@ pgm_print(netdissect_options *ndo,
                    case AFNUM_INET6:
                        if (opt_len != PGM_OPT_REDIRECT_FIXED_LEN + sizeof(nd_ipv6)) {
                            ND_PRINT("[Bad OPT_REDIRECT option, length %u != %u + address size]",
-                               PGM_OPT_REDIRECT_FIXED_LEN, opt_len);
+                               opt_len, PGM_OPT_REDIRECT_FIXED_LEN);
                            return;
                        }
                        ND_TCHECK_LEN(bp, sizeof(nd_ipv6));