1224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/***************************************************************************
2224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Linux PPP over X - Generic PPP transport layer sockets
3224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Linux PPP over Ethernet (PPPoE) Socket Implementation (RFC 2516)
4224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng *
5224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * This file supplies definitions required by the PPP over Ethernet driver
6224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * (pppox.c).  All version information wrt this file is located in pppox.c
7224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng *
8224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * License:
9224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng *		This program is free software; you can redistribute it and/or
10224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng *		modify it under the terms of the GNU General Public License
11224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng *		as published by the Free Software Foundation; either version
12224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng *		2 of the License, or (at your option) any later version.
13224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng *
14224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */
15224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
16224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#ifndef _UAPI__LINUX_IF_PPPOX_H
17224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define _UAPI__LINUX_IF_PPPOX_H
18224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
19224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
20224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#include <linux/types.h>
21224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#include <asm/byteorder.h>
22224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
23224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#include <linux/socket.h>
246e3550f2a1c3909fb75be068f7ae9009f7e8622aChristopher Ferris#include <linux/if.h>
25224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#include <linux/if_ether.h>
26224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#include <linux/if_pppol2tp.h>
276e3550f2a1c3909fb75be068f7ae9009f7e8622aChristopher Ferris#include <linux/in.h>
286e3550f2a1c3909fb75be068f7ae9009f7e8622aChristopher Ferris#include <linux/in6.h>
29224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
30224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/* For user-space programs to pick up these definitions
31224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * which they wouldn't get otherwise without defining __KERNEL__
32224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */
33224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#ifndef AF_PPPOX
34224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define AF_PPPOX	24
35224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define PF_PPPOX	AF_PPPOX
36224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#endif /* !(AF_PPPOX) */
37224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
38224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/************************************************************************
39224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * PPPoE addressing definition
40224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */
41224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengtypedef __be16 sid_t;
42224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengstruct pppoe_addr {
43224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	sid_t         sid;                    /* Session identifier */
44224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	unsigned char remote[ETH_ALEN];       /* Remote address */
45224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	char          dev[IFNAMSIZ];          /* Local device to use */
46224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng};
47224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
48224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/************************************************************************
49224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * PPTP addressing definition
50224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */
51224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengstruct pptp_addr {
52e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris	__u16		call_id;
53224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	struct in_addr	sin_addr;
54224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng};
55224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
56224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/************************************************************************
57224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Protocols supported by AF_PPPOX
58224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */
59224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define PX_PROTO_OE    0 /* Currently just PPPoE */
60224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define PX_PROTO_OL2TP 1 /* Now L2TP also */
61224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define PX_PROTO_PPTP  2
62e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris#define PX_MAX_PROTO   3
63224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
64224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengstruct sockaddr_pppox {
65224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	__kernel_sa_family_t sa_family;       /* address family, AF_PPPOX */
66224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	unsigned int    sa_protocol;          /* protocol identifier */
67224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	union {
68224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng		struct pppoe_addr  pppoe;
69224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng		struct pptp_addr   pptp;
70224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	} sa_addr;
71224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng} __packed;
72224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
73224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/* The use of the above union isn't viable because the size of this
74224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * struct must stay fixed over time -- applications use sizeof(struct
75224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * sockaddr_pppox) to fill it. We use a protocol specific sockaddr
76224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * type instead.
77224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */
78224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengstruct sockaddr_pppol2tp {
79224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	__kernel_sa_family_t sa_family; /* address family, AF_PPPOX */
80224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	unsigned int    sa_protocol;    /* protocol identifier */
81224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	struct pppol2tp_addr pppol2tp;
82224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng} __packed;
83224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
84224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengstruct sockaddr_pppol2tpin6 {
85224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	__kernel_sa_family_t sa_family; /* address family, AF_PPPOX */
86224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	unsigned int    sa_protocol;    /* protocol identifier */
87224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	struct pppol2tpin6_addr pppol2tp;
88224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng} __packed;
89224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
90224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/* The L2TPv3 protocol changes tunnel and session ids from 16 to 32
91224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * bits. So we need a different sockaddr structure.
92224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */
93224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengstruct sockaddr_pppol2tpv3 {
94224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	__kernel_sa_family_t sa_family; /* address family, AF_PPPOX */
95224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	unsigned int    sa_protocol;    /* protocol identifier */
96224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	struct pppol2tpv3_addr pppol2tp;
97224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng} __packed;
98224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
99224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengstruct sockaddr_pppol2tpv3in6 {
100224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	__kernel_sa_family_t sa_family; /* address family, AF_PPPOX */
101224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	unsigned int    sa_protocol;    /* protocol identifier */
102224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	struct pppol2tpv3in6_addr pppol2tp;
103224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng} __packed;
104224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
105224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/*********************************************************************
106224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng *
107224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * ioctl interface for defining forwarding of connections
108224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng *
109224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng ********************************************************************/
110224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
111224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define PPPOEIOCSFWD	_IOW(0xB1 ,0, size_t)
112224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define PPPOEIOCDFWD	_IO(0xB1 ,1)
113224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/*#define PPPOEIOCGFWD	_IOWR(0xB1,2, size_t)*/
114224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
115224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/* Codes to identify message types */
116224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define PADI_CODE	0x09
117224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define PADO_CODE	0x07
118224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define PADR_CODE	0x19
119224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define PADS_CODE	0x65
120224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define PADT_CODE	0xa7
121224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengstruct pppoe_tag {
122224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	__be16 tag_type;
123224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	__be16 tag_len;
124224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	char tag_data[0];
125224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng} __attribute__ ((packed));
126224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
127224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/* Tag identifiers */
128224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define PTT_EOL		__cpu_to_be16(0x0000)
129224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define PTT_SRV_NAME	__cpu_to_be16(0x0101)
130224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define PTT_AC_NAME	__cpu_to_be16(0x0102)
131224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define PTT_HOST_UNIQ	__cpu_to_be16(0x0103)
132224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define PTT_AC_COOKIE	__cpu_to_be16(0x0104)
133224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define PTT_VENDOR 	__cpu_to_be16(0x0105)
134224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define PTT_RELAY_SID	__cpu_to_be16(0x0110)
135224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define PTT_SRV_ERR     __cpu_to_be16(0x0201)
136224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define PTT_SYS_ERR  	__cpu_to_be16(0x0202)
137224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define PTT_GEN_ERR  	__cpu_to_be16(0x0203)
138224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
139224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengstruct pppoe_hdr {
140224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#if defined(__LITTLE_ENDIAN_BITFIELD)
1416ea19f626488db5efcc757f2d8a2fd362d0567ceChristopher Ferris	__u8 type : 4;
142e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris	__u8 ver : 4;
143224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#elif defined(__BIG_ENDIAN_BITFIELD)
1446ea19f626488db5efcc757f2d8a2fd362d0567ceChristopher Ferris	__u8 ver : 4;
145e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris	__u8 type : 4;
146224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#else
147224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#error	"Please fix <asm/byteorder.h>"
148224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#endif
149224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	__u8 code;
150224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	__be16 sid;
151224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	__be16 length;
152224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng	struct pppoe_tag tag[0];
153224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng} __packed;
154224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
155224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/* Length of entire PPPoE + PPP header */
156224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define PPPOE_SES_HLEN	8
157224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
158224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng
159224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#endif /* _UAPI__LINUX_IF_PPPOX_H */
160