• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/linux/linux-2.6/include/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#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#if defined(CTF_PPTP) || defined(CTF_L2TP)
32#include <ctf/hndctf.h>
33#endif
34
35/* For user-space programs to pick up these definitions
36 * which they wouldn't get otherwise without defining __KERNEL__
37 */
38#ifndef AF_PPPOX
39#define AF_PPPOX	24
40#define PF_PPPOX	AF_PPPOX
41#endif /* !(AF_PPPOX) */
42
43/************************************************************************
44 * PPPoE addressing definition
45 */
46typedef __be16 sid_t;
47struct pppoe_addr {
48	sid_t         sid;                    /* Session identifier */
49	unsigned char remote[ETH_ALEN];       /* Remote address */
50	char          dev[IFNAMSIZ];          /* Local device to use */
51};
52
53/************************************************************************
54 * PPTP addressing definition
55 */
56struct pptp_addr {
57	__be16		call_id;
58	struct in_addr	sin_addr;
59};
60
61/************************************************************************
62 * Protocols supported by AF_PPPOX
63 */
64#define PX_PROTO_OE    0 /* Currently just PPPoE */
65#define PX_PROTO_OL2TP 1 /* Now L2TP also */
66#define PX_PROTO_PPTP  2
67#define PX_MAX_PROTO   3
68
69struct sockaddr_pppox {
70	sa_family_t     sa_family;            /* address family, AF_PPPOX */
71	unsigned int    sa_protocol;          /* protocol identifier */
72	union {
73		struct pppoe_addr  pppoe;
74		struct pptp_addr   pptp;
75	} sa_addr;
76} __attribute__((packed));
77
78/* The use of the above union isn't viable because the size of this
79 * struct must stay fixed over time -- applications use sizeof(struct
80 * sockaddr_pppox) to fill it. We use a protocol specific sockaddr
81 * type instead.
82 */
83struct sockaddr_pppol2tp {
84	sa_family_t     sa_family;      /* address family, AF_PPPOX */
85	unsigned int    sa_protocol;    /* protocol identifier */
86	struct pppol2tp_addr pppol2tp;
87} __attribute__((packed));
88
89/* The L2TPv3 protocol changes tunnel and session ids from 16 to 32
90 * bits. So we need a different sockaddr structure.
91 */
92struct sockaddr_pppol2tpv3 {
93	sa_family_t     sa_family;      /* address family, AF_PPPOX */
94	unsigned int    sa_protocol;    /* protocol identifier */
95	struct pppol2tpv3_addr pppol2tp;
96} __attribute__((packed));
97
98/*********************************************************************
99 *
100 * ioctl interface for defining forwarding of connections
101 *
102 ********************************************************************/
103
104#define PPPOEIOCSFWD	_IOW(0xB1 ,0, size_t)
105#define PPPOEIOCDFWD	_IO(0xB1 ,1)
106/*#define PPPOEIOCGFWD	_IOWR(0xB1,2, size_t)*/
107#define PPPTPIOWFP  	_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
115struct pppoe_tag {
116	__be16 tag_type;
117	__be16 tag_len;
118	char tag_data[0];
119} __attribute__ ((packed));
120
121/* Tag identifiers */
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)
132
133struct pppoe_hdr {
134#if defined(__LITTLE_ENDIAN_BITFIELD)
135	__u8 ver : 4;
136	__u8 type : 4;
137#elif defined(__BIG_ENDIAN_BITFIELD)
138	__u8 type : 4;
139	__u8 ver : 4;
140#else
141#error	"Please fix <asm/byteorder.h>"
142#endif
143	__u8 code;
144	__be16 sid;
145	__be16 length;
146	struct pppoe_tag tag[0];
147} __attribute__((packed));
148
149/* Length of entire PPPoE + PPP header */
150#define PPPOE_SES_HLEN	8
151
152#ifdef __KERNEL__
153#include <linux/skbuff.h>
154
155/* Socket options */
156#define PPTP_SO_TIMEOUT 1
157#define PPTP_SO_WINDOW  2
158
159static inline struct pppoe_hdr *pppoe_hdr(const struct sk_buff *skb)
160{
161	return (struct pppoe_hdr *)skb_network_header(skb);
162}
163
164struct pppoe_opt {
165	struct net_device	*dev;	  /* device associated with socket*/
166	int			ifindex;  /* ifindex of device associated with socket */
167	struct pppoe_addr	pa;	  /* what this socket is bound to*/
168	struct sockaddr_pppox	relay;	  /* what socket data will be
169					     relayed to (PPPoE relaying) */
170};
171
172struct pptp_opt {
173	struct pptp_addr	src_addr;
174	struct pptp_addr	dst_addr;
175	__u32 ack_sent, ack_recv;
176	__u32 seq_sent, seq_recv;
177	int ppp_flags;
178};
179
180#define PPTP_FLAG_PAUSE 0
181#define PPTP_FLAG_PROC 1
182
183#ifdef CTF_L2TP
184struct l2tp_opt {
185	struct ctf_pppol2tp_session ts;//tunnel and session
186	struct ctf_pppol2tp_inet	inet;
187};
188#endif
189
190#include <net/sock.h>
191
192struct pppox_sock {
193	/* struct sock must be the first member of pppox_sock */
194	struct sock sk;
195	struct ppp_channel chan;
196	struct pppox_sock	*next;	  /* for hash table */
197	union {
198		struct pppoe_opt pppoe;
199		struct pptp_opt  pptp;
200#ifdef CTF_L2TP
201		struct l2tp_opt l2tp;
202#endif
203	} proto;
204	__be16			num;
205};
206#define pppoe_dev	proto.pppoe.dev
207#define pppoe_ifindex	proto.pppoe.ifindex
208#define pppoe_pa	proto.pppoe.pa
209#define pppoe_relay	proto.pppoe.relay
210
211static inline struct pppox_sock *pppox_sk(struct sock *sk)
212{
213	return (struct pppox_sock *)sk;
214}
215
216static inline struct sock *sk_pppox(struct pppox_sock *po)
217{
218	return (struct sock *)po;
219}
220
221struct module;
222
223struct pppox_proto {
224	int		(*create)(struct net *net, struct socket *sock);
225	int		(*ioctl)(struct socket *sock, unsigned int cmd,
226				 unsigned long arg);
227	struct module	*owner;
228};
229
230#if defined(CTF_PPTP) || defined(CTF_L2TP)
231extern int ppp_get_conn_pkt_info(void *pppif, struct ctf_ppp *ctfppp);
232#endif
233
234extern int register_pppox_proto(int proto_num, const struct pppox_proto *pp);
235extern void unregister_pppox_proto(int proto_num);
236extern void pppox_unbind_sock(struct sock *sk);/* delete ppp-channel binding */
237extern int pppox_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg);
238
239/* PPPoX socket states */
240enum {
241    PPPOX_NONE		= 0,  /* initial state */
242    PPPOX_CONNECTED	= 1,  /* connection established ==TCP_ESTABLISHED */
243    PPPOX_BOUND		= 2,  /* bound to ppp device */
244    PPPOX_RELAY		= 4,  /* forwarding is enabled */
245    PPPOX_ZOMBIE	= 8,  /* dead, but still bound to ppp device */
246    PPPOX_DEAD		= 16  /* dead, useless, please clean me up!*/
247};
248
249#endif /* __KERNEL__ */
250
251#endif /* !(__LINUX_IF_PPPOX_H) */
252