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