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