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/* 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 */ 42typedef __be16 sid_t; 43struct 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 49struct pptp_addr { 50 __u16 call_id; 51 struct in_addr sin_addr; 52}; 53 54/************************************************************************ 55 * Protocols supported by AF_PPPOX 56 */ 57#define PX_PROTO_OE 0 /* Currently just PPPoE */ 58#define PX_PROTO_OL2TP 1 /* Now L2TP also */ 59#define PX_PROTO_PPTP 2 60#define PX_MAX_PROTO 3 61 62 63struct sockaddr_pppox { 64 sa_family_t sa_family; /* address family, AF_PPPOX */ 65 unsigned int sa_protocol; /* protocol identifier */ 66 union{ 67 struct pppoe_addr pppoe; 68 struct pptp_addr pptp; 69 }sa_addr; 70} __attribute__((packed)); 71 72/* The use of the above union isn't viable because the size of this 73 * struct must stay fixed over time -- applications use sizeof(struct 74 * sockaddr_pppox) to fill it. We use a protocol specific sockaddr 75 * type instead. 76 */ 77struct sockaddr_pppol2tp { 78 sa_family_t sa_family; /* address family, AF_PPPOX */ 79 unsigned int sa_protocol; /* protocol identifier */ 80 struct pppol2tp_addr pppol2tp; 81} __attribute__((packed)); 82 83/* The L2TPv3 protocol changes tunnel and session ids from 16 to 32 84 * bits. So we need a different sockaddr structure. 85 */ 86struct sockaddr_pppol2tpv3 { 87 sa_family_t sa_family; /* address family, AF_PPPOX */ 88 unsigned int sa_protocol; /* protocol identifier */ 89 struct pppol2tpv3_addr pppol2tp; 90} __attribute__((packed)); 91 92/* Socket options */ 93#define PPTP_SO_TIMEOUT 1 94#define PPTP_SO_WINDOW 2 95 96/********************************************************************* 97 * 98 * ioctl interface for defining forwarding of connections 99 * 100 ********************************************************************/ 101 102#define PPPOEIOCSFWD _IOW(0xB1 ,0, size_t) 103#define PPPOEIOCDFWD _IO(0xB1 ,1) 104/*#define PPPOEIOCGFWD _IOWR(0xB1,2, size_t)*/ 105#define PPPTPIOWFP _IOWR(0xB1 ,2, size_t) 106 107/* Codes to identify message types */ 108#define PADI_CODE 0x09 109#define PADO_CODE 0x07 110#define PADR_CODE 0x19 111#define PADS_CODE 0x65 112#define PADT_CODE 0xa7 113struct pppoe_tag { 114 __be16 tag_type; 115 __be16 tag_len; 116 char tag_data[0]; 117} __attribute__ ((packed)); 118 119/* Tag identifiers */ 120#define PTT_EOL __cpu_to_be16(0x0000) 121#define PTT_SRV_NAME __cpu_to_be16(0x0101) 122#define PTT_AC_NAME __cpu_to_be16(0x0102) 123#define PTT_HOST_UNIQ __cpu_to_be16(0x0103) 124#define PTT_AC_COOKIE __cpu_to_be16(0x0104) 125#define PTT_VENDOR __cpu_to_be16(0x0105) 126#define PTT_RELAY_SID __cpu_to_be16(0x0110) 127#define PTT_SRV_ERR __cpu_to_be16(0x0201) 128#define PTT_SYS_ERR __cpu_to_be16(0x0202) 129#define PTT_GEN_ERR __cpu_to_be16(0x0203) 130 131struct pppoe_hdr { 132#if defined(__LITTLE_ENDIAN_BITFIELD) 133 __u8 ver : 4; 134 __u8 type : 4; 135#elif defined(__BIG_ENDIAN_BITFIELD) 136 __u8 type : 4; 137 __u8 ver : 4; 138#else 139#error "Please fix <asm/byteorder.h>" 140#endif 141 __u8 code; 142 __be16 sid; 143 __be16 length; 144 struct pppoe_tag tag[0]; 145} __attribute__((packed)); 146 147/* Length of entire PPPoE + PPP header */ 148#define PPPOE_SES_HLEN 8 149 150#ifdef __KERNEL__ 151#include <linux/skbuff.h> 152 153static inline struct pppoe_hdr *pppoe_hdr(const struct sk_buff *skb) 154{ 155 return (struct pppoe_hdr *)skb_network_header(skb); 156} 157 158struct pppoe_opt { 159 struct net_device *dev; /* device associated with socket*/ 160 int ifindex; /* ifindex of device associated with socket */ 161 struct pppoe_addr pa; /* what this socket is bound to*/ 162 struct sockaddr_pppox relay; /* what socket data will be 163 relayed to (PPPoE relaying) */ 164}; 165 166struct pptp_opt { 167 struct pptp_addr src_addr; 168 struct pptp_addr dst_addr; 169 __u32 ack_sent, ack_recv; 170 __u32 seq_sent, seq_recv; 171 int ppp_flags; 172}; 173 174#define PPTP_FLAG_PAUSE 0 175#define PPTP_FLAG_PROC 1 176 177#include <net/sock.h> 178 179struct pppox_sock { 180 /* struct sock must be the first member of pppox_sock */ 181 struct sock sk; 182 struct ppp_channel chan; 183 struct pppox_sock *next; /* for hash table */ 184 union { 185 struct pppoe_opt pppoe; 186 struct pptp_opt pptp; 187 } proto; 188 __be16 num; 189}; 190#define pppoe_dev proto.pppoe.dev 191#define pppoe_ifindex proto.pppoe.ifindex 192#define pppoe_pa proto.pppoe.pa 193#define pppoe_relay proto.pppoe.relay 194 195static inline struct pppox_sock *pppox_sk(struct sock *sk) 196{ 197 return (struct pppox_sock *)sk; 198} 199 200static inline struct sock *sk_pppox(struct pppox_sock *po) 201{ 202 return (struct sock *)po; 203} 204 205struct module; 206 207struct pppox_proto { 208 int (*create)(struct net *net, struct socket *sock); 209 int (*ioctl)(struct socket *sock, unsigned int cmd, 210 unsigned long arg); 211 struct module *owner; 212}; 213 214extern int register_pppox_proto(int proto_num, struct pppox_proto *pp); 215extern void unregister_pppox_proto(int proto_num); 216extern void pppox_unbind_sock(struct sock *sk);/* delete ppp-channel binding */ 217extern int pppox_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg); 218 219/* PPPoX socket states */ 220enum { 221 PPPOX_NONE = 0, /* initial state */ 222 PPPOX_CONNECTED = 1, /* connection established ==TCP_ESTABLISHED */ 223 PPPOX_BOUND = 2, /* bound to ppp device */ 224 PPPOX_RELAY = 4, /* forwarding is enabled */ 225 PPPOX_ZOMBIE = 8, /* dead, but still bound to ppp device */ 226 PPPOX_DEAD = 16 /* dead, useless, please clean me up!*/ 227}; 228 229#endif /* __KERNEL__ */ 230 231#endif /* !(__LINUX_IF_PPPOX_H) */ 232