PR: 7741
Submitted by: Hellmuth Michaelis <hm@kts.org> add LCP/PAP/CHAP/IPCP frame printing functionality
This commit is contained in:
parent
80c936833f
commit
3cf9b7ae04
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=38638
@ -64,10 +64,6 @@ static struct protonames protonames[] = {
|
||||
* Protocol field values.
|
||||
*/
|
||||
PPP_IP, "IP", /* Internet Protocol */
|
||||
#ifndef PPP_ISO
|
||||
#define PPP_ISO 0x23
|
||||
#endif
|
||||
PPP_ISO, "ISO", /* ISO 8473 */
|
||||
PPP_XNS, "XNS", /* Xerox NS */
|
||||
PPP_IPX, "IPX", /* IPX Datagram (RFC1552) */
|
||||
PPP_VJC_COMP, "VJC_UNCOMP", /* VJ compressed TCP */
|
||||
@ -82,24 +78,409 @@ static struct protonames protonames[] = {
|
||||
PPP_CHAP, "CHAP", /* Cryptographic Handshake Auth. Proto*/
|
||||
};
|
||||
|
||||
/* LCP */
|
||||
|
||||
#define LCP_CONF_REQ 1
|
||||
#define LCP_CONF_ACK 2
|
||||
#define LCP_CONF_NAK 3
|
||||
#define LCP_CONF_REJ 4
|
||||
#define LCP_TERM_REQ 5
|
||||
#define LCP_TERM_ACK 6
|
||||
#define LCP_CODE_REJ 7
|
||||
#define LCP_PROT_REJ 8
|
||||
#define LCP_ECHO_REQ 9
|
||||
#define LCP_ECHO_RPL 10
|
||||
#define LCP_DISC_REQ 11
|
||||
|
||||
#define LCP_MIN LCP_CONF_REQ
|
||||
#define LCP_MAX LCP_DISC_REQ
|
||||
|
||||
static char *lcpcodes[] = {
|
||||
/*
|
||||
* LCP code values (RFC1661, pp26)
|
||||
*/
|
||||
"Configure-Request",
|
||||
"Configure-Ack",
|
||||
"Configure-Nak",
|
||||
"Configure-Reject",
|
||||
"Terminate-Request",
|
||||
"Terminate-Ack",
|
||||
"Code-Reject",
|
||||
"Protocol-Reject",
|
||||
"Echo-Request",
|
||||
"Echo-Reply",
|
||||
"Discard-Request",
|
||||
};
|
||||
|
||||
#define LCPOPT_VEXT 0
|
||||
#define LCPOPT_MRU 1
|
||||
#define LCPOPT_ACCM 2
|
||||
#define LCPOPT_AP 3
|
||||
#define LCPOPT_QP 4
|
||||
#define LCPOPT_MN 5
|
||||
#define LCPOPT_PFC 7
|
||||
#define LCPOPT_ACFC 8
|
||||
|
||||
#define LCPOPT_MIN 0
|
||||
#define LCPOPT_MAX 24
|
||||
|
||||
static char *lcpconfopts[] = {
|
||||
"Vendor-Ext",
|
||||
"Max-Rx-Unit",
|
||||
"Async-Ctrl-Char-Map",
|
||||
"Auth-Prot",
|
||||
"Quality-Prot",
|
||||
"Magic-Number",
|
||||
"unassigned (6)",
|
||||
"Prot-Field-Compr",
|
||||
"Add-Ctrl-Field-Compr",
|
||||
"FCS-Alternatives",
|
||||
"Self-Describing-Pad",
|
||||
"Numbered-Mode",
|
||||
"Multi-Link-Procedure",
|
||||
"Call-Back",
|
||||
"Connect-Time"
|
||||
"Compund-Frames",
|
||||
"Nominal-Data-Encap",
|
||||
"Multilink-MRRU",
|
||||
"Multilink-SSNHF",
|
||||
"Multilink-ED",
|
||||
"Proprietary",
|
||||
"DCE-Identifier",
|
||||
"Multilink-Plus-Proc",
|
||||
"Link-Discriminator",
|
||||
"LCP-Auth-Option",
|
||||
};
|
||||
|
||||
/* CHAP */
|
||||
|
||||
#define CHAP_CHAL 1
|
||||
#define CHAP_RESP 2
|
||||
#define CHAP_SUCC 3
|
||||
#define CHAP_FAIL 4
|
||||
|
||||
#define CHAP_CODEMIN 1
|
||||
#define CHAP_CODEMAX 4
|
||||
|
||||
static char *chapcode[] = {
|
||||
"Challenge",
|
||||
"Response",
|
||||
"Success",
|
||||
"Failure",
|
||||
};
|
||||
|
||||
/* PAP */
|
||||
|
||||
#define PAP_AREQ 1
|
||||
#define PAP_AACK 2
|
||||
#define PAP_ANAK 3
|
||||
|
||||
#define PAP_CODEMIN 1
|
||||
#define PAP_CODEMAX 3
|
||||
|
||||
static char *papcode[] = {
|
||||
"Authenticate-Request",
|
||||
"Authenticate-Ack",
|
||||
"Authenticate-Nak",
|
||||
};
|
||||
|
||||
/* IPCP */
|
||||
|
||||
#define IPCP_2ADDR 1
|
||||
#define IPCP_CP 2
|
||||
#define IPCP_ADDR 3
|
||||
|
||||
static int handle_lcp(const u_char *p, int length);
|
||||
static int print_lcp_config_options(u_char *p);
|
||||
static int handle_chap(const u_char *p, int length);
|
||||
static int handle_ipcp(const u_char *p, int length);
|
||||
static int handle_pap(const u_char *p, int length);
|
||||
|
||||
void
|
||||
ppp_hdlc_print(const u_char *p, int length)
|
||||
{
|
||||
int proto = PPP_PROTOCOL(p);
|
||||
int i;
|
||||
int i, j, x;
|
||||
u_char *ptr;
|
||||
|
||||
printf("%4d %02x ", length, PPP_CONTROL(p));
|
||||
|
||||
for (i = (sizeof(protonames) / sizeof(protonames[0])) - 1; i >= 0; --i){
|
||||
if (proto == protonames[i].protocol) {
|
||||
printf("ID-%03d ", *(p+5));
|
||||
|
||||
for (i = (sizeof(protonames) / sizeof(protonames[0])) - 1; i >= 0; --i)
|
||||
{
|
||||
if (proto == protonames[i].protocol)
|
||||
{
|
||||
printf("%s: ", protonames[i].name);
|
||||
|
||||
switch(proto)
|
||||
{
|
||||
case PPP_LCP:
|
||||
handle_lcp(p, length);
|
||||
break;
|
||||
case PPP_CHAP:
|
||||
handle_chap(p, length);
|
||||
break;
|
||||
case PPP_PAP:
|
||||
handle_pap(p, length);
|
||||
break;
|
||||
case PPP_IPCP:
|
||||
handle_ipcp(p, length);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (i < 0)
|
||||
{
|
||||
printf("%04x: ", proto);
|
||||
}
|
||||
}
|
||||
|
||||
/* print LCP frame */
|
||||
|
||||
static int
|
||||
handle_lcp(const u_char *p, int length)
|
||||
{
|
||||
int x, j;
|
||||
u_char *ptr;
|
||||
|
||||
x = *(p+4);
|
||||
|
||||
if((x >= LCP_MIN) && (x <= LCP_MAX))
|
||||
{
|
||||
printf("%s", lcpcodes[x-1]);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("0x%02x", x);
|
||||
return;
|
||||
}
|
||||
|
||||
length -= 4;
|
||||
|
||||
switch(x)
|
||||
{
|
||||
case LCP_CONF_REQ:
|
||||
case LCP_CONF_ACK:
|
||||
case LCP_CONF_NAK:
|
||||
case LCP_CONF_REJ:
|
||||
x = length;
|
||||
ptr = (u_char *)p+8;
|
||||
do
|
||||
{
|
||||
if((j = print_lcp_config_options(ptr)) == 0)
|
||||
break;
|
||||
x -= j;
|
||||
ptr += j;
|
||||
}
|
||||
while(x > 0);
|
||||
break;
|
||||
|
||||
case LCP_ECHO_REQ:
|
||||
case LCP_ECHO_RPL:
|
||||
printf(", Magic-Number=%d", ((*(p+8) << 24) + (*(p+9) << 16) + (*(p+10) << 8) + (*(p+11))));
|
||||
break;
|
||||
case LCP_TERM_REQ:
|
||||
case LCP_TERM_ACK:
|
||||
case LCP_CODE_REJ:
|
||||
case LCP_PROT_REJ:
|
||||
case LCP_DISC_REQ:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* LCP config options */
|
||||
|
||||
static int
|
||||
print_lcp_config_options(u_char *p)
|
||||
{
|
||||
int len = *(p+1);
|
||||
int opt = *p;
|
||||
|
||||
if((opt >= LCPOPT_MIN) && (opt <= LCPOPT_MAX))
|
||||
printf(", %s", lcpconfopts[opt]);
|
||||
|
||||
switch(opt)
|
||||
{
|
||||
case LCPOPT_MRU:
|
||||
if(len == 4)
|
||||
printf("=%d", (*(p+2) << 8) + *(p+3));
|
||||
break;
|
||||
case LCPOPT_AP:
|
||||
if(len >= 4)
|
||||
{
|
||||
if(*(p+2) == 0xc0 && *(p+3) == 0x23)
|
||||
{
|
||||
printf(" PAP");
|
||||
}
|
||||
else if(*(p+2) == 0xc2 && *(p+3) == 0x23)
|
||||
{
|
||||
printf(" CHAP/");
|
||||
switch(*(p+4))
|
||||
{
|
||||
default:
|
||||
printf("unknown-algorithm-%d", *(p+4));
|
||||
break;
|
||||
case 5:
|
||||
printf("MD5");
|
||||
break;
|
||||
case 0x80:
|
||||
printf("Microsoft");
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if(*(p+2) == 0xc2 && *(p+3) == 0x27)
|
||||
{
|
||||
printf(" EAP");
|
||||
}
|
||||
else if(*(p+2) == 0xc0 && *(p+3) == 0x27)
|
||||
{
|
||||
printf(" SPAP");
|
||||
}
|
||||
else if(*(p+2) == 0xc1 && *(p+3) == 0x23)
|
||||
{
|
||||
printf(" Old-SPAP");
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("unknown");
|
||||
}
|
||||
}
|
||||
break;
|
||||
case LCPOPT_QP:
|
||||
if(len >= 4)
|
||||
{
|
||||
if(*(p+2) == 0xc0 && *(p+3) == 0x25)
|
||||
printf(" LQR");
|
||||
else
|
||||
printf(" unknown");
|
||||
}
|
||||
break;
|
||||
case LCPOPT_MN:
|
||||
if(len == 6)
|
||||
{
|
||||
printf("=%d", ((*(p+2) << 24) + (*(p+3) << 16) + (*(p+4) << 8) + (*(p+5))));
|
||||
}
|
||||
break;
|
||||
case LCPOPT_PFC:
|
||||
printf(" PFC");
|
||||
break;
|
||||
case LCPOPT_ACFC:
|
||||
printf(" ACFC");
|
||||
break;
|
||||
}
|
||||
return(len);
|
||||
}
|
||||
|
||||
/* CHAP */
|
||||
|
||||
static int
|
||||
handle_chap(const u_char *p, int length)
|
||||
{
|
||||
int x, j;
|
||||
u_char *ptr;
|
||||
|
||||
x = *(p+4);
|
||||
|
||||
if((x >= CHAP_CODEMIN) && (x <= CHAP_CODEMAX))
|
||||
{
|
||||
printf("%s", chapcode[x-1]);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("0x%02x", x);
|
||||
return;
|
||||
}
|
||||
|
||||
length -= 4;
|
||||
|
||||
switch(x)
|
||||
{
|
||||
case CHAP_CHAL:
|
||||
case CHAP_RESP:
|
||||
printf(", Value=");
|
||||
x = *(p+8); /* value size */
|
||||
ptr = (u_char *)p+9;
|
||||
while(--x >= 0)
|
||||
printf("%02x", *ptr++);
|
||||
x = length - *(p+8) - 1;
|
||||
printf(", Name=");
|
||||
while(--x >= 0)
|
||||
printf("%c", *ptr++);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* PAP */
|
||||
|
||||
static int
|
||||
handle_pap(const u_char *p, int length)
|
||||
{
|
||||
int x, j;
|
||||
u_char *ptr;
|
||||
|
||||
x = *(p+4);
|
||||
|
||||
if((x >= PAP_CODEMIN) && (x <= PAP_CODEMAX))
|
||||
{
|
||||
printf("%s", papcode[x-1]);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("0x%02x", x);
|
||||
return;
|
||||
}
|
||||
|
||||
length -= 4;
|
||||
|
||||
switch(x)
|
||||
{
|
||||
case PAP_AREQ:
|
||||
printf(", Peer-Id=");
|
||||
x = *(p+8); /* peerid size */
|
||||
ptr = (u_char *)p+9;
|
||||
while(--x >= 0)
|
||||
printf("%c", *ptr++);
|
||||
x = *ptr++;
|
||||
printf(", Passwd=");
|
||||
while(--x >= 0)
|
||||
printf("%c", *ptr++);
|
||||
break;
|
||||
case PAP_AACK:
|
||||
case PAP_ANAK:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* IPCP */
|
||||
|
||||
static int
|
||||
handle_ipcp(const u_char *p, int length)
|
||||
{
|
||||
int x, j;
|
||||
|
||||
x = *(p+8);
|
||||
|
||||
length -= 4;
|
||||
|
||||
switch(x)
|
||||
{
|
||||
case IPCP_2ADDR:
|
||||
printf("IP-Addresses");
|
||||
printf(", Src=%d.%d.%d.%d", *(p+10), *(p+11), *(p+12), *(p+13));
|
||||
printf(", Dst=%d.%d.%d.%d", *(p+14), *(p+15), *(p+16), *(p+17));
|
||||
break;
|
||||
|
||||
case IPCP_CP:
|
||||
printf("IP-Compression-Protocol");
|
||||
break;
|
||||
|
||||
case IPCP_ADDR:
|
||||
printf("IP-Address=%d.%d.%d.%d", *(p+10), *(p+11), *(p+12), *(p+13));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
ppp_if_print(u_char *user, const struct pcap_pkthdr *h,
|
||||
register const u_char *p)
|
||||
@ -107,24 +488,6 @@ ppp_if_print(u_char *user, const struct pcap_pkthdr *h,
|
||||
register u_int length = h->len;
|
||||
register u_int caplen = h->caplen;
|
||||
|
||||
int frame_relay = 0;
|
||||
int proto = PPP_CONTROL(p);
|
||||
|
||||
if(caplen > length) caplen = length;
|
||||
|
||||
/*
|
||||
* Check to see if this is a frame-relay, we have to do this
|
||||
* because BPF could not differentiate between PPP and Framerelay
|
||||
* link types.
|
||||
*/
|
||||
|
||||
frame_relay = (fr_addr_len(p) >= 2);
|
||||
|
||||
if(frame_relay) {
|
||||
fr_if_print(user, h, p);
|
||||
return;
|
||||
}
|
||||
|
||||
ts_print(&h->ts);
|
||||
|
||||
if (caplen < PPP_HDRLEN) {
|
||||
@ -154,18 +517,10 @@ ppp_if_print(u_char *user, const struct pcap_pkthdr *h,
|
||||
case ETHERTYPE_IPX:
|
||||
ipx_print((const u_char *)(p + PPP_HDRLEN), length);
|
||||
break;
|
||||
|
||||
case PPP_ISO:
|
||||
isoclns_print((const u_char *)(p + PPP_HDRLEN), length,
|
||||
caplen, "000000", "000000");
|
||||
break;
|
||||
|
||||
default:
|
||||
if(!eflag) {
|
||||
if (frame_relay)
|
||||
fr_hdlc_print(p, length);
|
||||
else
|
||||
ppp_hdlc_print(p, length);
|
||||
}
|
||||
if(!eflag)
|
||||
ppp_hdlc_print(p, length);
|
||||
if(!xflag)
|
||||
default_print((const u_char *)(p + PPP_HDRLEN),
|
||||
caplen - PPP_HDRLEN);
|
||||
|
Loading…
Reference in New Issue
Block a user