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