ports/net/tcpdump/files/patch-print-ppp.c
Bruce M Simpson 4656244420 Mega-commit fixing several outstanding issues with the port.
Fix inconsistent configure-time behaviour. Previously, the tcpdump port
would look at the base system pcap, then attempt to link against the port.
This caused spurious link failures, and should fix build on IA64.

Add a new switch, WITH_LIBPCAP_PORT, to force the use of libpcap
from ports.
Rototile the build-time options for the port, and document them.

Fix detection of the OpenSSL libraries; 0.9.7d and later renamed the
des_cbc_encrypt function to DES_cbc_encrypt, so deal with this by
rebuilding configure after patching configure.in.

Incorporate fix for PR bin/76497 suggested by keramida@ (logic error
in the PPP IPV6CP parser).

Make some stylistic fixes while we're at it, and improve comments.
Mark as unbroken on -CURRENT.
Bump PORTREVISION.

PR:	bin/76497 (possibly others)
2005-01-23 00:39:01 +00:00

227 lines
5.4 KiB
C

--- 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