diff options
Diffstat (limited to 'net/tcpdump/files/patch-print-ppp.c')
-rw-r--r-- | net/tcpdump/files/patch-print-ppp.c | 227 |
1 files changed, 227 insertions, 0 deletions
diff --git a/net/tcpdump/files/patch-print-ppp.c b/net/tcpdump/files/patch-print-ppp.c new file mode 100644 index 0000000..f8161fd --- /dev/null +++ b/net/tcpdump/files/patch-print-ppp.c @@ -0,0 +1,227 @@ +--- print-ppp.c.orig Wed Mar 24 03:32:43 2004 ++++ print-ppp.c Sun Jan 23 00:26:26 2005 +@@ -89,6 +89,7 @@ + { PPP_IPXCP, "IPXCP" }, + { PPP_STIICP, "STIICP" }, + { PPP_VINESCP, "VINESCP" }, ++ { PPP_IPV6CP, "IP6CP" }, + { PPP_MPLSCP, "MPLSCP" }, + + { PPP_LCP, "LCP" }, +@@ -211,7 +212,6 @@ + "PPP-Muxing", /* (30) */ + }; + +-/* IPV6CP - to be supported */ + /* ECP - to be supported */ + + /* CCP Config Options */ +@@ -275,17 +275,36 @@ + /* SDCP - to be supported */ + + /* IPCP Config Options */ +- + #define IPCPOPT_2ADDR 1 /* RFC1172, RFC1332 (deprecated) */ + #define IPCPOPT_IPCOMP 2 /* RFC1332 */ + #define IPCPOPT_ADDR 3 /* RFC1332 */ + #define IPCPOPT_MOBILE4 4 /* RFC2290 */ +- + #define IPCPOPT_PRIDNS 129 /* RFC1877 */ + #define IPCPOPT_PRINBNS 130 /* RFC1877 */ + #define IPCPOPT_SECDNS 131 /* RFC1877 */ + #define IPCPOPT_SECNBNS 132 /* RFC1877 */ + ++struct tok ipcpopt_values[] = { ++ { IPCPOPT_2ADDR, "IP-Addrs" }, ++ { IPCPOPT_IPCOMP, "IP-Comp" }, ++ { IPCPOPT_ADDR, "IP-Addr" }, ++ { IPCPOPT_MOBILE4, "Home-Addr" }, ++ { IPCPOPT_PRIDNS, "Pri-DNS" }, ++ { IPCPOPT_PRINBNS, "Pri-NBNS" }, ++ { IPCPOPT_SECDNS, "Sec-DNS" }, ++ { IPCPOPT_SECNBNS, "Sec-NBNS" }, ++ { 0, NULL } ++}; ++ ++ ++/* IP6CP Config Options */ ++#define IP6CP_IFID 1 ++ ++struct tok ip6cpopt_values[] = { ++ { IP6CP_IFID, "Interface-ID" }, ++ { 0, NULL } ++}; ++ + /* ATCP - to be supported */ + /* OSINLCP - to be supported */ + /* BVCP - to be supported */ +@@ -366,6 +385,7 @@ + static void handle_bap (const u_char *p, int length); + static int print_lcp_config_options (const u_char *p, int); + static int print_ipcp_config_options (const u_char *p, int); ++static int print_ip6cp_config_options (const u_char *p, int); + static int print_ccp_config_options (const u_char *p, int); + static int print_bacp_config_options (const u_char *p, int); + static void handle_ppp (u_int proto, const u_char *p, int length); +@@ -382,7 +402,7 @@ + + tptr=pptr; + +- typestr = tok2str(ppptype2str, "unknown", proto); ++ typestr = tok2str(ppptype2str, "unknown ctrl-proto (0x%04x)", proto); + printf("%s, ",typestr); + + if (length < 4) /* FIXME weak boundary checking */ +@@ -401,7 +421,7 @@ + tptr += 2; + + if (length <= 4) +- return; /* there may be a NULL confreq etc. */ ++ goto print_len_and_return; /* there may be a NULL confreq etc. */ + + switch (code) { + case CPCODES_VEXT: +@@ -427,6 +447,9 @@ + case PPP_IPCP: + pfunc = print_ipcp_config_options; + break; ++ case PPP_IPV6CP: ++ pfunc = print_ip6cp_config_options; ++ break; + case PPP_CCP: + pfunc = print_ccp_config_options; + break; +@@ -492,6 +515,8 @@ + print_unknown_data(pptr-2,"\n\t",length+2); + break; + } ++ ++ print_len_and_return: + printf(", length %u", length); + + if (vflag >1) +@@ -902,61 +927,41 @@ + opt = p[0]; + if (length < len) + return 0; ++ ++ printf(", %s (0x%02x) ", ++ tok2str(ipcpopt_values,"unknown",opt), ++ opt); ++ + switch (opt) { + case IPCPOPT_2ADDR: /* deprecated */ + if (len != 10) + goto invlen; + TCHECK2(*(p + 6), 4); +- printf(", IP-Addrs src %s, dst %s", ++ printf("src %s, dst %s", + ipaddr_string(p + 2), + ipaddr_string(p + 6)); + break; + case IPCPOPT_IPCOMP: + if (len < 4) + goto invlen; +- printf(", IP-Comp"); + TCHECK2(*(p + 2), 2); + if (EXTRACT_16BITS(p + 2) == PPP_VJC) { +- printf(" VJ-Comp"); ++ printf("VJ-Comp"); + /* XXX: VJ-Comp parameters should be decoded */ + } else +- printf(" unknown-comp-proto=%04x", EXTRACT_16BITS(p + 2)); +- break; +- case IPCPOPT_ADDR: +- if (len != 6) +- goto invlen; +- TCHECK2(*(p + 2), 4); +- printf(", IP-Addr %s", ipaddr_string(p + 2)); ++ printf("unknown-comp-proto %04x", EXTRACT_16BITS(p + 2)); + break; ++ ++ case IPCPOPT_ADDR: /* those options share the same format - fall through */ + case IPCPOPT_MOBILE4: +- if (len != 6) +- goto invlen; +- TCHECK2(*(p + 2), 4); +- printf(", Home-Addr %s", ipaddr_string(p + 2)); +- break; + case IPCPOPT_PRIDNS: +- if (len != 6) +- goto invlen; +- TCHECK2(*(p + 2), 4); +- printf(", Pri-DNS %s", ipaddr_string(p + 2)); +- break; + case IPCPOPT_PRINBNS: +- if (len != 6) +- goto invlen; +- TCHECK2(*(p + 2), 4); +- printf(", Pri-NBNS %s", ipaddr_string(p + 2)); +- break; + case IPCPOPT_SECDNS: +- if (len != 6) +- goto invlen; +- TCHECK2(*(p + 2), 4); +- printf(", Sec-DNS %s", ipaddr_string(p + 2)); +- break; + case IPCPOPT_SECNBNS: + if (len != 6) + goto invlen; + TCHECK2(*(p + 2), 4); +- printf(", Sec-NBNS %s", ipaddr_string(p + 2)); ++ printf("%s", ipaddr_string(p + 2)); + break; + default: + printf(", unknown-%d", opt); +@@ -972,6 +977,51 @@ + printf("[|ipcp]"); + return 0; + } ++ ++/* IP6CP config options */ ++static int ++print_ip6cp_config_options(const u_char *p, int length) ++{ ++ int len, opt; ++ ++ if (length < 2) ++ return 0; ++ TCHECK2(*p, 2); ++ len = p[1]; ++ opt = p[0]; ++ if (length < len) ++ return 0; ++ ++ printf(", %s (0x%02x) ", ++ tok2str(ip6cpopt_values,"unknown",opt), ++ opt); ++ ++ switch (opt) { ++ case IP6CP_IFID: ++ if (len != 10) ++ goto invlen; ++ TCHECK2(*(p + 2), 8); ++ printf("%04x:%04x:%04x:%04x", ++ EXTRACT_16BITS(p + 2), ++ EXTRACT_16BITS(p + 4), ++ EXTRACT_16BITS(p + 6), ++ EXTRACT_16BITS(p + 8)); ++ break; ++ default: ++ printf(", unknown-%d", opt); ++ break; ++ } ++ return len; ++ ++invlen: ++ printf(", invalid-length-%d", opt); ++ return 0; ++ ++trunc: ++ printf("[|ip6cp]"); ++ return 0; ++} ++ + + /* CCP config options */ + static int |