"Fossies" - the Fresh Open Source Software Archive

Member "tcpdump-4.99.1/./print-msdp.c" (7 Jun 2021, 2614 Bytes) of package /linux/misc/tcpdump-4.99.1.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "print-msdp.c" see the Fossies "Dox" file reference documentation and the latest Fossies "Diffs" side-by-side code changes report: 4.99.0_vs_4.99.1.

    1 /*
    2  * Copyright (c) 2001 William C. Fenner.
    3  *                All rights reserved.
    4  *
    5  * Redistribution and use in source and binary forms, with or without
    6  * modification, are permitted provided that: (1) source code
    7  * distributions retain the above copyright notice and this paragraph
    8  * in its entirety, and (2) distributions including binary code include
    9  * the above copyright notice and this paragraph in its entirety in
   10  * the documentation or other materials provided with the distribution.
   11  * The name of William C. Fenner may not be used to endorse or
   12  * promote products derived from this software without specific prior
   13  * written permission.  THIS SOFTWARE IS PROVIDED ``AS IS'' AND
   14  * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
   15  * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
   16  * FOR A PARTICULAR PURPOSE.
   17  */
   18 
   19 /* \summary: Multicast Source Discovery Protocol (MSDP) printer */
   20 
   21 #ifdef HAVE_CONFIG_H
   22 #include <config.h>
   23 #endif
   24 
   25 #include "netdissect-stdinc.h"
   26 
   27 #include "netdissect.h"
   28 #include "addrtoname.h"
   29 #include "extract.h"
   30 
   31 #define MSDP_TYPE_MAX   7
   32 
   33 void
   34 msdp_print(netdissect_options *ndo, const u_char *sp, u_int length)
   35 {
   36     unsigned int type, len;
   37 
   38     ndo->ndo_protocol = "msdp";
   39     ND_PRINT(": ");
   40     nd_print_protocol(ndo);
   41     /* See if we think we're at the beginning of a compound packet */
   42     type = GET_U_1(sp);
   43     len = GET_BE_U_2(sp + 1);
   44     if (len > 1500 || len < 3 || type == 0 || type > MSDP_TYPE_MAX)
   45         goto trunc; /* not really truncated, but still not decodable */
   46     while (length != 0) {
   47         type = GET_U_1(sp);
   48         len = GET_BE_U_2(sp + 1);
   49         if (len > 1400 || ndo->ndo_vflag)
   50             ND_PRINT(" [len %u]", len);
   51         if (len < 3)
   52             goto trunc;
   53         if (length < len)
   54             goto trunc;
   55         sp += 3;
   56         length -= 3;
   57         switch (type) {
   58         case 1: /* IPv4 Source-Active */
   59         case 3: /* IPv4 Source-Active Response */
   60             if (type == 1)
   61                 ND_PRINT(" SA");
   62             else
   63                 ND_PRINT(" SA-Response");
   64             ND_PRINT(" %u entries", GET_U_1(sp));
   65             if ((u_int)((GET_U_1(sp) * 12) + 8) < len) {
   66                 ND_PRINT(" [w/data]");
   67                 if (ndo->ndo_vflag > 1) {
   68                     ND_PRINT(" ");
   69                     ip_print(ndo, sp +
   70                          GET_U_1(sp) * 12 + 8 - 3,
   71                          len - (GET_U_1(sp) * 12 + 8));
   72                 }
   73             }
   74             break;
   75         case 2:
   76             ND_PRINT(" SA-Request");
   77             ND_PRINT(" for %s", GET_IPADDR_STRING(sp + 1));
   78             break;
   79         case 4:
   80             ND_PRINT(" Keepalive");
   81             if (len != 3)
   82                 ND_PRINT("[len=%u] ", len);
   83             break;
   84         case 5:
   85             ND_PRINT(" Notification");
   86             break;
   87         default:
   88             ND_PRINT(" [type=%u len=%u]", type, len);
   89             break;
   90         }
   91         sp += (len - 3);
   92         length -= (len - 3);
   93     }
   94     return;
   95 trunc:
   96     nd_print_trunc(ndo);
   97 }