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 <asm/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/sched.h> 28 #include <asm/semaphore.h> 29 #include <linux/ppp_channel.h> 30 #endif /* __KERNEL__ */ 31 32 /* For user-space programs to pick up these definitions 33 * which they wouldn't get otherwise without defining __KERNEL__ 34 */ 35 #ifndef AF_PPPOX 36 #define AF_PPPOX 24 37 #define PF_PPPOX AF_PPPOX 38 #endif /* !(AF_PPPOX) */ 39 40 /************************************************************************ 41 * PPPoE addressing definition 42 */ 43 typedef __u16 sid_t; 44 struct pppoe_addr{ 45 sid_t sid; /* Session identifier */ 46 unsigned char remote[ETH_ALEN]; /* Remote address */ 47 char dev[IFNAMSIZ]; /* Local device to use */ 48 }; 49 50 /************************************************************************ 51 * Protocols supported by AF_PPPOX 52 */ 53 #define PX_PROTO_OE 0 /* Currently just PPPoE */ 54 #define PX_MAX_PROTO 1 55 56 struct sockaddr_pppox { 57 sa_family_t sa_family; /* address family, AF_PPPOX */ 58 unsigned int sa_protocol; /* protocol identifier */ 59 union{ 60 struct pppoe_addr pppoe; 61 }sa_addr; 62 }__attribute__ ((packed)); 63 64 65 /********************************************************************* 66 * 67 * ioctl interface for defining forwarding of connections 68 * 69 ********************************************************************/ 70 71 #define PPPOEIOCSFWD _IOW(0xB1 ,0, sizeof(struct sockaddr_pppox)) 72 #define PPPOEIOCDFWD _IO(0xB1 ,1) 73 /*#define PPPOEIOCGFWD _IOWR(0xB1,2, sizeof(struct sockaddr_pppox))*/ 74 75 /* Codes to identify message types */ 76 #define PADI_CODE 0x09 77 #define PADO_CODE 0x07 78 #define PADR_CODE 0x19 79 #define PADS_CODE 0x65 80 #define PADT_CODE 0xa7 81 struct pppoe_tag { 82 __u16 tag_type; 83 __u16 tag_len; 84 char tag_data[0]; 85 } __attribute ((packed)); 86 87 /* Tag identifiers */ 88 #define PTT_EOL __constant_htons(0x0000) 89 #define PTT_SRV_NAME __constant_htons(0x0101) 90 #define PTT_AC_NAME __constant_htons(0x0102) 91 #define PTT_HOST_UNIQ __constant_htons(0x0103) 92 #define PTT_AC_COOKIE __constant_htons(0x0104) 93 #define PTT_VENDOR __constant_htons(0x0105) 94 #define PTT_RELAY_SID __constant_htons(0x0110) 95 #define PTT_SRV_ERR __constant_htons(0x0201) 96 #define PTT_SYS_ERR __constant_htons(0x0202) 97 #define PTT_GEN_ERR __constant_htons(0x0203) 98 99 struct pppoe_hdr { 100 #if defined(__LITTLE_ENDIAN_BITFIELD) 101 __u8 ver : 4; 102 __u8 type : 4; 103 #elif defined(__BIG_ENDIAN_BITFIELD) 104 __u8 type : 4; 105 __u8 ver : 4; 106 #else 107 #error "Please fix <asm/byteorder.h>" 108 #endif 109 __u8 code; 110 __u16 sid; 111 __u16 length; 112 struct pppoe_tag tag[0]; 113 } __attribute__ ((packed)); 114 115 #ifdef __KERNEL__ 116 117 struct pppox_proto { 118 int (*create)(struct socket *sock); 119 int (*ioctl)(struct socket *sock, unsigned int cmd, 120 unsigned long arg); 121 }; 122 123 extern int register_pppox_proto(int proto_num, struct pppox_proto *pp); 124 extern void unregister_pppox_proto(int proto_num); 125 extern void pppox_unbind_sock(struct sock *sk);/* delete ppp-channel binding */ 126 extern int pppox_channel_ioctl(struct ppp_channel *pc, unsigned int cmd, 127 unsigned long arg); 128 129 /* PPPoX socket states */ 130 enum { 131 PPPOX_NONE = 0, /* initial state */ 132 PPPOX_CONNECTED = 1, /* connection established ==TCP_ESTABLISHED */ 133 PPPOX_BOUND = 2, /* bound to ppp device */ 134 PPPOX_RELAY = 4, /* forwarding is enabled */ 135 PPPOX_ZOMBIE = 8, /* dead, but still bound to ppp device */ 136 PPPOX_DEAD = 16 /* dead, useless, please clean me up!*/ 137 }; 138 139 extern struct ppp_channel_ops pppoe_chan_ops; 140 141 extern int pppox_proto_init(struct net_proto *np); 142 143 #endif /* __KERNEL__ */ 144 145 #endif /* !(__LINUX_IF_PPPOX_H) */ 146