import updates from 2.2.x including ipv6 stuff;
change if_ppp.h so pppd can compile with glibc 2.1
-/* $Id: if_ppp.h,v 1.15 1999/01/19 23:57:43 paulus Exp $ */
+/* $Id: if_ppp.h,v 1.16 1999/02/26 06:48:20 paulus Exp $ */
/*
* if_ppp.h - Point-to-Point Protocol definitions.
/*
* if_ppp.h - Point-to-Point Protocol definitions.
- * ==FILEVERSION 980704==
+ * ==FILEVERSION 990226==
*
* NOTE TO MAINTAINERS:
* If you modify this file at all, please set the above date.
*
* NOTE TO MAINTAINERS:
* If you modify this file at all, please set the above date.
#ifndef _IF_PPP_H_
#define _IF_PPP_H_
#ifndef _IF_PPP_H_
#define _IF_PPP_H_
#include <linux/if.h>
#include <linux/ioctl.h>
#include <linux/ppp_defs.h>
#include <linux/if.h>
#include <linux/ioctl.h>
#include <linux/ppp_defs.h>
- * ==FILEVERSION 981004==
+ * ==FILEVERSION 990114==
*
* NOTE TO MAINTAINERS:
* If you modify this file at all, please set the above date.
*
* NOTE TO MAINTAINERS:
* If you modify this file at all, please set the above date.
#define NP_IP 0 /* Internet Protocol */
#define NP_IPX 1 /* IPX protocol */
#define NP_AT 2 /* Appletalk protocol */
#define NP_IP 0 /* Internet Protocol */
#define NP_IPX 1 /* IPX protocol */
#define NP_AT 2 /* Appletalk protocol */
-#define NUM_NP 3 /* Number of NPs. */
+#define NP_IPV6 3 /* Internet Protocol */
+#define NUM_NP 4 /* Number of NPs. */
#define OBUFSIZE 256 /* # chars of output buffering */
#define OBUFSIZE 256 /* # chars of output buffering */
-/* $Id: ppp_defs.h,v 1.7 1997/07/14 03:50:51 paulus Exp $ */
+/* $Id: ppp_defs.h,v 1.8 1999/02/26 06:48:21 paulus Exp $ */
/*
* ppp_defs.h - PPP definitions.
/*
* ppp_defs.h - PPP definitions.
- * ==FILEVERSION 970607==
+ * ==FILEVERSION 990114==
*
* NOTE TO MAINTAINERS:
* If you modify this file at all, please set the above date.
*
* NOTE TO MAINTAINERS:
* If you modify this file at all, please set the above date.
#define PPP_IPCP 0x8021 /* IP Control Protocol */
#define PPP_ATCP 0x8029 /* AppleTalk Control Protocol */
#define PPP_IPXCP 0x802b /* IPX Control Protocol */
#define PPP_IPCP 0x8021 /* IP Control Protocol */
#define PPP_ATCP 0x8029 /* AppleTalk Control Protocol */
#define PPP_IPXCP 0x802b /* IPX Control Protocol */
+#define PPP_IPV6CP 0x8057 /* IPv6 Control Protocol */
#define PPP_CCP 0x80fd /* Compression Control Protocol */
#define PPP_LCP 0xc021 /* Link Control Protocol */
#define PPP_PAP 0xc023 /* Password Authentication Protocol */
#define PPP_CCP 0x80fd /* Compression Control Protocol */
#define PPP_LCP 0xc021 /* Link Control Protocol */
#define PPP_PAP 0xc023 /* Password Authentication Protocol */
-/* $Id: if_ppp.h,v 1.15 1999/01/19 23:57:43 paulus Exp $ */
+/* $Id: if_ppp.h,v 1.16 1999/02/26 06:48:20 paulus Exp $ */
/*
* if_ppp.h - Point-to-Point Protocol definitions.
/*
* if_ppp.h - Point-to-Point Protocol definitions.
- * ==FILEVERSION 980704==
+ * ==FILEVERSION 990226==
*
* NOTE TO MAINTAINERS:
* If you modify this file at all, please set the above date.
*
* NOTE TO MAINTAINERS:
* If you modify this file at all, please set the above date.
#ifndef _IF_PPP_H_
#define _IF_PPP_H_
#ifndef _IF_PPP_H_
#define _IF_PPP_H_
#include <linux/if.h>
#include <linux/ioctl.h>
#include <linux/ppp_defs.h>
#include <linux/if.h>
#include <linux/ioctl.h>
#include <linux/ppp_defs.h>
- * ==FILEVERSION 981004==
+ * ==FILEVERSION 990114==
*
* NOTE TO MAINTAINERS:
* If you modify this file at all, please set the above date.
*
* NOTE TO MAINTAINERS:
* If you modify this file at all, please set the above date.
#define NP_IP 0 /* Internet Protocol */
#define NP_IPX 1 /* IPX protocol */
#define NP_AT 2 /* Appletalk protocol */
#define NP_IP 0 /* Internet Protocol */
#define NP_IPX 1 /* IPX protocol */
#define NP_AT 2 /* Appletalk protocol */
-#define NUM_NP 3 /* Number of NPs. */
+#define NP_IPV6 3 /* Internet Protocol */
+#define NUM_NP 4 /* Number of NPs. */
#define OBUFSIZE 256 /* # chars of output buffering */
#define OBUFSIZE 256 /* # chars of output buffering */
* Al Longyear <longyear@netcom.com>
* Extensively rewritten by Paul Mackerras <paulus@cs.anu.edu.au>
*
* Al Longyear <longyear@netcom.com>
* Extensively rewritten by Paul Mackerras <paulus@cs.anu.edu.au>
*
- * ==FILEVERSION 981004==
+ * ==FILEVERSION 990114==
*
* NOTE TO MAINTAINERS:
* If you modify this file at all, please set the number above to the
*
* NOTE TO MAINTAINERS:
* If you modify this file at all, please set the number above to the
#define PPP_MAX_RCV_QLEN 32 /* max # frames we queue up for pppd */
#define PPP_MAX_RCV_QLEN 32 /* max # frames we queue up for pppd */
-/* $Id: ppp.c,v 1.20 1999/01/19 23:57:44 paulus Exp $ */
+/* $Id: ppp.c,v 1.21 1999/02/26 06:48:21 paulus Exp $ */
#include <linux/version.h>
#include <linux/config.h>
#include <linux/version.h>
#include <linux/config.h>
#include <linux/kerneld.h>
#endif
#include <linux/kerneld.h>
#endif
-#define PPP_VERSION "2.3.5"
+#undef PPP_VERSION
+#define PPP_VERSION "2.3.6"
#if LINUX_VERSION_CODE >= VERSION(2,1,4)
#if LINUX_VERSION_CODE >= VERSION(2,1,4)
#endif
#if LINUX_VERSION_CODE < VERSION(2,1,57)
#endif
#if LINUX_VERSION_CODE < VERSION(2,1,57)
-#define signal_pending(tsk) ((tsk)->pending & ~(tsk)->blocked)
+#define signal_pending(tsk) ((tsk)->signal & ~(tsk)->blocked)
#endif
#if LINUX_VERSION_CODE < VERSION(2,1,60)
#endif
#if LINUX_VERSION_CODE < VERSION(2,1,60)
typedef size_t rw_count_t;
#endif
typedef size_t rw_count_t;
#endif
+#if LINUX_VERSION_CODE < VERSION(2,1,86)
+#define KFREE_SKB(s) dev_kfree_skb((s), FREE_WRITE)
+#else
+#define KFREE_SKB(s) kfree_skb(s)
+#endif
+
+#if LINUX_VERSION_CODE < VERSION(2,1,15)
+#define LIBERATE_SKB(s) ((s)->free = 1)
+#else
+#define LIBERATE_SKB(s) do { } while (0)
+#endif
+
+#if LINUX_VERSION_CODE < VERSION(2,1,95)
+#define SUSER() suser()
+#else
+#define SUSER() capable(CAP_NET_ADMIN)
+#endif
+
#include <linux/symtab_begin.h>
X(ppp_register_compressor),
X(ppp_unregister_compressor),
#include <linux/symtab_begin.h>
X(ppp_register_compressor),
X(ppp_unregister_compressor),
#include <linux/symtab_end.h>
};
#else
#include <linux/symtab_end.h>
};
#else
0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
};
0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
};
-EXPORT_SYMBOL(ppp_crc16_table);
#ifdef CHECK_CHARACTERS
static __u32 paritytab[8] =
#ifdef CHECK_CHARACTERS
static __u32 paritytab[8] =
*/
(void) memset (&ppp_ldisc, 0, sizeof (ppp_ldisc));
ppp_ldisc.magic = TTY_LDISC_MAGIC;
*/
(void) memset (&ppp_ldisc, 0, sizeof (ppp_ldisc));
ppp_ldisc.magic = TTY_LDISC_MAGIC;
+#if LINUX_VERSION_CODE >= VERSION(2,1,28)
ppp_ldisc.open = ppp_tty_open;
ppp_ldisc.close = ppp_tty_close;
ppp_ldisc.read = ppp_tty_read;
ppp_ldisc.open = ppp_tty_open;
ppp_ldisc.close = ppp_tty_close;
ppp_ldisc.read = ppp_tty_read;
struct sk_buff *skb;
if ((skb = ppp->rpkt) != NULL)
struct sk_buff *skb;
if ((skb = ppp->rpkt) != NULL)
ppp->rpkt = NULL;
if ((skb = ppp->tpkt) != NULL)
ppp->rpkt = NULL;
if ((skb = ppp->tpkt) != NULL)
if (file->f_flags & O_NONBLOCK)
break;
if (file->f_flags & O_NONBLOCK)
break;
interruptible_sleep_on(&ppp->read_wait);
err = -EINTR;
if (signal_pending(current))
interruptible_sleep_on(&ppp->read_wait);
err = -EINTR;
if (signal_pending(current))
printk(KERN_ERR "ppp_tty_write: no memory\n");
return 0;
}
printk(KERN_ERR "ppp_tty_write: no memory\n");
return 0;
}
new_data = skb_put(skb, count);
/*
* Retrieve the user's buffer
*/
if (COPY_FROM_USER(new_data, data, count)) {
new_data = skb_put(skb, count);
/*
* Retrieve the user's buffer
*/
if (COPY_FROM_USER(new_data, data, count)) {
/*
* The user must have an euid of root to do these requests.
*/
/*
* The user must have an euid of root to do these requests.
*/
- if (!capable(CAP_NET_ADMIN))
return -EPERM;
switch (param2) {
return -EPERM;
switch (param2) {
ppp->tty_pushing = 1;
ppp->stats.ppp_oerrors++;
if (ppp->tpkt != 0) {
ppp->tty_pushing = 1;
ppp->stats.ppp_oerrors++;
if (ppp->tpkt != 0) {
ppp->tpkt = 0;
done = 1;
}
ppp->tpkt = 0;
done = 1;
}
*buf++ = PPP_FLAG;
ppp->olim = buf;
*buf++ = PPP_FLAG;
ppp->olim = buf;
ppp->tpkt = 0;
return 1;
}
ppp->tpkt = 0;
return 1;
}
"ppp: tossing frame (%x)\n",
ppp->toss);
if (skb != NULL)
"ppp: tossing frame (%x)\n",
ppp->toss);
if (skb != NULL)
if (!(ppp->toss == 0xE0 || ppp->toss == 0x80))
++ppp->stats.ppp_ierrors;
ppp_receive_error(ppp);
if (!(ppp->toss == 0xE0 || ppp->toss == 0x80))
++ppp->stats.ppp_ierrors;
ppp_receive_error(ppp);
ppp->toss = 1;
continue;
}
ppp->toss = 1;
continue;
}
ppp->toss = 0xC0;
if (ppp->flags & SC_DEBUG)
printk(KERN_DEBUG "rcv frame too long: "
ppp->toss = 0xC0;
if (ppp->flags & SC_DEBUG)
printk(KERN_DEBUG "rcv frame too long: "
- "len=%d mru=%d hroom=%d troom=%d\n",
+ "len=%ld mru=%d hroom=%d troom=%d\n",
skb->len, ppp->mru, skb_headroom(skb),
skb_tailroom(skb));
continue;
skb->len, ppp->mru, skb_headroom(skb),
skb_tailroom(skb));
continue;
} ppp_proto_type;
static int rcv_proto_ip (struct ppp *, struct sk_buff *);
} ppp_proto_type;
static int rcv_proto_ip (struct ppp *, struct sk_buff *);
+static int rcv_proto_ipv6 (struct ppp *, struct sk_buff *);
static int rcv_proto_ipx (struct ppp *, struct sk_buff *);
static int rcv_proto_at (struct ppp *, struct sk_buff *);
static int rcv_proto_vjc_comp (struct ppp *, struct sk_buff *);
static int rcv_proto_ipx (struct ppp *, struct sk_buff *);
static int rcv_proto_at (struct ppp *, struct sk_buff *);
static int rcv_proto_vjc_comp (struct ppp *, struct sk_buff *);
static
ppp_proto_type proto_list[] = {
{ PPP_IP, rcv_proto_ip },
static
ppp_proto_type proto_list[] = {
{ PPP_IP, rcv_proto_ip },
+ { PPP_IPV6, rcv_proto_ipv6 },
{ PPP_IPX, rcv_proto_ipx },
{ PPP_AT, rcv_proto_at },
{ PPP_VJC_COMP, rcv_proto_vjc_comp },
{ PPP_IPX, rcv_proto_ipx },
{ PPP_AT, rcv_proto_at },
{ PPP_VJC_COMP, rcv_proto_vjc_comp },
/*
* The user must have an euid of root to do these requests.
*/
/*
* The user must have an euid of root to do these requests.
*/
- if (!capable(CAP_NET_ADMIN))
return -EPERM;
switch (param2) {
return -EPERM;
switch (param2) {
if (skb == NULL)
return 1;
if (skb->len == 0) {
if (skb == NULL)
return 1;
if (skb->len == 0) {
return 1;
}
data = skb->data;
return 1;
}
data = skb->data;
printk(KERN_ERR "ppp_recv_frame: no memory\n");
new_count = DECOMP_ERROR;
} else {
printk(KERN_ERR "ppp_recv_frame: no memory\n");
new_count = DECOMP_ERROR;
} else {
new_count = (*ppp->sc_rcomp->decompress)
(ppp->sc_rc_state, data, count,
new_skb->data, ppp->mru + PPP_HDRLEN);
}
if (new_count > 0) {
/* Frame was decompressed OK */
new_count = (*ppp->sc_rcomp->decompress)
(ppp->sc_rc_state, data, count,
new_skb->data, ppp->mru + PPP_HDRLEN);
}
if (new_count > 0) {
/* Frame was decompressed OK */
skb = new_skb;
count = new_count;
data = skb_put(skb, count);
skb = new_skb;
count = new_count;
data = skb_put(skb, count);
printk(KERN_INFO "%s: decomp err %d\n",
ppp->name, new_count);
if (new_skb != 0)
printk(KERN_INFO "%s: decomp err %d\n",
ppp->name, new_count);
if (new_skb != 0)
if (ppp->slcomp != 0)
slhc_toss(ppp->slcomp);
++ppp->stats.ppp_ierrors;
if (ppp->slcomp != 0)
slhc_toss(ppp->slcomp);
++ppp->stats.ppp_ierrors;
* Update the appropriate statistic counter.
*/
if (!(*proto_ptr->func)(ppp, skb)) {
* Update the appropriate statistic counter.
*/
if (!(*proto_ptr->func)(ppp, skb)) {
++ppp->stats.ppp_discards;
}
++ppp->stats.ppp_discards;
}
skb_pull(skb, PPP_HDRLEN); /* pull off ppp header */
skb->mac.raw = skb->data;
ppp->last_recv = jiffies;
skb_pull(skb, PPP_HDRLEN); /* pull off ppp header */
skb->mac.raw = skb->data;
ppp->last_recv = jiffies;
-#if LINUX_VERSION_CODE < VERSION(2,1,15)
- skb->free = 1;
-#endif
netif_rx (skb);
return 1;
}
netif_rx (skb);
return 1;
}
+/*
+ * Process the receipt of an IPv6 frame
+ */
+static int
+rcv_proto_ipv6(struct ppp *ppp, struct sk_buff *skb)
+{
+ CHECK_PPP(0);
+ if ((ppp2dev(ppp)->flags & IFF_UP) && (skb->len > 0)
+ && ppp->sc_npmode[NP_IPV6] == NPMODE_PASS)
+ return ppp_rcv_rx(ppp, ETH_P_IPV6, skb);
+ return 0;
+}
+
/*
* Process the receipt of an IPX frame
*/
/*
* Process the receipt of an IPX frame
*/
return 0;
new_count = slhc_uncompress(ppp->slcomp, skb->data + PPP_HDRLEN,
skb->len - PPP_HDRLEN);
return 0;
new_count = slhc_uncompress(ppp->slcomp, skb->data + PPP_HDRLEN,
skb->len - PPP_HDRLEN);
if (ppp->flags & SC_DEBUG)
printk(KERN_NOTICE
"ppp: error in VJ decompression\n");
return 0;
}
if (ppp->flags & SC_DEBUG)
printk(KERN_NOTICE
"ppp: error in VJ decompression\n");
return 0;
}
- skb_put(skb, new_count + PPP_HDRLEN - skb->len);
+ new_count += PPP_HDRLEN;
+ if (new_count > skb->len)
+ skb_put(skb, new_count - skb->len);
+ else
+ skb_trim(skb, new_count);
return rcv_proto_ip(ppp, skb);
}
return rcv_proto_ip(ppp, skb);
}
while (ppp->rcv_q.qlen > PPP_MAX_RCV_QLEN) {
struct sk_buff *skb = skb_dequeue(&ppp->rcv_q);
if (skb)
while (ppp->rcv_q.qlen > PPP_MAX_RCV_QLEN) {
struct sk_buff *skb = skb_dequeue(&ppp->rcv_q);
if (skb)
}
wake_up_interruptible (&ppp->read_wait);
}
wake_up_interruptible (&ppp->read_wait);
new_skb = alloc_skb(ppp->mtu + PPP_HDRLEN, GFP_ATOMIC);
if (new_skb == NULL) {
printk(KERN_ERR "ppp_send_frame: no memory\n");
new_skb = alloc_skb(ppp->mtu + PPP_HDRLEN, GFP_ATOMIC);
if (new_skb == NULL) {
printk(KERN_ERR "ppp_send_frame: no memory\n");
ppp->xmit_busy = 0;
return;
}
ppp->xmit_busy = 0;
return;
}
/* Compress the frame. */
new_count = (*ppp->sc_xcomp->compress)
/* Compress the frame. */
new_count = (*ppp->sc_xcomp->compress)
/* Did it compress? */
if (new_count > 0 && (ppp->flags & SC_CCP_UP)) {
skb_put(new_skb, new_count);
/* Did it compress? */
if (new_count > 0 && (ppp->flags & SC_CCP_UP)) {
skb_put(new_skb, new_count);
skb = new_skb;
} else {
/*
* The frame could not be compressed, or it could not
* be sent in compressed form because CCP is down.
*/
skb = new_skb;
} else {
/*
* The frame could not be compressed, or it could not
* be sent in compressed form because CCP is down.
*/
printk(KERN_ERR "ppp: no memory for vj compression\n");
return skb;
}
printk(KERN_ERR "ppp: no memory for vj compression\n");
return skb;
}
orig_data = data = skb->data + PPP_HDRLEN;
len = slhc_compress(ppp->slcomp, data, skb->len - PPP_HDRLEN,
orig_data = data = skb->data + PPP_HDRLEN;
len = slhc_compress(ppp->slcomp, data, skb->len - PPP_HDRLEN,
if (data == orig_data) {
/* Couldn't compress the data */
if (data == orig_data) {
/* Couldn't compress the data */
data[2] = 0;
data[3] = proto;
data[2] = 0;
data[3] = proto;
if (skb == NULL)
return 0;
if (skb->data == NULL) {
if (skb == NULL)
return 0;
if (skb->data == NULL) {
* queued to be sent.
*/
if (!ppp->inuse) {
* queued to be sent.
*/
if (!ppp->inuse) {
printk(KERN_ERR
"ppp_dev_xmit: %s not connected to a TTY!\n",
dev->name);
printk(KERN_ERR
"ppp_dev_xmit: %s not connected to a TTY!\n",
dev->name);
proto = PPP_IP;
npmode = ppp->sc_npmode[NP_IP];
break;
proto = PPP_IP;
npmode = ppp->sc_npmode[NP_IP];
break;
+ case ETH_P_IPV6:
+ proto = PPP_IPV6;
+ npmode = ppp->sc_npmode[NP_IPV6];
+ break;
case ETH_P_IPX:
proto = PPP_IPX;
npmode = ppp->sc_npmode[NP_IPX];
case ETH_P_IPX:
proto = PPP_IPX;
npmode = ppp->sc_npmode[NP_IPX];
if (ppp->flags & SC_DEBUG)
printk(KERN_INFO "%s: packet for unknown proto %x\n",
ppp->name, ntohs(skb->protocol));
if (ppp->flags & SC_DEBUG)
printk(KERN_INFO "%s: packet for unknown proto %x\n",
ppp->name, ntohs(skb->protocol));
*/
if (ppp->flags & SC_DEBUG)
printk(KERN_DEBUG "%s: returning frame\n", ppp->name);
*/
if (ppp->flags & SC_DEBUG)
printk(KERN_DEBUG "%s: returning frame\n", ppp->name);
return 0;
case NPMODE_ERROR:
return 0;
case NPMODE_ERROR:
printk(KERN_DEBUG
"ppp_dev_xmit: dropping (npmode = %d) on %s\n",
npmode, ppp->name);
printk(KERN_DEBUG
"ppp_dev_xmit: dropping (npmode = %d) on %s\n",
npmode, ppp->name);
if (new_skb == NULL) {
printk(KERN_ERR "%s: skb hdr alloc failed\n",
ppp->name);
if (new_skb == NULL) {
printk(KERN_ERR "%s: skb hdr alloc failed\n",
ppp->name);
ppp->xmit_busy = 0;
ppp_send_frames(ppp);
return 0;
}
ppp->xmit_busy = 0;
ppp_send_frames(ppp);
return 0;
}
skb_reserve(new_skb, PPP_HDRLEN);
memcpy(skb_put(new_skb, skb->len), skb->data, skb->len);
skb_reserve(new_skb, PPP_HDRLEN);
memcpy(skb_put(new_skb, skb->len), skb->data, skb->len);
*/
dev = ppp2dev(ppp);
dev->name = ppp->name;
*/
dev = ppp2dev(ppp);
dev->name = ppp->name;
+#if LINUX_VERSION_CODE < VERSION(2,1,31)
+ if_num = (ppp_list == 0)? 0: ppp_last->line + 1;
+ sprintf(ppp->name, "ppp%d", if_num);
+#else
if_num = dev_alloc_name(dev, "ppp%d");
if_num = dev_alloc_name(dev, "ppp%d");
if (if_num < 0) {
printk(KERN_ERR "ppp: dev_alloc_name failed (%d)\n", if_num);
kfree(ppp);
if (if_num < 0) {
printk(KERN_ERR "ppp: dev_alloc_name failed (%d)\n", if_num);
kfree(ppp);
}
while ((skb = skb_dequeue(&ppp->rcv_q)) != NULL)
}
while ((skb = skb_dequeue(&ppp->rcv_q)) != NULL)
while ((skb = skb_dequeue(&ppp->xmt_q)) != NULL)
while ((skb = skb_dequeue(&ppp->xmt_q)) != NULL)
ppp->inuse = 0;
if (ppp->dev.tbusy) {
ppp->inuse = 0;
if (ppp->dev.tbusy) {
-/* $Id: ppp_defs.h,v 1.7 1997/07/14 03:50:51 paulus Exp $ */
+/* $Id: ppp_defs.h,v 1.8 1999/02/26 06:48:21 paulus Exp $ */
/*
* ppp_defs.h - PPP definitions.
/*
* ppp_defs.h - PPP definitions.
- * ==FILEVERSION 970607==
+ * ==FILEVERSION 990114==
*
* NOTE TO MAINTAINERS:
* If you modify this file at all, please set the above date.
*
* NOTE TO MAINTAINERS:
* If you modify this file at all, please set the above date.
#define PPP_IPCP 0x8021 /* IP Control Protocol */
#define PPP_ATCP 0x8029 /* AppleTalk Control Protocol */
#define PPP_IPXCP 0x802b /* IPX Control Protocol */
#define PPP_IPCP 0x8021 /* IP Control Protocol */
#define PPP_ATCP 0x8029 /* AppleTalk Control Protocol */
#define PPP_IPXCP 0x802b /* IPX Control Protocol */
+#define PPP_IPV6CP 0x8057 /* IPv6 Control Protocol */
#define PPP_CCP 0x80fd /* Compression Control Protocol */
#define PPP_LCP 0xc021 /* Link Control Protocol */
#define PPP_PAP 0xc023 /* Password Authentication Protocol */
#define PPP_CCP 0x80fd /* Compression Control Protocol */
#define PPP_LCP 0xc021 /* Link Control Protocol */
#define PPP_PAP 0xc023 /* Password Authentication Protocol */