ng_pppoe.h revision 125028
119304Speter 219304Speter/* 319304Speter * ng_pppoe.h 419304Speter * 519304Speter * Copyright (c) 1996-1999 Whistle Communications, Inc. 619304Speter * All rights reserved. 719304Speter * 819304Speter * Subject to the following obligations and disclaimer of warranty, use and 919304Speter * redistribution of this software, in source or object code forms, with or 1019304Speter * without modifications are expressly permitted by Whistle Communications; 1119304Speter * provided, however, that: 1219304Speter * 1. Any and all reproductions of the source or object code must include the 13254225Speter * copyright notice above and the following disclaimer of warranties; and 1419304Speter * 2. No rights are granted, in any manner or form, to use Whistle 1519304Speter * Communications, Inc. trademarks, including the mark "WHISTLE 1619304Speter * COMMUNICATIONS" on advertising, endorsements, or otherwise except as 1719304Speter * such appears in the above copyright notice or in the software. 1819304Speter * 1919304Speter * THIS SOFTWARE IS BEING PROVIDED BY WHISTLE COMMUNICATIONS "AS IS", AND 2019304Speter * TO THE MAXIMUM EXTENT PERMITTED BY LAW, WHISTLE COMMUNICATIONS MAKES NO 2119304Speter * REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, REGARDING THIS SOFTWARE, 2219304Speter * INCLUDING WITHOUT LIMITATION, ANY AND ALL IMPLIED WARRANTIES OF 2319304Speter * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT. 2419304Speter * WHISTLE COMMUNICATIONS DOES NOT WARRANT, GUARANTEE, OR MAKE ANY 2519304Speter * REPRESENTATIONS REGARDING THE USE OF, OR THE RESULTS OF THE USE OF THIS 2619304Speter * SOFTWARE IN TERMS OF ITS CORRECTNESS, ACCURACY, RELIABILITY OR OTHERWISE. 2719304Speter * IN NO EVENT SHALL WHISTLE COMMUNICATIONS BE LIABLE FOR ANY DAMAGES 2819304Speter * RESULTING FROM OR ARISING OUT OF ANY USE OF THIS SOFTWARE, INCLUDING 2919304Speter * WITHOUT LIMITATION, ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, 3019304Speter * PUNITIVE, OR CONSEQUENTIAL DAMAGES, PROCUREMENT OF SUBSTITUTE GOODS OR 3119304Speter * SERVICES, LOSS OF USE, DATA OR PROFITS, HOWEVER CAUSED AND UNDER ANY 3219304Speter * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 3319304Speter * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 3419304Speter * THIS SOFTWARE, EVEN IF WHISTLE COMMUNICATIONS IS ADVISED OF THE POSSIBILITY 3519304Speter * OF SUCH DAMAGE. 3619304Speter * 3719304Speter * Author: Julian Elischer <julian@freebsd.org> 3819304Speter * 3919304Speter * $FreeBSD: head/sys/netgraph/ng_pppoe.h 125028 2004-01-26 14:05:31Z harti $ 4019304Speter * $Whistle: ng_pppoe.h,v 1.7 1999/10/16 10:16:43 julian Exp $ 41254225Speter */ 4219304Speter 43254225Speter#ifndef _NETGRAPH_NG_PPPOE_H_ 4419304Speter#define _NETGRAPH_NG_PPPOE_H_ 4519304Speter 46254225Speter/******************************************************************** 4719304Speter * Netgraph hook constants etc. 4819304Speter ********************************************************************/ 49254225Speter/* Node type name. This should be unique among all netgraph node types */ 5019304Speter#define NG_PPPOE_NODE_TYPE "pppoe" 51254225Speter 52254225Speter#define NGM_PPPOE_COOKIE 939032003 53254225Speter 5419304Speter/* Number of active sessions we can handle */ 5519304Speter#define PPPOE_NUM_SESSIONS 16 /* for now */ 5619304Speter#define PPPOE_SERVICE_NAME_SIZE 64 /* for now */ 5719304Speter 5819304Speter/* Hook names */ 5919304Speter#define NG_PPPOE_HOOK_ETHERNET "ethernet" 6019304Speter#define NG_PPPOE_HOOK_PADI "PADI" /* default PADI requests come here */ 6119304Speter#define NG_PPPOE_HOOK_S_LEADIN "service" /* PADO responses from PADI */ 6219304Speter#define NG_PPPOE_HOOK_C_LEADIN "client" /* Connect message starts this */ 6390026Ssheldonh#define NG_PPPOE_HOOK_DEBUG "debug" 6419304Speter 6590026Ssheldonh/********************************************************************** 6619304Speter * Netgraph commands understood by this node type. 6790026Ssheldonh * FAIL, SUCCESS, CLOSE and ACNAME are sent by the node rather than received. 6819304Speter ********************************************************************/ 6919304Speterenum cmd { 7019304Speter NGM_PPPOE_SET_FLAG = 1, 7119304Speter NGM_PPPOE_CONNECT = 2, /* Client, Try find this service */ 7219304Speter NGM_PPPOE_LISTEN = 3, /* Server, Await a request for this service */ 7319304Speter NGM_PPPOE_OFFER = 4, /* Server, hook X should respond (*) */ 7419304Speter NGM_PPPOE_SUCCESS = 5, /* State machine connected */ 7519304Speter NGM_PPPOE_FAIL = 6, /* State machine could not connect */ 7690026Ssheldonh NGM_PPPOE_CLOSE = 7, /* Session closed down */ 7719304Speter NGM_PPPOE_SERVICE = 8, /* additional Service to advertise (in PADO) */ 7819304Speter NGM_PPPOE_ACNAME = 9, /* AC_NAME for informational purposes */ 7919304Speter NGM_PPPOE_GET_STATUS = 10, /* data in/out */ 8019304Speter NGM_PPPOE_SESSIONID = 11 /* Session_ID for informational purposes */ 8119304Speter}; 8219304Speter 8319304Speter/*********************** 8419304Speter * Structures passed in the various netgraph command messages. 8519304Speter ***********************/ 8619304Speter/* This structure is returned by the NGM_PPPOE_GET_STATUS command */ 8719304Speterstruct ngpppoestat { 8819304Speter u_int packets_in; /* packets in from ethernet */ 8919304Speter u_int packets_out; /* packets out towards ethernet */ 9019304Speter}; 9119304Speter 9219304Speter/* Keep this in sync with the above structure definition */ 9319304Speter#define NG_PPPOESTAT_TYPE_INFO { \ 9419304Speter { "packets_in", &ng_parse_uint_type }, \ 9519304Speter { "packets_out", &ng_parse_uint_type }, \ 9619304Speter { NULL } \ 9719304Speter} 9819304Speter 9919304Speter/* 10019304Speter * When this structure is accepted by the NGM_PPPOE_CONNECT command : 10119304Speter * The data field is MANDATORY. 10219304Speter * The session sends out a PADI request for the named service. 10319304Speter * 10419304Speter * 10519304Speter * When this structure is accepted by the NGM_PPPOE_LISTEN command. 10619304Speter * If no service is given this is assumed to accept ALL PADI requests. 10719304Speter * This may at some time take a regexp expression, but not yet. 10819304Speter * Matching PADI requests will be passed up the named hook. 10919304Speter * 11019304Speter * 11119304Speter * When this structure is accepted by the NGM_PPPOE_OFFER command: 11219304Speter * The AC-NAme field is set from that given and a PADI 11319304Speter * packet is expected to arrive from the session control daemon, on the 11419304Speter * named hook. The session will then issue the appropriate PADO 11519304Speter * and begin negotiation. 11619304Speter */ 11719304Speterstruct ngpppoe_init_data { 11819304Speter char hook[NG_HOOKSIZ]; /* hook to monitor on */ 11919304Speter u_int16_t data_len; /* Length of the service name */ 12019304Speter char data[0]; /* init data goes here */ 12119304Speter}; 12219304Speter 12319304Speter/* Keep this in sync with the above structure definition */ 12419304Speter#define NG_PPPOE_INIT_DATA_TYPE_INFO { \ 12519304Speter { "hook", &ng_parse_hookbuf_type }, \ 12619304Speter { "data", &ng_parse_sizedstring_type }, \ 12719304Speter { NULL } \ 12819304Speter} 12919304Speter 13019304Speter/* 13119304Speter * This structure is used by the asychronous success and failure messages. 13219304Speter * (to report which hook has failed or connected). The message is sent 13319304Speter * to whoever requested the connection. (close may use this too). 13419304Speter */ 13519304Speterstruct ngpppoe_sts { 13619304Speter char hook[NG_HOOKSIZ]; /* hook associated with event session */ 13719304Speter}; 13819304Speter 13919304Speter/* Keep this in sync with the above structure definition */ 14019304Speter#define NG_PPPOE_STS_TYPE_INFO { \ 141254225Speter { "hook", &ng_parse_hookbuf_type }, \ 142254225Speter { NULL } \ 143254225Speter} 14419304Speter 14519304Speter 14619304Speter/******************************************************************** 14719304Speter * Constants and definitions specific to pppoe 14819304Speter ********************************************************************/ 14919304Speter 15019304Speter#define PPPOE_TIMEOUT_LIMIT 64 15119304Speter#define PPPOE_OFFER_TIMEOUT 16 15219304Speter#define PPPOE_INITIAL_TIMEOUT 2 15319304Speter 15419304Speter/* Codes to identify message types */ 15519304Speter#define PADI_CODE 0x09 15619304Speter#define PADO_CODE 0x07 15719304Speter#define PADR_CODE 0x19 15819304Speter#define PADS_CODE 0x65 15919304Speter#define PADT_CODE 0xa7 16019304Speter 16190026Ssheldonh/* Tag identifiers */ 16219304Speter#if BYTE_ORDER == BIG_ENDIAN 16319304Speter#define PTT_EOL (0x0000) 16419304Speter#define PTT_SRV_NAME (0x0101) 16519304Speter#define PTT_AC_NAME (0x0102) 16619304Speter#define PTT_HOST_UNIQ (0x0103) 16719304Speter#define PTT_AC_COOKIE (0x0104) 16819304Speter#define PTT_VENDOR (0x0105) 16919304Speter#define PTT_RELAY_SID (0x0106) 17019304Speter#define PTT_SRV_ERR (0x0201) 17119304Speter#define PTT_SYS_ERR (0x0202) 17219304Speter#define PTT_GEN_ERR (0x0203) 17319304Speter 17419304Speter#define ETHERTYPE_PPPOE_DISC 0x8863 /* pppoe discovery packets */ 17519304Speter#define ETHERTYPE_PPPOE_SESS 0x8864 /* pppoe session packets */ 17619304Speter#define ETHERTYPE_PPPOE_STUPID_DISC 0x3c12 /* pppoe discovery packets 3com? */ 17719304Speter#define ETHERTYPE_PPPOE_STUPID_SESS 0x3c13 /* pppoe session packets 3com? */ 17819304Speter#else 17919304Speter#define PTT_EOL (0x0000) 18019304Speter#define PTT_SRV_NAME (0x0101) 18119304Speter#define PTT_AC_NAME (0x0201) 18219304Speter#define PTT_HOST_UNIQ (0x0301) 18319304Speter#define PTT_AC_COOKIE (0x0401) 18419304Speter#define PTT_VENDOR (0x0501) 18519304Speter#define PTT_RELAY_SID (0x0601) 18619304Speter#define PTT_SRV_ERR (0x0102) 18719304Speter#define PTT_SYS_ERR (0x0202) 18819304Speter#define PTT_GEN_ERR (0x0302) 18919304Speter 19019304Speter#define ETHERTYPE_PPPOE_DISC 0x6388 /* pppoe discovery packets */ 19119304Speter#define ETHERTYPE_PPPOE_SESS 0x6488 /* pppoe session packets */ 19219304Speter#define ETHERTYPE_PPPOE_STUPID_DISC 0x123c /* pppoe discovery packets 3com? */ 19319304Speter#define ETHERTYPE_PPPOE_STUPID_SESS 0x133c /* pppoe session packets 3com? */ 19419304Speter#endif 195254225Speter 196254225Speterstruct pppoe_tag { 197254225Speter u_int16_t tag_type; 198254225Speter u_int16_t tag_len; 199254225Speter char tag_data[0]; 200254225Speter}__packed; 20119304Speter 20219304Speterstruct pppoe_hdr{ 20319304Speter u_int8_t ver:4; 20419304Speter u_int8_t type:4; 20519304Speter u_int8_t code; 20619304Speter u_int16_t sid; 20719304Speter u_int16_t length; 20819304Speter struct pppoe_tag tag[0]; 20919304Speter}__packed; 21019304Speter 21119304Speter 21219304Speterstruct pppoe_full_hdr { 21319304Speter struct ether_header eh; 21419304Speter struct pppoe_hdr ph; 21519304Speter}__packed; 21619304Speter 21719304Speterunion packet { 21819304Speter struct pppoe_full_hdr pkt_header; 21919304Speter u_int8_t bytes[2048]; 22019304Speter}; 22119304Speter 22219304Speterstruct datatag { 22319304Speter struct pppoe_tag hdr; 22419304Speter u_int8_t data[PPPOE_SERVICE_NAME_SIZE]; 22519304Speter}; 22619304Speter 22719304Speter 22819304Speter/* 22919304Speter * Define the order in which we will place tags in packets 23019304Speter * this may be ignored 23119304Speter */ 23219304Speter/* for PADI */ 23319304Speter#define TAGI_SVC 0 23419304Speter#define TAGI_HUNIQ 1 23519304Speter/* for PADO */ 23619304Speter#define TAGO_ACNAME 0 23719304Speter#define TAGO_SVC 1 23819304Speter#define TAGO_COOKIE 2 23919304Speter#define TAGO_HUNIQ 3 24019304Speter/* for PADR */ 24119304Speter#define TAGR_SVC 0 24219304Speter#define TAGR_HUNIQ 1 24319304Speter#define TAGR_COOKIE 2 24419304Speter/* for PADS */ 24519304Speter#define TAGS_ACNAME 0 24619304Speter#define TAGS_SVC 1 24719304Speter#define TAGS_COOKIE 2 24819304Speter#define TAGS_HUNIQ 3 24919304Speter/* for PADT */ 25019304Speter 25119304Speter#endif /* _NETGRAPH_NG_PPPOE_H_ */ 25219304Speter 25319304Speter