|
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 <asm/types.h> |
|
21 #include <asm/byteorder.h> |
|
22 |
|
23 #ifdef __KERNEL__ |
|
24 #include <linux/if_ether.h> |
|
25 #include <linux/if.h> |
|
26 #include <linux/netdevice.h> |
|
27 #include <linux/ppp_channel.h> |
|
28 #endif /* __KERNEL__ */ |
|
29 #include <linux/if_pppol2tp.h> |
|
30 |
|
31 /* For user-space programs to pick up these definitions |
|
32 * which they wouldn't get otherwise without defining __KERNEL__ |
|
33 */ |
|
34 #ifndef AF_PPPOX |
|
35 #define AF_PPPOX 24 |
|
36 #define PF_PPPOX AF_PPPOX |
|
37 #endif /* !(AF_PPPOX) */ |
|
38 |
|
39 /************************************************************************ |
|
40 * PPPoE addressing definition |
|
41 */ |
|
42 typedef __be16 sid_t; |
|
43 struct pppoe_addr{ |
|
44 sid_t sid; /* Session identifier */ |
|
45 unsigned char remote[ETH_ALEN]; /* Remote address */ |
|
46 char dev[IFNAMSIZ]; /* Local device to use */ |
|
47 }; |
|
48 |
|
49 /************************************************************************ |
|
50 * Protocols supported by AF_PPPOX |
|
51 */ |
|
52 #define PX_PROTO_OE 0 /* Currently just PPPoE */ |
|
53 #define PX_PROTO_OL2TP 1 /* Now L2TP also */ |
|
54 #define PX_MAX_PROTO 2 |
|
55 |
|
56 struct sockaddr_pppox { |
|
57 sa_family_t sa_family; /* address family, AF_PPPOX */ |
|
58 unsigned int sa_protocol; /* protocol identifier */ |
|
59 union{ |
|
60 struct pppoe_addr pppoe; |
|
61 }sa_addr; |
|
62 }__attribute__ ((packed)); |
|
63 |
|
64 /* The use of the above union isn't viable because the size of this |
|
65 * struct must stay fixed over time -- applications use sizeof(struct |
|
66 * sockaddr_pppox) to fill it. We use a protocol specific sockaddr |
|
67 * type instead. |
|
68 */ |
|
69 struct sockaddr_pppol2tp { |
|
70 sa_family_t sa_family; /* address family, AF_PPPOX */ |
|
71 unsigned int sa_protocol; /* protocol identifier */ |
|
72 struct pppol2tp_addr pppol2tp; |
|
73 }__attribute__ ((packed)); |
|
74 |
|
75 /********************************************************************* |
|
76 * |
|
77 * ioctl interface for defining forwarding of connections |
|
78 * |
|
79 ********************************************************************/ |
|
80 |
|
81 #define PPPOEIOCSFWD _IOW(0xB1 ,0, size_t) |
|
82 #define PPPOEIOCDFWD _IO(0xB1 ,1) |
|
83 /*#define PPPOEIOCGFWD _IOWR(0xB1,2, size_t)*/ |
|
84 |
|
85 /* Codes to identify message types */ |
|
86 #define PADI_CODE 0x09 |
|
87 #define PADO_CODE 0x07 |
|
88 #define PADR_CODE 0x19 |
|
89 #define PADS_CODE 0x65 |
|
90 #define PADT_CODE 0xa7 |
|
91 struct pppoe_tag { |
|
92 __be16 tag_type; |
|
93 __be16 tag_len; |
|
94 char tag_data[0]; |
|
95 } __attribute ((packed)); |
|
96 |
|
97 /* Tag identifiers */ |
|
98 #define PTT_EOL __constant_htons(0x0000) |
|
99 #define PTT_SRV_NAME __constant_htons(0x0101) |
|
100 #define PTT_AC_NAME __constant_htons(0x0102) |
|
101 #define PTT_HOST_UNIQ __constant_htons(0x0103) |
|
102 #define PTT_AC_COOKIE __constant_htons(0x0104) |
|
103 #define PTT_VENDOR __constant_htons(0x0105) |
|
104 #define PTT_RELAY_SID __constant_htons(0x0110) |
|
105 #define PTT_SRV_ERR __constant_htons(0x0201) |
|
106 #define PTT_SYS_ERR __constant_htons(0x0202) |
|
107 #define PTT_GEN_ERR __constant_htons(0x0203) |
|
108 |
|
109 struct pppoe_hdr { |
|
110 #if defined(__LITTLE_ENDIAN_BITFIELD) |
|
111 __u8 ver : 4; |
|
112 __u8 type : 4; |
|
113 #elif defined(__BIG_ENDIAN_BITFIELD) |
|
114 __u8 type : 4; |
|
115 __u8 ver : 4; |
|
116 #else |
|
117 #error "Please fix <asm/byteorder.h>" |
|
118 #endif |
|
119 __u8 code; |
|
120 __be16 sid; |
|
121 __be16 length; |
|
122 struct pppoe_tag tag[0]; |
|
123 } __attribute__ ((packed)); |
|
124 |
|
125 /* Length of entire PPPoE + PPP header */ |
|
126 #define PPPOE_SES_HLEN 8 |
|
127 |
|
128 #ifdef __KERNEL__ |
|
129 #include <linux/skbuff.h> |
|
130 |
|
131 static inline struct pppoe_hdr *pppoe_hdr(const struct sk_buff *skb) |
|
132 { |
|
133 return (struct pppoe_hdr *)skb_network_header(skb); |
|
134 } |
|
135 |
|
136 struct pppoe_opt { |
|
137 struct net_device *dev; /* device associated with socket*/ |
|
138 int ifindex; /* ifindex of device associated with socket */ |
|
139 struct pppoe_addr pa; /* what this socket is bound to*/ |
|
140 struct sockaddr_pppox relay; /* what socket data will be |
|
141 relayed to (PPPoE relaying) */ |
|
142 }; |
|
143 |
|
144 #include <net/sock.h> |
|
145 |
|
146 struct pppox_sock { |
|
147 /* struct sock must be the first member of pppox_sock */ |
|
148 struct sock sk; |
|
149 struct ppp_channel chan; |
|
150 struct pppox_sock *next; /* for hash table */ |
|
151 union { |
|
152 struct pppoe_opt pppoe; |
|
153 } proto; |
|
154 __be16 num; |
|
155 }; |
|
156 #define pppoe_dev proto.pppoe.dev |
|
157 #define pppoe_ifindex proto.pppoe.ifindex |
|
158 #define pppoe_pa proto.pppoe.pa |
|
159 #define pppoe_relay proto.pppoe.relay |
|
160 |
|
161 static inline struct pppox_sock *pppox_sk(struct sock *sk) |
|
162 { |
|
163 return (struct pppox_sock *)sk; |
|
164 } |
|
165 |
|
166 static inline struct sock *sk_pppox(struct pppox_sock *po) |
|
167 { |
|
168 return (struct sock *)po; |
|
169 } |
|
170 |
|
171 struct module; |
|
172 |
|
173 struct pppox_proto { |
|
174 int (*create)(struct net *net, struct socket *sock); |
|
175 int (*ioctl)(struct socket *sock, unsigned int cmd, |
|
176 unsigned long arg); |
|
177 struct module *owner; |
|
178 }; |
|
179 |
|
180 extern int register_pppox_proto(int proto_num, struct pppox_proto *pp); |
|
181 extern void unregister_pppox_proto(int proto_num); |
|
182 extern void pppox_unbind_sock(struct sock *sk);/* delete ppp-channel binding */ |
|
183 extern int pppox_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg); |
|
184 |
|
185 /* PPPoX socket states */ |
|
186 enum { |
|
187 PPPOX_NONE = 0, /* initial state */ |
|
188 PPPOX_CONNECTED = 1, /* connection established ==TCP_ESTABLISHED */ |
|
189 PPPOX_BOUND = 2, /* bound to ppp device */ |
|
190 PPPOX_RELAY = 4, /* forwarding is enabled */ |
|
191 PPPOX_ZOMBIE = 8, /* dead, but still bound to ppp device */ |
|
192 PPPOX_DEAD = 16 /* dead, useless, please clean me up!*/ |
|
193 }; |
|
194 |
|
195 #endif /* __KERNEL__ */ |
|
196 |
|
197 #endif /* !(__LINUX_IF_PPPOX_H) */ |