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