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