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