2005-04-16 15:20:36 -07:00
/***************************************************************************
* Linux PPP over X - Generic PPP transport layer sockets
* Linux PPP over Ethernet ( PPPoE ) Socket Implementation ( RFC 2516 )
*
* This file supplies definitions required by the PPP over Ethernet driver
* ( pppox . c ) . All version information wrt this file is located in pppox . c
*
* License :
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation ; either version
* 2 of the License , or ( at your option ) any later version .
*
*/
# ifndef __LINUX_IF_PPPOX_H
# define __LINUX_IF_PPPOX_H
2009-01-15 13:51:26 -08:00
# include <linux/types.h>
2005-04-16 15:20:36 -07:00
# include <asm/byteorder.h>
# ifdef __KERNEL__
# include <linux/if_ether.h>
# include <linux/if.h>
# include <linux/netdevice.h>
# include <linux/ppp_channel.h>
# endif /* __KERNEL__ */
2007-06-27 15:43:43 -07:00
# include <linux/if_pppol2tp.h>
2005-04-16 15:20:36 -07:00
/* For user-space programs to pick up these definitions
* which they wouldn ' t get otherwise without defining __KERNEL__
*/
# ifndef AF_PPPOX
# define AF_PPPOX 24
# define PF_PPPOX AF_PPPOX
# endif /* !(AF_PPPOX) */
/************************************************************************
* PPPoE addressing definition
*/
2007-08-23 02:55:33 -04:00
typedef __be16 sid_t ;
2005-04-16 15:20:36 -07:00
struct pppoe_addr {
sid_t sid ; /* Session identifier */
unsigned char remote [ ETH_ALEN ] ; /* Remote address */
char dev [ IFNAMSIZ ] ; /* Local device to use */
} ;
/************************************************************************
* Protocols supported by AF_PPPOX
*/
# define PX_PROTO_OE 0 /* Currently just PPPoE */
2007-06-27 15:43:43 -07:00
# define PX_PROTO_OL2TP 1 /* Now L2TP also */
# define PX_MAX_PROTO 2
2005-04-16 15:20:36 -07:00
struct sockaddr_pppox {
sa_family_t sa_family ; /* address family, AF_PPPOX */
unsigned int sa_protocol ; /* protocol identifier */
union {
struct pppoe_addr pppoe ;
} sa_addr ;
} __attribute__ ( ( packed ) ) ;
2007-06-27 15:43:43 -07:00
/* The use of the above union isn't viable because the size of this
* struct must stay fixed over time - - applications use sizeof ( struct
* sockaddr_pppox ) to fill it . We use a protocol specific sockaddr
* type instead .
*/
struct sockaddr_pppol2tp {
sa_family_t sa_family ; /* address family, AF_PPPOX */
unsigned int sa_protocol ; /* protocol identifier */
struct pppol2tp_addr pppol2tp ;
} __attribute__ ( ( packed ) ) ;
2005-04-16 15:20:36 -07:00
/*********************************************************************
*
* ioctl interface for defining forwarding of connections
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# define PPPOEIOCSFWD _IOW(0xB1 ,0, size_t)
# define PPPOEIOCDFWD _IO(0xB1 ,1)
/*#define PPPOEIOCGFWD _IOWR(0xB1,2, size_t)*/
/* Codes to identify message types */
# define PADI_CODE 0x09
# define PADO_CODE 0x07
# define PADR_CODE 0x19
# define PADS_CODE 0x65
# define PADT_CODE 0xa7
struct pppoe_tag {
2007-08-23 02:55:33 -04:00
__be16 tag_type ;
__be16 tag_len ;
2005-04-16 15:20:36 -07:00
char tag_data [ 0 ] ;
} __attribute ( ( packed ) ) ;
/* Tag identifiers */
2009-02-14 22:58:35 -08:00
# define PTT_EOL __cpu_to_be16(0x0000)
# define PTT_SRV_NAME __cpu_to_be16(0x0101)
# define PTT_AC_NAME __cpu_to_be16(0x0102)
# define PTT_HOST_UNIQ __cpu_to_be16(0x0103)
# define PTT_AC_COOKIE __cpu_to_be16(0x0104)
# define PTT_VENDOR __cpu_to_be16(0x0105)
# define PTT_RELAY_SID __cpu_to_be16(0x0110)
# define PTT_SRV_ERR __cpu_to_be16(0x0201)
# define PTT_SYS_ERR __cpu_to_be16(0x0202)
# define PTT_GEN_ERR __cpu_to_be16(0x0203)
2005-04-16 15:20:36 -07:00
struct pppoe_hdr {
# if defined(__LITTLE_ENDIAN_BITFIELD)
__u8 ver : 4 ;
__u8 type : 4 ;
# elif defined(__BIG_ENDIAN_BITFIELD)
__u8 type : 4 ;
__u8 ver : 4 ;
# else
# error "Please fix <asm / byteorder.h>"
# endif
__u8 code ;
2007-08-23 02:55:33 -04:00
__be16 sid ;
__be16 length ;
2005-04-16 15:20:36 -07:00
struct pppoe_tag tag [ 0 ] ;
} __attribute__ ( ( packed ) ) ;
2007-04-12 22:14:23 -07:00
/* Length of entire PPPoE + PPP header */
# define PPPOE_SES_HLEN 8
2005-04-16 15:20:36 -07:00
# ifdef __KERNEL__
2007-03-10 15:56:08 -03:00
# include <linux/skbuff.h>
static inline struct pppoe_hdr * pppoe_hdr ( const struct sk_buff * skb )
{
2007-04-10 20:50:43 -07:00
return ( struct pppoe_hdr * ) skb_network_header ( skb ) ;
2007-03-10 15:56:08 -03:00
}
2005-04-16 15:20:36 -07:00
struct pppoe_opt {
struct net_device * dev ; /* device associated with socket*/
2007-03-04 16:03:22 -08:00
int ifindex ; /* ifindex of device associated with socket */
2005-04-16 15:20:36 -07:00
struct pppoe_addr pa ; /* what this socket is bound to*/
struct sockaddr_pppox relay ; /* what socket data will be
relayed to ( PPPoE relaying ) */
} ;
# include <net/sock.h>
struct pppox_sock {
/* struct sock must be the first member of pppox_sock */
struct sock sk ;
struct ppp_channel chan ;
struct pppox_sock * next ; /* for hash table */
union {
struct pppoe_opt pppoe ;
} proto ;
2007-08-23 02:55:33 -04:00
__be16 num ;
2005-04-16 15:20:36 -07:00
} ;
# define pppoe_dev proto.pppoe.dev
2007-03-04 16:03:22 -08:00
# define pppoe_ifindex proto.pppoe.ifindex
2005-04-16 15:20:36 -07:00
# define pppoe_pa proto.pppoe.pa
# define pppoe_relay proto.pppoe.relay
static inline struct pppox_sock * pppox_sk ( struct sock * sk )
{
return ( struct pppox_sock * ) sk ;
}
static inline struct sock * sk_pppox ( struct pppox_sock * po )
{
return ( struct sock * ) po ;
}
struct module ;
struct pppox_proto {
2007-10-08 23:24:22 -07:00
int ( * create ) ( struct net * net , struct socket * sock ) ;
2005-04-16 15:20:36 -07:00
int ( * ioctl ) ( struct socket * sock , unsigned int cmd ,
unsigned long arg ) ;
struct module * owner ;
} ;
extern int register_pppox_proto ( int proto_num , struct pppox_proto * pp ) ;
extern void unregister_pppox_proto ( int proto_num ) ;
extern void pppox_unbind_sock ( struct sock * sk ) ; /* delete ppp-channel binding */
2005-12-27 20:57:40 -08:00
extern int pppox_ioctl ( struct socket * sock , unsigned int cmd , unsigned long arg ) ;
2005-04-16 15:20:36 -07:00
/* PPPoX socket states */
enum {
PPPOX_NONE = 0 , /* initial state */
PPPOX_CONNECTED = 1 , /* connection established ==TCP_ESTABLISHED */
PPPOX_BOUND = 2 , /* bound to ppp device */
PPPOX_RELAY = 4 , /* forwarding is enabled */
PPPOX_ZOMBIE = 8 , /* dead, but still bound to ppp device */
PPPOX_DEAD = 16 /* dead, useless, please clean me up!*/
} ;
# endif /* __KERNEL__ */
# endif /* !(__LINUX_IF_PPPOX_H) */