1/*
| 1/*
|
2 * Copyright (c) 1990, 1991, 1993, 1994, 1995, 1996
| 2 * Copyright (c) 1990, 1991, 1993, 1994, 1995, 1996, 1997
|
3 * The Regents of the University of California. 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 distributions 7 * retain the above copyright notice and this paragraph in its entirety, (2) 8 * distributions including binary code include the above copyright notice and 9 * this paragraph in its entirety in the documentation or other materials 10 * provided with the distribution, and (3) all advertising materials mentioning 11 * features or use of this software display the following acknowledgement: 12 * ``This product includes software developed by the University of California, 13 * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of 14 * the University nor the names of its contributors may be used to endorse 15 * or promote products derived from this software without specific prior 16 * written permission. 17 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED 18 * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF 19 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 20 */ 21 22#ifndef lint 23static const char rcsid[] =
| 3 * The Regents of the University of California. 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 distributions 7 * retain the above copyright notice and this paragraph in its entirety, (2) 8 * distributions including binary code include the above copyright notice and 9 * this paragraph in its entirety in the documentation or other materials 10 * provided with the distribution, and (3) all advertising materials mentioning 11 * features or use of this software display the following acknowledgement: 12 * ``This product includes software developed by the University of California, 13 * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of 14 * the University nor the names of its contributors may be used to endorse 15 * or promote products derived from this software without specific prior 16 * written permission. 17 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED 18 * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF 19 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 20 */ 21 22#ifndef lint 23static const char rcsid[] =
|
24 "@(#) $Header: print-ppp.c,v 1.24 96/12/10 23:23:12 leres Exp $ (LBL)";
| 24 "@(#) $Header: print-ppp.c,v 1.26 97/06/12 14:21:29 leres Exp $ (LBL)";
|
25#endif 26
| 25#endif 26
|
27#ifdef PPP
| |
28#include <sys/param.h> 29#include <sys/time.h> 30#include <sys/socket.h> 31#include <sys/file.h> 32#include <sys/ioctl.h> 33 34#if __STDC__ 35struct mbuf; 36struct rtentry; 37#endif 38#include <net/if.h> 39 40#include <netinet/in.h> 41#include <netinet/in_systm.h> 42#include <netinet/ip.h> 43 44#include <ctype.h> 45#include <netdb.h> 46#include <pcap.h>
| 27#include <sys/param.h> 28#include <sys/time.h> 29#include <sys/socket.h> 30#include <sys/file.h> 31#include <sys/ioctl.h> 32 33#if __STDC__ 34struct mbuf; 35struct rtentry; 36#endif 37#include <net/if.h> 38 39#include <netinet/in.h> 40#include <netinet/in_systm.h> 41#include <netinet/ip.h> 42 43#include <ctype.h> 44#include <netdb.h> 45#include <pcap.h>
|
47#include <signal.h>
| |
48#include <stdio.h> 49 50#include <net/ethernet.h> 51#include "ethertype.h" 52 53#include <net/ppp_defs.h> 54#include "interface.h" 55#include "addrtoname.h"
| 46#include <stdio.h> 47 48#include <net/ethernet.h> 49#include "ethertype.h" 50 51#include <net/ppp_defs.h> 52#include "interface.h" 53#include "addrtoname.h"
|
| 54#include "ppp.h"
|
56 57struct protonames { 58 u_short protocol; 59 char *name; 60}; 61 62static struct protonames protonames[] = { 63 /* 64 * Protocol field values. 65 */ 66 PPP_IP, "IP", /* Internet Protocol */ 67 PPP_XNS, "XNS", /* Xerox NS */ 68 PPP_IPX, "IPX", /* IPX Datagram (RFC1552) */ 69 PPP_VJC_COMP, "VJC_UNCOMP", /* VJ compressed TCP */ 70 PPP_VJC_UNCOMP, "VJC_UNCOMP", /* VJ uncompressed TCP */ 71 PPP_COMP, "COMP", /* compressed packet */ 72 PPP_IPCP, "IPCP", /* IP Control Protocol */ 73 PPP_IPXCP, "IPXCP", /* IPX Control Protocol (RFC1552) */ 74 PPP_CCP, "CCP", /* Compression Control Protocol */ 75 PPP_LCP, "LCP", /* Link Control Protocol */ 76 PPP_PAP, "PAP", /* Password Authentication Protocol */ 77 PPP_LQR, "LQR", /* Link Quality Report protocol */ 78 PPP_CHAP, "CHAP", /* Cryptographic Handshake Auth. Proto*/ 79}; 80 81/* LCP */ 82 83#define LCP_CONF_REQ 1 84#define LCP_CONF_ACK 2 85#define LCP_CONF_NAK 3 86#define LCP_CONF_REJ 4 87#define LCP_TERM_REQ 5 88#define LCP_TERM_ACK 6 89#define LCP_CODE_REJ 7 90#define LCP_PROT_REJ 8 91#define LCP_ECHO_REQ 9 92#define LCP_ECHO_RPL 10 93#define LCP_DISC_REQ 11 94 95#define LCP_MIN LCP_CONF_REQ 96#define LCP_MAX LCP_DISC_REQ 97 98static char *lcpcodes[] = { 99 /* 100 * LCP code values (RFC1661, pp26) 101 */ 102 "Configure-Request", 103 "Configure-Ack", 104 "Configure-Nak", 105 "Configure-Reject", 106 "Terminate-Request", 107 "Terminate-Ack", 108 "Code-Reject", 109 "Protocol-Reject", 110 "Echo-Request", 111 "Echo-Reply", 112 "Discard-Request", 113}; 114 115#define LCPOPT_VEXT 0 116#define LCPOPT_MRU 1 117#define LCPOPT_ACCM 2 118#define LCPOPT_AP 3 119#define LCPOPT_QP 4 120#define LCPOPT_MN 5 121#define LCPOPT_PFC 7 122#define LCPOPT_ACFC 8 123 124#define LCPOPT_MIN 0 125#define LCPOPT_MAX 24 126 127static char *lcpconfopts[] = { 128 "Vendor-Ext", 129 "Max-Rx-Unit", 130 "Async-Ctrl-Char-Map", 131 "Auth-Prot", 132 "Quality-Prot", 133 "Magic-Number", 134 "unassigned (6)", 135 "Prot-Field-Compr", 136 "Add-Ctrl-Field-Compr", 137 "FCS-Alternatives", 138 "Self-Describing-Pad", 139 "Numbered-Mode", 140 "Multi-Link-Procedure", 141 "Call-Back", 142 "Connect-Time" 143 "Compund-Frames", 144 "Nominal-Data-Encap", 145 "Multilink-MRRU", 146 "Multilink-SSNHF", 147 "Multilink-ED", 148 "Proprietary", 149 "DCE-Identifier", 150 "Multilink-Plus-Proc", 151 "Link-Discriminator", 152 "LCP-Auth-Option", 153}; 154 155/* CHAP */ 156 157#define CHAP_CHAL 1 158#define CHAP_RESP 2 159#define CHAP_SUCC 3 160#define CHAP_FAIL 4 161 162#define CHAP_CODEMIN 1 163#define CHAP_CODEMAX 4 164 165static char *chapcode[] = { 166 "Challenge", 167 "Response", 168 "Success", 169 "Failure", 170}; 171 172/* PAP */ 173 174#define PAP_AREQ 1 175#define PAP_AACK 2 176#define PAP_ANAK 3 177 178#define PAP_CODEMIN 1 179#define PAP_CODEMAX 3 180 181static char *papcode[] = { 182 "Authenticate-Request", 183 "Authenticate-Ack", 184 "Authenticate-Nak", 185}; 186 187/* IPCP */ 188 189#define IPCP_2ADDR 1 190#define IPCP_CP 2 191#define IPCP_ADDR 3 192 193static int handle_lcp(const u_char *p, int length); 194static int print_lcp_config_options(u_char *p); 195static int handle_chap(const u_char *p, int length); 196static int handle_ipcp(const u_char *p, int length); 197static int handle_pap(const u_char *p, int length); 198
| 55 56struct protonames { 57 u_short protocol; 58 char *name; 59}; 60 61static struct protonames protonames[] = { 62 /* 63 * Protocol field values. 64 */ 65 PPP_IP, "IP", /* Internet Protocol */ 66 PPP_XNS, "XNS", /* Xerox NS */ 67 PPP_IPX, "IPX", /* IPX Datagram (RFC1552) */ 68 PPP_VJC_COMP, "VJC_UNCOMP", /* VJ compressed TCP */ 69 PPP_VJC_UNCOMP, "VJC_UNCOMP", /* VJ uncompressed TCP */ 70 PPP_COMP, "COMP", /* compressed packet */ 71 PPP_IPCP, "IPCP", /* IP Control Protocol */ 72 PPP_IPXCP, "IPXCP", /* IPX Control Protocol (RFC1552) */ 73 PPP_CCP, "CCP", /* Compression Control Protocol */ 74 PPP_LCP, "LCP", /* Link Control Protocol */ 75 PPP_PAP, "PAP", /* Password Authentication Protocol */ 76 PPP_LQR, "LQR", /* Link Quality Report protocol */ 77 PPP_CHAP, "CHAP", /* Cryptographic Handshake Auth. Proto*/ 78}; 79 80/* LCP */ 81 82#define LCP_CONF_REQ 1 83#define LCP_CONF_ACK 2 84#define LCP_CONF_NAK 3 85#define LCP_CONF_REJ 4 86#define LCP_TERM_REQ 5 87#define LCP_TERM_ACK 6 88#define LCP_CODE_REJ 7 89#define LCP_PROT_REJ 8 90#define LCP_ECHO_REQ 9 91#define LCP_ECHO_RPL 10 92#define LCP_DISC_REQ 11 93 94#define LCP_MIN LCP_CONF_REQ 95#define LCP_MAX LCP_DISC_REQ 96 97static char *lcpcodes[] = { 98 /* 99 * LCP code values (RFC1661, pp26) 100 */ 101 "Configure-Request", 102 "Configure-Ack", 103 "Configure-Nak", 104 "Configure-Reject", 105 "Terminate-Request", 106 "Terminate-Ack", 107 "Code-Reject", 108 "Protocol-Reject", 109 "Echo-Request", 110 "Echo-Reply", 111 "Discard-Request", 112}; 113 114#define LCPOPT_VEXT 0 115#define LCPOPT_MRU 1 116#define LCPOPT_ACCM 2 117#define LCPOPT_AP 3 118#define LCPOPT_QP 4 119#define LCPOPT_MN 5 120#define LCPOPT_PFC 7 121#define LCPOPT_ACFC 8 122 123#define LCPOPT_MIN 0 124#define LCPOPT_MAX 24 125 126static char *lcpconfopts[] = { 127 "Vendor-Ext", 128 "Max-Rx-Unit", 129 "Async-Ctrl-Char-Map", 130 "Auth-Prot", 131 "Quality-Prot", 132 "Magic-Number", 133 "unassigned (6)", 134 "Prot-Field-Compr", 135 "Add-Ctrl-Field-Compr", 136 "FCS-Alternatives", 137 "Self-Describing-Pad", 138 "Numbered-Mode", 139 "Multi-Link-Procedure", 140 "Call-Back", 141 "Connect-Time" 142 "Compund-Frames", 143 "Nominal-Data-Encap", 144 "Multilink-MRRU", 145 "Multilink-SSNHF", 146 "Multilink-ED", 147 "Proprietary", 148 "DCE-Identifier", 149 "Multilink-Plus-Proc", 150 "Link-Discriminator", 151 "LCP-Auth-Option", 152}; 153 154/* CHAP */ 155 156#define CHAP_CHAL 1 157#define CHAP_RESP 2 158#define CHAP_SUCC 3 159#define CHAP_FAIL 4 160 161#define CHAP_CODEMIN 1 162#define CHAP_CODEMAX 4 163 164static char *chapcode[] = { 165 "Challenge", 166 "Response", 167 "Success", 168 "Failure", 169}; 170 171/* PAP */ 172 173#define PAP_AREQ 1 174#define PAP_AACK 2 175#define PAP_ANAK 3 176 177#define PAP_CODEMIN 1 178#define PAP_CODEMAX 3 179 180static char *papcode[] = { 181 "Authenticate-Request", 182 "Authenticate-Ack", 183 "Authenticate-Nak", 184}; 185 186/* IPCP */ 187 188#define IPCP_2ADDR 1 189#define IPCP_CP 2 190#define IPCP_ADDR 3 191 192static int handle_lcp(const u_char *p, int length); 193static int print_lcp_config_options(u_char *p); 194static int handle_chap(const u_char *p, int length); 195static int handle_ipcp(const u_char *p, int length); 196static int handle_pap(const u_char *p, int length); 197
|
| 198/* Standard PPP printer */
|
199void 200ppp_hdlc_print(const u_char *p, int length) 201{ 202 int proto = PPP_PROTOCOL(p); 203 int i, j, x; 204 u_char *ptr; 205 206 printf("ID-%03d ", *(p+5)); 207 208 for (i = (sizeof(protonames) / sizeof(protonames[0])) - 1; i >= 0; --i) 209 { 210 if (proto == protonames[i].protocol) 211 { 212 printf("%s: ", protonames[i].name); 213 214 switch(proto) 215 { 216 case PPP_LCP: 217 handle_lcp(p, length); 218 break; 219 case PPP_CHAP: 220 handle_chap(p, length); 221 break; 222 case PPP_PAP: 223 handle_pap(p, length); 224 break; 225 case PPP_IPCP: 226 handle_ipcp(p, length); 227 break; 228 } 229 break; 230 } 231 } 232 if (i < 0) 233 { 234 printf("%04x: ", proto); 235 } 236} 237 238/* print LCP frame */ 239 240static int 241handle_lcp(const u_char *p, int length) 242{ 243 int x, j; 244 u_char *ptr; 245 246 x = *(p+4); 247 248 if((x >= LCP_MIN) && (x <= LCP_MAX)) 249 { 250 printf("%s", lcpcodes[x-1]); 251 } 252 else 253 { 254 printf("0x%02x", x); 255 return; 256 } 257 258 length -= 4; 259 260 switch(x) 261 { 262 case LCP_CONF_REQ: 263 case LCP_CONF_ACK: 264 case LCP_CONF_NAK: 265 case LCP_CONF_REJ: 266 x = length; 267 ptr = (u_char *)p+8; 268 do 269 { 270 if((j = print_lcp_config_options(ptr)) == 0) 271 break; 272 x -= j; 273 ptr += j; 274 } 275 while(x > 0); 276 break; 277 278 case LCP_ECHO_REQ: 279 case LCP_ECHO_RPL: 280 printf(", Magic-Number=%d", ((*(p+8) << 24) + (*(p+9) << 16) + (*(p+10) << 8) + (*(p+11)))); 281 break; 282 case LCP_TERM_REQ: 283 case LCP_TERM_ACK: 284 case LCP_CODE_REJ: 285 case LCP_PROT_REJ: 286 case LCP_DISC_REQ: 287 default: 288 break; 289 } 290} 291 292/* LCP config options */ 293 294static int 295print_lcp_config_options(u_char *p) 296{ 297 int len = *(p+1); 298 int opt = *p; 299 300 if((opt >= LCPOPT_MIN) && (opt <= LCPOPT_MAX)) 301 printf(", %s", lcpconfopts[opt]); 302 303 switch(opt) 304 { 305 case LCPOPT_MRU: 306 if(len == 4) 307 printf("=%d", (*(p+2) << 8) + *(p+3)); 308 break; 309 case LCPOPT_AP: 310 if(len >= 4) 311 { 312 if(*(p+2) == 0xc0 && *(p+3) == 0x23) 313 { 314 printf(" PAP"); 315 } 316 else if(*(p+2) == 0xc2 && *(p+3) == 0x23) 317 { 318 printf(" CHAP/"); 319 switch(*(p+4)) 320 { 321 default: 322 printf("unknown-algorithm-%d", *(p+4)); 323 break; 324 case 5: 325 printf("MD5"); 326 break; 327 case 0x80: 328 printf("Microsoft"); 329 break; 330 } 331 } 332 else if(*(p+2) == 0xc2 && *(p+3) == 0x27) 333 { 334 printf(" EAP"); 335 } 336 else if(*(p+2) == 0xc0 && *(p+3) == 0x27) 337 { 338 printf(" SPAP"); 339 } 340 else if(*(p+2) == 0xc1 && *(p+3) == 0x23) 341 { 342 printf(" Old-SPAP"); 343 } 344 else 345 { 346 printf("unknown"); 347 } 348 } 349 break; 350 case LCPOPT_QP: 351 if(len >= 4) 352 { 353 if(*(p+2) == 0xc0 && *(p+3) == 0x25) 354 printf(" LQR"); 355 else 356 printf(" unknown"); 357 } 358 break; 359 case LCPOPT_MN: 360 if(len == 6) 361 { 362 printf("=%d", ((*(p+2) << 24) + (*(p+3) << 16) + (*(p+4) << 8) + (*(p+5)))); 363 } 364 break; 365 case LCPOPT_PFC: 366 printf(" PFC"); 367 break; 368 case LCPOPT_ACFC: 369 printf(" ACFC"); 370 break; 371 } 372 return(len); 373} 374 375/* CHAP */ 376 377static int 378handle_chap(const u_char *p, int length) 379{ 380 int x, j; 381 u_char *ptr; 382 383 x = *(p+4); 384 385 if((x >= CHAP_CODEMIN) && (x <= CHAP_CODEMAX)) 386 { 387 printf("%s", chapcode[x-1]); 388 } 389 else 390 { 391 printf("0x%02x", x); 392 return; 393 } 394 395 length -= 4; 396 397 switch(x) 398 { 399 case CHAP_CHAL: 400 case CHAP_RESP: 401 printf(", Value="); 402 x = *(p+8); /* value size */ 403 ptr = (u_char *)p+9; 404 while(--x >= 0) 405 printf("%02x", *ptr++); 406 x = length - *(p+8) - 1; 407 printf(", Name="); 408 while(--x >= 0) 409 printf("%c", *ptr++); 410 break; 411 } 412} 413 414/* PAP */ 415 416static int 417handle_pap(const u_char *p, int length) 418{ 419 int x, j; 420 u_char *ptr; 421 422 x = *(p+4); 423 424 if((x >= PAP_CODEMIN) && (x <= PAP_CODEMAX)) 425 { 426 printf("%s", papcode[x-1]); 427 } 428 else 429 { 430 printf("0x%02x", x); 431 return; 432 } 433 434 length -= 4; 435 436 switch(x) 437 { 438 case PAP_AREQ: 439 printf(", Peer-Id="); 440 x = *(p+8); /* peerid size */ 441 ptr = (u_char *)p+9; 442 while(--x >= 0) 443 printf("%c", *ptr++); 444 x = *ptr++; 445 printf(", Passwd="); 446 while(--x >= 0) 447 printf("%c", *ptr++); 448 break; 449 case PAP_AACK: 450 case PAP_ANAK: 451 break; 452 } 453} 454 455/* IPCP */ 456 457static int 458handle_ipcp(const u_char *p, int length) 459{ 460 int x, j; 461 462 x = *(p+8); 463 464 length -= 4; 465 466 switch(x) 467 { 468 case IPCP_2ADDR: 469 printf("IP-Addresses"); 470 printf(", Src=%d.%d.%d.%d", *(p+10), *(p+11), *(p+12), *(p+13)); 471 printf(", Dst=%d.%d.%d.%d", *(p+14), *(p+15), *(p+16), *(p+17)); 472 break; 473 474 case IPCP_CP: 475 printf("IP-Compression-Protocol"); 476 break; 477 478 case IPCP_ADDR: 479 printf("IP-Address=%d.%d.%d.%d", *(p+10), *(p+11), *(p+12), *(p+13)); 480 break; 481 } 482} 483 484void 485ppp_if_print(u_char *user, const struct pcap_pkthdr *h, 486 register const u_char *p) 487{ 488 register u_int length = h->len; 489 register u_int caplen = h->caplen; 490 491 ts_print(&h->ts); 492 493 if (caplen < PPP_HDRLEN) { 494 printf("[|ppp]"); 495 goto out; 496 } 497 498 /* 499 * Some printers want to get back at the link level addresses, 500 * and/or check that they're not walking off the end of the packet. 501 * Rather than pass them all the way down, we set these globals. 502 */ 503 packetp = p; 504 snapend = p + caplen; 505 506 if (eflag) 507 ppp_hdlc_print(p, length); 508 509 length -= PPP_HDRLEN; 510 511 switch(PPP_PROTOCOL(p)) { 512 case PPP_IP: 513 case ETHERTYPE_IP: 514 ip_print((const u_char *)(p + PPP_HDRLEN), length); 515 break; 516 case PPP_IPX: 517 case ETHERTYPE_IPX: 518 ipx_print((const u_char *)(p + PPP_HDRLEN), length); 519 break; 520 521 default: 522 if(!eflag) 523 ppp_hdlc_print(p, length); 524 if(!xflag) 525 default_print((const u_char *)(p + PPP_HDRLEN), 526 caplen - PPP_HDRLEN); 527 } 528 529 if (xflag) 530 default_print((const u_char *)(p + PPP_HDRLEN), 531 caplen - PPP_HDRLEN); 532out: 533 putchar('\n'); 534}
| 199void 200ppp_hdlc_print(const u_char *p, int length) 201{ 202 int proto = PPP_PROTOCOL(p); 203 int i, j, x; 204 u_char *ptr; 205 206 printf("ID-%03d ", *(p+5)); 207 208 for (i = (sizeof(protonames) / sizeof(protonames[0])) - 1; i >= 0; --i) 209 { 210 if (proto == protonames[i].protocol) 211 { 212 printf("%s: ", protonames[i].name); 213 214 switch(proto) 215 { 216 case PPP_LCP: 217 handle_lcp(p, length); 218 break; 219 case PPP_CHAP: 220 handle_chap(p, length); 221 break; 222 case PPP_PAP: 223 handle_pap(p, length); 224 break; 225 case PPP_IPCP: 226 handle_ipcp(p, length); 227 break; 228 } 229 break; 230 } 231 } 232 if (i < 0) 233 { 234 printf("%04x: ", proto); 235 } 236} 237 238/* print LCP frame */ 239 240static int 241handle_lcp(const u_char *p, int length) 242{ 243 int x, j; 244 u_char *ptr; 245 246 x = *(p+4); 247 248 if((x >= LCP_MIN) && (x <= LCP_MAX)) 249 { 250 printf("%s", lcpcodes[x-1]); 251 } 252 else 253 { 254 printf("0x%02x", x); 255 return; 256 } 257 258 length -= 4; 259 260 switch(x) 261 { 262 case LCP_CONF_REQ: 263 case LCP_CONF_ACK: 264 case LCP_CONF_NAK: 265 case LCP_CONF_REJ: 266 x = length; 267 ptr = (u_char *)p+8; 268 do 269 { 270 if((j = print_lcp_config_options(ptr)) == 0) 271 break; 272 x -= j; 273 ptr += j; 274 } 275 while(x > 0); 276 break; 277 278 case LCP_ECHO_REQ: 279 case LCP_ECHO_RPL: 280 printf(", Magic-Number=%d", ((*(p+8) << 24) + (*(p+9) << 16) + (*(p+10) << 8) + (*(p+11)))); 281 break; 282 case LCP_TERM_REQ: 283 case LCP_TERM_ACK: 284 case LCP_CODE_REJ: 285 case LCP_PROT_REJ: 286 case LCP_DISC_REQ: 287 default: 288 break; 289 } 290} 291 292/* LCP config options */ 293 294static int 295print_lcp_config_options(u_char *p) 296{ 297 int len = *(p+1); 298 int opt = *p; 299 300 if((opt >= LCPOPT_MIN) && (opt <= LCPOPT_MAX)) 301 printf(", %s", lcpconfopts[opt]); 302 303 switch(opt) 304 { 305 case LCPOPT_MRU: 306 if(len == 4) 307 printf("=%d", (*(p+2) << 8) + *(p+3)); 308 break; 309 case LCPOPT_AP: 310 if(len >= 4) 311 { 312 if(*(p+2) == 0xc0 && *(p+3) == 0x23) 313 { 314 printf(" PAP"); 315 } 316 else if(*(p+2) == 0xc2 && *(p+3) == 0x23) 317 { 318 printf(" CHAP/"); 319 switch(*(p+4)) 320 { 321 default: 322 printf("unknown-algorithm-%d", *(p+4)); 323 break; 324 case 5: 325 printf("MD5"); 326 break; 327 case 0x80: 328 printf("Microsoft"); 329 break; 330 } 331 } 332 else if(*(p+2) == 0xc2 && *(p+3) == 0x27) 333 { 334 printf(" EAP"); 335 } 336 else if(*(p+2) == 0xc0 && *(p+3) == 0x27) 337 { 338 printf(" SPAP"); 339 } 340 else if(*(p+2) == 0xc1 && *(p+3) == 0x23) 341 { 342 printf(" Old-SPAP"); 343 } 344 else 345 { 346 printf("unknown"); 347 } 348 } 349 break; 350 case LCPOPT_QP: 351 if(len >= 4) 352 { 353 if(*(p+2) == 0xc0 && *(p+3) == 0x25) 354 printf(" LQR"); 355 else 356 printf(" unknown"); 357 } 358 break; 359 case LCPOPT_MN: 360 if(len == 6) 361 { 362 printf("=%d", ((*(p+2) << 24) + (*(p+3) << 16) + (*(p+4) << 8) + (*(p+5)))); 363 } 364 break; 365 case LCPOPT_PFC: 366 printf(" PFC"); 367 break; 368 case LCPOPT_ACFC: 369 printf(" ACFC"); 370 break; 371 } 372 return(len); 373} 374 375/* CHAP */ 376 377static int 378handle_chap(const u_char *p, int length) 379{ 380 int x, j; 381 u_char *ptr; 382 383 x = *(p+4); 384 385 if((x >= CHAP_CODEMIN) && (x <= CHAP_CODEMAX)) 386 { 387 printf("%s", chapcode[x-1]); 388 } 389 else 390 { 391 printf("0x%02x", x); 392 return; 393 } 394 395 length -= 4; 396 397 switch(x) 398 { 399 case CHAP_CHAL: 400 case CHAP_RESP: 401 printf(", Value="); 402 x = *(p+8); /* value size */ 403 ptr = (u_char *)p+9; 404 while(--x >= 0) 405 printf("%02x", *ptr++); 406 x = length - *(p+8) - 1; 407 printf(", Name="); 408 while(--x >= 0) 409 printf("%c", *ptr++); 410 break; 411 } 412} 413 414/* PAP */ 415 416static int 417handle_pap(const u_char *p, int length) 418{ 419 int x, j; 420 u_char *ptr; 421 422 x = *(p+4); 423 424 if((x >= PAP_CODEMIN) && (x <= PAP_CODEMAX)) 425 { 426 printf("%s", papcode[x-1]); 427 } 428 else 429 { 430 printf("0x%02x", x); 431 return; 432 } 433 434 length -= 4; 435 436 switch(x) 437 { 438 case PAP_AREQ: 439 printf(", Peer-Id="); 440 x = *(p+8); /* peerid size */ 441 ptr = (u_char *)p+9; 442 while(--x >= 0) 443 printf("%c", *ptr++); 444 x = *ptr++; 445 printf(", Passwd="); 446 while(--x >= 0) 447 printf("%c", *ptr++); 448 break; 449 case PAP_AACK: 450 case PAP_ANAK: 451 break; 452 } 453} 454 455/* IPCP */ 456 457static int 458handle_ipcp(const u_char *p, int length) 459{ 460 int x, j; 461 462 x = *(p+8); 463 464 length -= 4; 465 466 switch(x) 467 { 468 case IPCP_2ADDR: 469 printf("IP-Addresses"); 470 printf(", Src=%d.%d.%d.%d", *(p+10), *(p+11), *(p+12), *(p+13)); 471 printf(", Dst=%d.%d.%d.%d", *(p+14), *(p+15), *(p+16), *(p+17)); 472 break; 473 474 case IPCP_CP: 475 printf("IP-Compression-Protocol"); 476 break; 477 478 case IPCP_ADDR: 479 printf("IP-Address=%d.%d.%d.%d", *(p+10), *(p+11), *(p+12), *(p+13)); 480 break; 481 } 482} 483 484void 485ppp_if_print(u_char *user, const struct pcap_pkthdr *h, 486 register const u_char *p) 487{ 488 register u_int length = h->len; 489 register u_int caplen = h->caplen; 490 491 ts_print(&h->ts); 492 493 if (caplen < PPP_HDRLEN) { 494 printf("[|ppp]"); 495 goto out; 496 } 497 498 /* 499 * Some printers want to get back at the link level addresses, 500 * and/or check that they're not walking off the end of the packet. 501 * Rather than pass them all the way down, we set these globals. 502 */ 503 packetp = p; 504 snapend = p + caplen; 505 506 if (eflag) 507 ppp_hdlc_print(p, length); 508 509 length -= PPP_HDRLEN; 510 511 switch(PPP_PROTOCOL(p)) { 512 case PPP_IP: 513 case ETHERTYPE_IP: 514 ip_print((const u_char *)(p + PPP_HDRLEN), length); 515 break; 516 case PPP_IPX: 517 case ETHERTYPE_IPX: 518 ipx_print((const u_char *)(p + PPP_HDRLEN), length); 519 break; 520 521 default: 522 if(!eflag) 523 ppp_hdlc_print(p, length); 524 if(!xflag) 525 default_print((const u_char *)(p + PPP_HDRLEN), 526 caplen - PPP_HDRLEN); 527 } 528 529 if (xflag) 530 default_print((const u_char *)(p + PPP_HDRLEN), 531 caplen - PPP_HDRLEN); 532out: 533 putchar('\n'); 534}
|
535#else 536#include <sys/types.h> 537#include <sys/time.h>
| |
538
| 535
|
539#include <stdio.h>
| 536/* proto type to string mapping */ 537static struct tok ptype2str[] = { 538 { PPP_VJC, "VJC" }, 539 { PPP_VJNC, "VJNC" }, 540 { PPP_OSI, "OSI" }, 541 { PPP_LCP, "LCP" }, 542 { PPP_IPCP, "IPCP" }, 543 { 0, NULL } 544};
|
540
| 545
|
541#include "interface.h"
| 546#define PPP_BSDI_HDRLEN 24 547 548/* BSD/OS specific PPP printer */
|
542void
| 549void
|
543ppp_if_print(u_char *user, const struct pcap_pkthdr *h, const u_char *p)
| 550ppp_bsdos_if_print(u_char *user, const struct pcap_pkthdr *h, 551 register const u_char *p)
|
544{
| 552{
|
545 error("not configured for ppp"); 546 /* NOTREACHED */
| 553 register u_int length = h->len; 554 register u_int caplen = h->caplen; 555 register int hdrlength; 556 u_short ptype; 557 558 ts_print(&h->ts); 559 560 if (caplen < PPP_BSDI_HDRLEN) { 561 printf("[|ppp]"); 562 goto out; 563 } 564 565 /* 566 * Some printers want to get back at the link level addresses, 567 * and/or check that they're not walking off the end of the packet. 568 * Rather than pass them all the way down, we set these globals. 569 */ 570 packetp = p; 571 snapend = p + caplen; 572 hdrlength = 0; 573 574 if (p[0] == PPP_ADDRESS && p[1] == PPP_CONTROL) { 575 if (eflag) 576 printf("%02x %02x ", p[0], p[1]); 577 p += 2; 578 hdrlength = 2; 579 } 580 581 if (eflag) 582 printf("%d ", length); 583 /* Retrieve the protocol type */ 584 if (*p & 01) { 585 /* Compressed protocol field */ 586 ptype = *p; 587 if (eflag) 588 printf("%02x ", ptype); 589 p++; 590 hdrlength += 1; 591 } else { 592 /* Un-compressed protocol field */ 593 ptype = ntohs(*(u_short *)p); 594 if (eflag) 595 printf("%04x ", ptype); 596 p += 2; 597 hdrlength += 2; 598 } 599 600 length -= hdrlength; 601 602 if (ptype == PPP_IP) 603 ip_print(p, length); 604 else 605 printf("%s ", tok2str(ptype2str, "proto-#%d", ptype)); 606 607 if (xflag) 608 default_print((const u_char *)p, caplen - hdrlength); 609out: 610 putchar('\n');
|
547}
| 611}
|
548#endif
| |
| |