Home | History | Annotate | Download | only in linux
      1 /***************************************************************************
      2  * Linux PPP over X - Generic PPP transport layer sockets
      3  * Linux PPP over Ethernet (PPPoE) Socket Implementation (RFC 2516)
      4  *
      5  * This file supplies definitions required by the PPP over Ethernet driver
      6  * (pppox.c).  All version information wrt this file is located in pppox.c
      7  *
      8  * License:
      9  *		This program is free software; you can redistribute it and/or
     10  *		modify it under the terms of the GNU General Public License
     11  *		as published by the Free Software Foundation; either version
     12  *		2 of the License, or (at your option) any later version.
     13  *
     14  */
     15 
     16 #ifndef __LINUX_IF_PPPOX_H
     17 #define __LINUX_IF_PPPOX_H
     18 
     19 
     20 #include <linux/types.h>
     21 #include <asm/byteorder.h>
     22 
     23 #include <linux/socket.h>
     24 #include <linux/if_ether.h>
     25 #include <linux/if_pppol2tp.h>
     26 
     27 /* For user-space programs to pick up these definitions
     28  * which they wouldn't get otherwise without defining __KERNEL__
     29  */
     30 #ifndef AF_PPPOX
     31 #define AF_PPPOX	24
     32 #define PF_PPPOX	AF_PPPOX
     33 #endif /* !(AF_PPPOX) */
     34 
     35 /************************************************************************
     36  * PPPoE addressing definition
     37  */
     38 typedef __be16 sid_t;
     39 struct pppoe_addr {
     40 	sid_t         sid;                    /* Session identifier */
     41 	unsigned char remote[ETH_ALEN];       /* Remote address */
     42 	char          dev[IFNAMSIZ];          /* Local device to use */
     43 };
     44 
     45 /************************************************************************
     46  * PPTP addressing definition
     47  */
     48 struct pptp_addr {
     49 	__be16		call_id;
     50 	struct in_addr	sin_addr;
     51 };
     52 
     53 /************************************************************************
     54  * Protocols supported by AF_PPPOX
     55  */
     56 #define PX_PROTO_OE    0 /* Currently just PPPoE */
     57 #define PX_PROTO_OL2TP 1 /* Now L2TP also */
     58 #define PX_PROTO_PPTP  2
     59 #define PX_MAX_PROTO   3
     60 
     61 struct sockaddr_pppox {
     62 	__kernel_sa_family_t sa_family;       /* address family, AF_PPPOX */
     63 	unsigned int    sa_protocol;          /* protocol identifier */
     64 	union {
     65 		struct pppoe_addr  pppoe;
     66 		struct pptp_addr   pptp;
     67 	} sa_addr;
     68 } __attribute__((packed));
     69 
     70 /* The use of the above union isn't viable because the size of this
     71  * struct must stay fixed over time -- applications use sizeof(struct
     72  * sockaddr_pppox) to fill it. We use a protocol specific sockaddr
     73  * type instead.
     74  */
     75 struct sockaddr_pppol2tp {
     76 	__kernel_sa_family_t sa_family; /* address family, AF_PPPOX */
     77 	unsigned int    sa_protocol;    /* protocol identifier */
     78 	struct pppol2tp_addr pppol2tp;
     79 } __attribute__((packed));
     80 
     81 /* The L2TPv3 protocol changes tunnel and session ids from 16 to 32
     82  * bits. So we need a different sockaddr structure.
     83  */
     84 struct sockaddr_pppol2tpv3 {
     85 	__kernel_sa_family_t sa_family; /* address family, AF_PPPOX */
     86 	unsigned int    sa_protocol;    /* protocol identifier */
     87 	struct pppol2tpv3_addr pppol2tp;
     88 } __attribute__((packed));
     89 
     90 /*********************************************************************
     91  *
     92  * ioctl interface for defining forwarding of connections
     93  *
     94  ********************************************************************/
     95 
     96 #define PPPOEIOCSFWD	_IOW(0xB1 ,0, size_t)
     97 #define PPPOEIOCDFWD	_IO(0xB1 ,1)
     98 /*#define PPPOEIOCGFWD	_IOWR(0xB1,2, size_t)*/
     99 
    100 /* Codes to identify message types */
    101 #define PADI_CODE	0x09
    102 #define PADO_CODE	0x07
    103 #define PADR_CODE	0x19
    104 #define PADS_CODE	0x65
    105 #define PADT_CODE	0xa7
    106 struct pppoe_tag {
    107 	__be16 tag_type;
    108 	__be16 tag_len;
    109 	char tag_data[0];
    110 } __attribute__ ((packed));
    111 
    112 /* Tag identifiers */
    113 #define PTT_EOL		__cpu_to_be16(0x0000)
    114 #define PTT_SRV_NAME	__cpu_to_be16(0x0101)
    115 #define PTT_AC_NAME	__cpu_to_be16(0x0102)
    116 #define PTT_HOST_UNIQ	__cpu_to_be16(0x0103)
    117 #define PTT_AC_COOKIE	__cpu_to_be16(0x0104)
    118 #define PTT_VENDOR 	__cpu_to_be16(0x0105)
    119 #define PTT_RELAY_SID	__cpu_to_be16(0x0110)
    120 #define PTT_SRV_ERR     __cpu_to_be16(0x0201)
    121 #define PTT_SYS_ERR  	__cpu_to_be16(0x0202)
    122 #define PTT_GEN_ERR  	__cpu_to_be16(0x0203)
    123 
    124 struct pppoe_hdr {
    125 #if defined(__LITTLE_ENDIAN_BITFIELD)
    126 	__u8 ver : 4;
    127 	__u8 type : 4;
    128 #elif defined(__BIG_ENDIAN_BITFIELD)
    129 	__u8 type : 4;
    130 	__u8 ver : 4;
    131 #else
    132 #error	"Please fix <asm/byteorder.h>"
    133 #endif
    134 	__u8 code;
    135 	__be16 sid;
    136 	__be16 length;
    137 	struct pppoe_tag tag[0];
    138 } __attribute__((packed));
    139 
    140 /* Length of entire PPPoE + PPP header */
    141 #define PPPOE_SES_HLEN	8
    142 
    143 
    144 #endif /* !(__LINUX_IF_PPPOX_H) */
    145