| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 |  | 
| Jaswinder Singh Rajput | 00bfdda | 2009-01-15 13:51:26 -0800 | [diff] [blame] | 20 | #include <linux/types.h> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 21 | #include <asm/byteorder.h> | 
|  | 22 |  | 
| Ben Hutchings | bcb949b | 2011-08-24 18:43:55 +0000 | [diff] [blame] | 23 | #include <linux/socket.h> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 24 | #include <linux/if_ether.h> | 
| Ben Hutchings | 22ad72b | 2011-08-24 18:40:48 +0000 | [diff] [blame] | 25 | #ifdef  __KERNEL__ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 26 | #include <linux/if.h> | 
|  | 27 | #include <linux/netdevice.h> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 28 | #include <linux/ppp_channel.h> | 
|  | 29 | #endif /* __KERNEL__ */ | 
| James Chapman | cf14a4d | 2007-06-27 15:43:43 -0700 | [diff] [blame] | 30 | #include <linux/if_pppol2tp.h> | 
| Chia-chi Yeh | 49c48cb | 2009-05-08 04:02:40 +0800 | [diff] [blame] | 31 | #include <linux/if_pppolac.h> | 
| Chia-chi Yeh | 803341c | 2009-06-12 01:09:30 +0800 | [diff] [blame] | 32 | #include <linux/if_pppopns.h> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 33 |  | 
|  | 34 | /* For user-space programs to pick up these definitions | 
|  | 35 | * which they wouldn't get otherwise without defining __KERNEL__ | 
|  | 36 | */ | 
|  | 37 | #ifndef AF_PPPOX | 
|  | 38 | #define AF_PPPOX	24 | 
|  | 39 | #define PF_PPPOX	AF_PPPOX | 
|  | 40 | #endif /* !(AF_PPPOX) */ | 
|  | 41 |  | 
|  | 42 | /************************************************************************ | 
|  | 43 | * PPPoE addressing definition | 
|  | 44 | */ | 
| Al Viro | b963dc1 | 2007-08-23 02:55:33 -0400 | [diff] [blame] | 45 | typedef __be16 sid_t; | 
| Dmitry Kozlov | 00959ad | 2010-08-21 23:05:39 -0700 | [diff] [blame] | 46 | struct pppoe_addr { | 
|  | 47 | sid_t         sid;                    /* Session identifier */ | 
|  | 48 | unsigned char remote[ETH_ALEN];       /* Remote address */ | 
|  | 49 | char          dev[IFNAMSIZ];          /* Local device to use */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 50 | }; | 
|  | 51 |  | 
|  | 52 | /************************************************************************ | 
| Dmitry Kozlov | 00959ad | 2010-08-21 23:05:39 -0700 | [diff] [blame] | 53 | * PPTP addressing definition | 
|  | 54 | */ | 
|  | 55 | struct pptp_addr { | 
| Changli Gao | d8287fc | 2010-08-22 18:37:27 -0700 | [diff] [blame] | 56 | __be16		call_id; | 
|  | 57 | struct in_addr	sin_addr; | 
| Dmitry Kozlov | 00959ad | 2010-08-21 23:05:39 -0700 | [diff] [blame] | 58 | }; | 
|  | 59 |  | 
|  | 60 | /************************************************************************ | 
|  | 61 | * Protocols supported by AF_PPPOX | 
|  | 62 | */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 63 | #define PX_PROTO_OE    0 /* Currently just PPPoE */ | 
| James Chapman | cf14a4d | 2007-06-27 15:43:43 -0700 | [diff] [blame] | 64 | #define PX_PROTO_OL2TP 1 /* Now L2TP also */ | 
| Dmitry Kozlov | 00959ad | 2010-08-21 23:05:39 -0700 | [diff] [blame] | 65 | #define PX_PROTO_PPTP  2 | 
| Chia-chi Yeh | 49c48cb | 2009-05-08 04:02:40 +0800 | [diff] [blame] | 66 | #define PX_PROTO_OLAC  3 | 
| Chia-chi Yeh | 803341c | 2009-06-12 01:09:30 +0800 | [diff] [blame] | 67 | #define PX_PROTO_OPNS  4 | 
|  | 68 | #define PX_MAX_PROTO   5 | 
| James Chapman | cf14a4d | 2007-06-27 15:43:43 -0700 | [diff] [blame] | 69 |  | 
| Dmitry Kozlov | 00959ad | 2010-08-21 23:05:39 -0700 | [diff] [blame] | 70 | struct sockaddr_pppox { | 
| Ben Hutchings | bcb949b | 2011-08-24 18:43:55 +0000 | [diff] [blame] | 71 | __kernel_sa_family_t sa_family;       /* address family, AF_PPPOX */ | 
| Dmitry Kozlov | 00959ad | 2010-08-21 23:05:39 -0700 | [diff] [blame] | 72 | unsigned int    sa_protocol;          /* protocol identifier */ | 
|  | 73 | union { | 
|  | 74 | struct pppoe_addr  pppoe; | 
|  | 75 | struct pptp_addr   pptp; | 
|  | 76 | } sa_addr; | 
| Changli Gao | 09cd2b9 | 2010-08-22 17:25:05 +0000 | [diff] [blame] | 77 | } __attribute__((packed)); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 78 |  | 
| James Chapman | cf14a4d | 2007-06-27 15:43:43 -0700 | [diff] [blame] | 79 | /* The use of the above union isn't viable because the size of this | 
|  | 80 | * struct must stay fixed over time -- applications use sizeof(struct | 
|  | 81 | * sockaddr_pppox) to fill it. We use a protocol specific sockaddr | 
|  | 82 | * type instead. | 
|  | 83 | */ | 
|  | 84 | struct sockaddr_pppol2tp { | 
| Ben Hutchings | bcb949b | 2011-08-24 18:43:55 +0000 | [diff] [blame] | 85 | __kernel_sa_family_t sa_family; /* address family, AF_PPPOX */ | 
| James Chapman | cf14a4d | 2007-06-27 15:43:43 -0700 | [diff] [blame] | 86 | unsigned int    sa_protocol;    /* protocol identifier */ | 
|  | 87 | struct pppol2tp_addr pppol2tp; | 
| Changli Gao | 09cd2b9 | 2010-08-22 17:25:05 +0000 | [diff] [blame] | 88 | } __attribute__((packed)); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 89 |  | 
| James Chapman | e0d4435 | 2010-04-02 06:18:54 +0000 | [diff] [blame] | 90 | /* The L2TPv3 protocol changes tunnel and session ids from 16 to 32 | 
|  | 91 | * bits. So we need a different sockaddr structure. | 
|  | 92 | */ | 
|  | 93 | struct sockaddr_pppol2tpv3 { | 
| Ben Hutchings | bcb949b | 2011-08-24 18:43:55 +0000 | [diff] [blame] | 94 | __kernel_sa_family_t sa_family; /* address family, AF_PPPOX */ | 
| James Chapman | e0d4435 | 2010-04-02 06:18:54 +0000 | [diff] [blame] | 95 | unsigned int    sa_protocol;    /* protocol identifier */ | 
|  | 96 | struct pppol2tpv3_addr pppol2tp; | 
| Changli Gao | 09cd2b9 | 2010-08-22 17:25:05 +0000 | [diff] [blame] | 97 | } __attribute__((packed)); | 
| James Chapman | e0d4435 | 2010-04-02 06:18:54 +0000 | [diff] [blame] | 98 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 99 | /********************************************************************* | 
|  | 100 | * | 
|  | 101 | * ioctl interface for defining forwarding of connections | 
|  | 102 | * | 
|  | 103 | ********************************************************************/ | 
|  | 104 |  | 
|  | 105 | #define PPPOEIOCSFWD	_IOW(0xB1 ,0, size_t) | 
|  | 106 | #define PPPOEIOCDFWD	_IO(0xB1 ,1) | 
|  | 107 | /*#define PPPOEIOCGFWD	_IOWR(0xB1,2, size_t)*/ | 
|  | 108 |  | 
|  | 109 | /* Codes to identify message types */ | 
|  | 110 | #define PADI_CODE	0x09 | 
|  | 111 | #define PADO_CODE	0x07 | 
|  | 112 | #define PADR_CODE	0x19 | 
|  | 113 | #define PADS_CODE	0x65 | 
|  | 114 | #define PADT_CODE	0xa7 | 
|  | 115 | struct pppoe_tag { | 
| Al Viro | b963dc1 | 2007-08-23 02:55:33 -0400 | [diff] [blame] | 116 | __be16 tag_type; | 
|  | 117 | __be16 tag_len; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 118 | char tag_data[0]; | 
| Changli Gao | 09cd2b9 | 2010-08-22 17:25:05 +0000 | [diff] [blame] | 119 | } __attribute__ ((packed)); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 120 |  | 
|  | 121 | /* Tag identifiers */ | 
| Harvey Harrison | f3a7c66 | 2009-02-14 22:58:35 -0800 | [diff] [blame] | 122 | #define PTT_EOL		__cpu_to_be16(0x0000) | 
|  | 123 | #define PTT_SRV_NAME	__cpu_to_be16(0x0101) | 
|  | 124 | #define PTT_AC_NAME	__cpu_to_be16(0x0102) | 
|  | 125 | #define PTT_HOST_UNIQ	__cpu_to_be16(0x0103) | 
|  | 126 | #define PTT_AC_COOKIE	__cpu_to_be16(0x0104) | 
|  | 127 | #define PTT_VENDOR 	__cpu_to_be16(0x0105) | 
|  | 128 | #define PTT_RELAY_SID	__cpu_to_be16(0x0110) | 
|  | 129 | #define PTT_SRV_ERR     __cpu_to_be16(0x0201) | 
|  | 130 | #define PTT_SYS_ERR  	__cpu_to_be16(0x0202) | 
|  | 131 | #define PTT_GEN_ERR  	__cpu_to_be16(0x0203) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 132 |  | 
|  | 133 | struct pppoe_hdr { | 
|  | 134 | #if defined(__LITTLE_ENDIAN_BITFIELD) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 135 | __u8 type : 4; | 
| Changli Gao | d11ff32 | 2013-06-29 00:15:51 +0800 | [diff] [blame] | 136 | __u8 ver : 4; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 137 | #elif defined(__BIG_ENDIAN_BITFIELD) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 138 | __u8 ver : 4; | 
| Changli Gao | d11ff32 | 2013-06-29 00:15:51 +0800 | [diff] [blame] | 139 | __u8 type : 4; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 140 | #else | 
|  | 141 | #error	"Please fix <asm/byteorder.h>" | 
|  | 142 | #endif | 
|  | 143 | __u8 code; | 
| Al Viro | b963dc1 | 2007-08-23 02:55:33 -0400 | [diff] [blame] | 144 | __be16 sid; | 
|  | 145 | __be16 length; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 146 | struct pppoe_tag tag[0]; | 
| Changli Gao | 09cd2b9 | 2010-08-22 17:25:05 +0000 | [diff] [blame] | 147 | } __attribute__((packed)); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 148 |  | 
| Michael Milner | 516299d | 2007-04-12 22:14:23 -0700 | [diff] [blame] | 149 | /* Length of entire PPPoE + PPP header */ | 
|  | 150 | #define PPPOE_SES_HLEN	8 | 
|  | 151 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 152 | #ifdef __KERNEL__ | 
| Arnaldo Carvalho de Melo | 797659f | 2007-03-10 15:56:08 -0300 | [diff] [blame] | 153 | #include <linux/skbuff.h> | 
|  | 154 |  | 
|  | 155 | static inline struct pppoe_hdr *pppoe_hdr(const struct sk_buff *skb) | 
|  | 156 | { | 
| Arnaldo Carvalho de Melo | d56f90a | 2007-04-10 20:50:43 -0700 | [diff] [blame] | 157 | return (struct pppoe_hdr *)skb_network_header(skb); | 
| Arnaldo Carvalho de Melo | 797659f | 2007-03-10 15:56:08 -0300 | [diff] [blame] | 158 | } | 
|  | 159 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 160 | struct pppoe_opt { | 
|  | 161 | struct net_device      *dev;	  /* device associated with socket*/ | 
| Florian Zumbiehl | 6f30e18 | 2007-03-04 16:03:22 -0800 | [diff] [blame] | 162 | int			ifindex;  /* ifindex of device associated with socket */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 163 | struct pppoe_addr	pa;	  /* what this socket is bound to*/ | 
|  | 164 | struct sockaddr_pppox	relay;	  /* what socket data will be | 
|  | 165 | relayed to (PPPoE relaying) */ | 
|  | 166 | }; | 
|  | 167 |  | 
| Dmitry Kozlov | 00959ad | 2010-08-21 23:05:39 -0700 | [diff] [blame] | 168 | struct pptp_opt { | 
|  | 169 | struct pptp_addr src_addr; | 
|  | 170 | struct pptp_addr dst_addr; | 
|  | 171 | u32 ack_sent, ack_recv; | 
|  | 172 | u32 seq_sent, seq_recv; | 
|  | 173 | int ppp_flags; | 
|  | 174 | }; | 
| Chia-chi Yeh | 49c48cb | 2009-05-08 04:02:40 +0800 | [diff] [blame] | 175 |  | 
|  | 176 | struct pppolac_opt { | 
| Chia-chi Yeh | 463ebc1 | 2011-04-15 15:22:09 -0700 | [diff] [blame] | 177 | __u32		local; | 
|  | 178 | __u32		remote; | 
|  | 179 | __u32		recv_sequence; | 
|  | 180 | __u32		xmit_sequence; | 
|  | 181 | atomic_t	sequencing; | 
|  | 182 | int		(*backlog_rcv)(struct sock *sk_udp, struct sk_buff *skb); | 
| Chia-chi Yeh | 49c48cb | 2009-05-08 04:02:40 +0800 | [diff] [blame] | 183 | }; | 
|  | 184 |  | 
| Chia-chi Yeh | 803341c | 2009-06-12 01:09:30 +0800 | [diff] [blame] | 185 | struct pppopns_opt { | 
| Chia-chi Yeh | 463ebc1 | 2011-04-15 15:22:09 -0700 | [diff] [blame] | 186 | __u16		local; | 
|  | 187 | __u16		remote; | 
|  | 188 | __u32		recv_sequence; | 
|  | 189 | __u32		xmit_sequence; | 
|  | 190 | void		(*data_ready)(struct sock *sk_raw, int length); | 
|  | 191 | int		(*backlog_rcv)(struct sock *sk_raw, struct sk_buff *skb); | 
| Chia-chi Yeh | 803341c | 2009-06-12 01:09:30 +0800 | [diff] [blame] | 192 | }; | 
|  | 193 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 194 | #include <net/sock.h> | 
|  | 195 |  | 
|  | 196 | struct pppox_sock { | 
|  | 197 | /* struct sock must be the first member of pppox_sock */ | 
| Dmitry Kozlov | 00959ad | 2010-08-21 23:05:39 -0700 | [diff] [blame] | 198 | struct sock sk; | 
|  | 199 | struct ppp_channel chan; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 200 | struct pppox_sock	*next;	  /* for hash table */ | 
|  | 201 | union { | 
|  | 202 | struct pppoe_opt pppoe; | 
| Dmitry Kozlov | 00959ad | 2010-08-21 23:05:39 -0700 | [diff] [blame] | 203 | struct pptp_opt  pptp; | 
| Chia-chi Yeh | 49c48cb | 2009-05-08 04:02:40 +0800 | [diff] [blame] | 204 | struct pppolac_opt lac; | 
| Chia-chi Yeh | 803341c | 2009-06-12 01:09:30 +0800 | [diff] [blame] | 205 | struct pppopns_opt pns; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 206 | } proto; | 
| Al Viro | b963dc1 | 2007-08-23 02:55:33 -0400 | [diff] [blame] | 207 | __be16			num; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 208 | }; | 
|  | 209 | #define pppoe_dev	proto.pppoe.dev | 
| Florian Zumbiehl | 6f30e18 | 2007-03-04 16:03:22 -0800 | [diff] [blame] | 210 | #define pppoe_ifindex	proto.pppoe.ifindex | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 211 | #define pppoe_pa	proto.pppoe.pa | 
|  | 212 | #define pppoe_relay	proto.pppoe.relay | 
|  | 213 |  | 
|  | 214 | static inline struct pppox_sock *pppox_sk(struct sock *sk) | 
|  | 215 | { | 
|  | 216 | return (struct pppox_sock *)sk; | 
|  | 217 | } | 
|  | 218 |  | 
|  | 219 | static inline struct sock *sk_pppox(struct pppox_sock *po) | 
|  | 220 | { | 
|  | 221 | return (struct sock *)po; | 
|  | 222 | } | 
|  | 223 |  | 
|  | 224 | struct module; | 
|  | 225 |  | 
|  | 226 | struct pppox_proto { | 
| Eric W. Biederman | 1b8d7ae | 2007-10-08 23:24:22 -0700 | [diff] [blame] | 227 | int		(*create)(struct net *net, struct socket *sock); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 228 | int		(*ioctl)(struct socket *sock, unsigned int cmd, | 
|  | 229 | unsigned long arg); | 
|  | 230 | struct module	*owner; | 
|  | 231 | }; | 
|  | 232 |  | 
| Eric Dumazet | 756e64a | 2010-09-21 06:43:54 +0000 | [diff] [blame] | 233 | extern int register_pppox_proto(int proto_num, const struct pppox_proto *pp); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 234 | extern void unregister_pppox_proto(int proto_num); | 
|  | 235 | extern void pppox_unbind_sock(struct sock *sk);/* delete ppp-channel binding */ | 
| David S. Miller | 17ba15f | 2005-12-27 20:57:40 -0800 | [diff] [blame] | 236 | extern int pppox_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 237 |  | 
|  | 238 | /* PPPoX socket states */ | 
|  | 239 | enum { | 
|  | 240 | PPPOX_NONE		= 0,  /* initial state */ | 
|  | 241 | PPPOX_CONNECTED	= 1,  /* connection established ==TCP_ESTABLISHED */ | 
|  | 242 | PPPOX_BOUND		= 2,  /* bound to ppp device */ | 
|  | 243 | PPPOX_RELAY		= 4,  /* forwarding is enabled */ | 
|  | 244 | PPPOX_ZOMBIE	= 8,  /* dead, but still bound to ppp device */ | 
|  | 245 | PPPOX_DEAD		= 16  /* dead, useless, please clean me up!*/ | 
|  | 246 | }; | 
|  | 247 |  | 
|  | 248 | #endif /* __KERNEL__ */ | 
|  | 249 |  | 
|  | 250 | #endif /* !(__LINUX_IF_PPPOX_H) */ |