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