Dr Andrew Scott G7VAV

My photo
 
June 2025
Mo Tu We Th Fr Sa Su
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 1 2 3 4 5 6


if_pppox.h
001: /***************************************************************************
002:  * Linux PPP over X - Generic PPP transport layer sockets
003:  * Linux PPP over Ethernet (PPPoE) Socket Implementation (RFC 2516) 
004:  *
005:  * This file supplies definitions required by the PPP over Ethernet driver
006:  * (pppox.c).  All version information wrt this file is located in pppox.c
007:  *
008:  * License:
009:  *              This program is free software; you can redistribute it and/or
010:  *              modify it under the terms of the GNU General Public License
011:  *              as published by the Free Software Foundation; either version
012:  *              2 of the License, or (at your option) any later version.
013:  *
014:  */
015: 
016: #ifndef __LINUX_IF_PPPOX_H
017: #define __LINUX_IF_PPPOX_H
018: 
019: 
020: #include <linux/types.h>
021: #include <asm/byteorder.h>
022: 
023: #include <linux/socket.h>
024: #include <linux/if_ether.h>
025: #include <linux/if_pppol2tp.h>
026: 
027: /* For user-space programs to pick up these definitions
028:  * which they wouldn't get otherwise without defining __KERNEL__
029:  */
030: #ifndef AF_PPPOX
031: #define AF_PPPOX        24
032: #define PF_PPPOX        AF_PPPOX
033: #endif /* !(AF_PPPOX) */
034: 
035: /************************************************************************ 
036:  * PPPoE addressing definition 
037:  */ 
038: typedef __be16 sid_t;
039: struct pppoe_addr {
040:         sid_t         sid;                    /* Session identifier */
041:         unsigned char remote[ETH_ALEN];       /* Remote address */
042:         char          dev[IFNAMSIZ];          /* Local device to use */
043: }; 
044:  
045: /************************************************************************ 
046:  * PPTP addressing definition
047:  */
048: struct pptp_addr {
049:         __be16          call_id;
050:         struct in_addr  sin_addr;
051: };
052: 
053: /************************************************************************
054:  * Protocols supported by AF_PPPOX
055:  */
056: #define PX_PROTO_OE    0 /* Currently just PPPoE */
057: #define PX_PROTO_OL2TP 1 /* Now L2TP also */
058: #define PX_PROTO_PPTP  2
059: #define PX_MAX_PROTO   3
060: 
061: struct sockaddr_pppox {
062:         __kernel_sa_family_t sa_family;       /* address family, AF_PPPOX */
063:         unsigned int    sa_protocol;          /* protocol identifier */
064:         union {
065:                 struct pppoe_addr  pppoe;
066:                 struct pptp_addr   pptp;
067:         } sa_addr;
068: } __attribute__((packed));
069: 
070: /* The use of the above union isn't viable because the size of this
071:  * struct must stay fixed over time -- applications use sizeof(struct
072:  * sockaddr_pppox) to fill it. We use a protocol specific sockaddr
073:  * type instead.
074:  */
075: struct sockaddr_pppol2tp {
076:         __kernel_sa_family_t sa_family; /* address family, AF_PPPOX */
077:         unsigned int    sa_protocol;    /* protocol identifier */
078:         struct pppol2tp_addr pppol2tp;
079: } __attribute__((packed));
080: 
081: /* The L2TPv3 protocol changes tunnel and session ids from 16 to 32
082:  * bits. So we need a different sockaddr structure.
083:  */
084: struct sockaddr_pppol2tpv3 {
085:         __kernel_sa_family_t sa_family; /* address family, AF_PPPOX */
086:         unsigned int    sa_protocol;    /* protocol identifier */
087:         struct pppol2tpv3_addr pppol2tp;
088: } __attribute__((packed));
089: 
090: /*********************************************************************
091:  *
092:  * ioctl interface for defining forwarding of connections
093:  *
094:  ********************************************************************/
095: 
096: #define PPPOEIOCSFWD    _IOW(0xB1 ,0, size_t)
097: #define PPPOEIOCDFWD    _IO(0xB1 ,1)
098: /*#define PPPOEIOCGFWD  _IOWR(0xB1,2, size_t)*/
099: 
100: /* Codes to identify message types */
101: #define PADI_CODE       0x09
102: #define PADO_CODE       0x07
103: #define PADR_CODE       0x19
104: #define PADS_CODE       0x65
105: #define PADT_CODE       0xa7
106: struct pppoe_tag {
107:         __be16 tag_type;
108:         __be16 tag_len;
109:         char tag_data[0];
110: } __attribute__ ((packed));
111: 
112: /* Tag identifiers */
113: #define PTT_EOL         __cpu_to_be16(0x0000)
114: #define PTT_SRV_NAME    __cpu_to_be16(0x0101)
115: #define PTT_AC_NAME     __cpu_to_be16(0x0102)
116: #define PTT_HOST_UNIQ   __cpu_to_be16(0x0103)
117: #define PTT_AC_COOKIE   __cpu_to_be16(0x0104)
118: #define PTT_VENDOR      __cpu_to_be16(0x0105)
119: #define PTT_RELAY_SID   __cpu_to_be16(0x0110)
120: #define PTT_SRV_ERR     __cpu_to_be16(0x0201)
121: #define PTT_SYS_ERR     __cpu_to_be16(0x0202)
122: #define PTT_GEN_ERR     __cpu_to_be16(0x0203)
123: 
124: struct pppoe_hdr {
125: #if defined(__LITTLE_ENDIAN_BITFIELD)
126:         __u8 ver : 4;
127:         __u8 type : 4;
128: #elif defined(__BIG_ENDIAN_BITFIELD)
129:         __u8 type : 4;
130:         __u8 ver : 4;
131: #else
132: #error  "Please fix <asm/byteorder.h>"
133: #endif
134:         __u8 code;
135:         __be16 sid;
136:         __be16 length;
137:         struct pppoe_tag tag[0];
138: } __attribute__((packed));
139: 
140: /* Length of entire PPPoE + PPP header */
141: #define PPPOE_SES_HLEN  8
142: 
143: 
144: #endif /* !(__LINUX_IF_PPPOX_H) */
145: 


for client (none)
© Andrew Scott 2006 - 2025,
All Rights Reserved
http://www.andrew-scott.uk/
Andrew Scott
http://www.andrew-scott.co.uk/