File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / mpd / src / l2tp_avp.h
Revision 1.1.1.2 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Mar 17 00:39:23 2021 UTC (3 years, 3 months ago) by misho
Branches: mpd, MAIN
CVS tags: v5_9p16, v5_9, HEAD
mpd 5.9

    1: 
    2: /*
    3:  * Copyright (c) 2001-2002 Packet Design, LLC.
    4:  * All rights reserved.
    5:  * 
    6:  * Subject to the following obligations and disclaimer of warranty,
    7:  * use and redistribution of this software, in source or object code
    8:  * forms, with or without modifications are expressly permitted by
    9:  * Packet Design; provided, however, that:
   10:  * 
   11:  *    (i)  Any and all reproductions of the source or object code
   12:  *         must include the copyright notice above and the following
   13:  *         disclaimer of warranties; and
   14:  *    (ii) No rights are granted, in any manner or form, to use
   15:  *         Packet Design trademarks, including the mark "PACKET DESIGN"
   16:  *         on advertising, endorsements, or otherwise except as such
   17:  *         appears in the above copyright notice or in the software.
   18:  * 
   19:  * THIS SOFTWARE IS BEING PROVIDED BY PACKET DESIGN "AS IS", AND
   20:  * TO THE MAXIMUM EXTENT PERMITTED BY LAW, PACKET DESIGN MAKES NO
   21:  * REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, REGARDING
   22:  * THIS SOFTWARE, INCLUDING WITHOUT LIMITATION, ANY AND ALL IMPLIED
   23:  * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
   24:  * OR NON-INFRINGEMENT.  PACKET DESIGN DOES NOT WARRANT, GUARANTEE,
   25:  * OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF, OR THE RESULTS
   26:  * OF THE USE OF THIS SOFTWARE IN TERMS OF ITS CORRECTNESS, ACCURACY,
   27:  * RELIABILITY OR OTHERWISE.  IN NO EVENT SHALL PACKET DESIGN BE
   28:  * LIABLE FOR ANY DAMAGES RESULTING FROM OR ARISING OUT OF ANY USE
   29:  * OF THIS SOFTWARE, INCLUDING WITHOUT LIMITATION, ANY DIRECT,
   30:  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE, OR CONSEQUENTIAL
   31:  * DAMAGES, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, LOSS OF
   32:  * USE, DATA OR PROFITS, HOWEVER CAUSED AND UNDER ANY THEORY OF
   33:  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   34:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
   35:  * THE USE OF THIS SOFTWARE, EVEN IF PACKET DESIGN IS ADVISED OF
   36:  * THE POSSIBILITY OF SUCH DAMAGE.
   37:  *
   38:  * Author: Archie Cobbs <archie@freebsd.org>
   39:  */
   40: 
   41: #ifndef _PPP_L2TP_PDEL_PPP_PPP_L2TP_AVP_H_
   42: #define _PPP_L2TP_PDEL_PPP_PPP_L2TP_AVP_H_
   43: 
   44: /***********************************************************************
   45: 			AVP STRUCTURE DEFINITIONS
   46: ***********************************************************************/
   47: 
   48: /* Constants defined in RFC 2661 */
   49: #define L2TP_PROTO_VERS		1
   50: #define L2TP_PROTO_REV		0
   51: #define L2TP_DEFAULT_PEER_WIN	4
   52: #define L2TP_BEARER_DIGITAL	0x00000001
   53: #define L2TP_BEARER_ANALOG	0x00000002
   54: #define L2TP_FRAMING_SYNC	0x00000001
   55: #define L2TP_FRAMING_ASYNC	0x00000002
   56: 
   57: #define AVP_MANDATORY		0x8000
   58: #define AVP_HIDDEN		0x4000
   59: #define AVP_RESERVED		0x3c00
   60: #define AVP_LENGTH_MASK		0x03ff
   61: #define AVP_MAX_LENGTH		1023
   62: #define AVP_MAX_VLEN		(AVP_MAX_LENGTH - 6)
   63: 
   64: struct ppp_l2tp_avp_info;
   65: struct ppp_l2tp_avp;
   66: 
   67: /* AVP decoder function type */
   68: typedef void	ppp_l2tp_avp_decode_t(const struct ppp_l2tp_avp_info *info,
   69: 			struct ppp_l2tp_avp *avp, char *buf, size_t bmax);
   70: 
   71: /* Structure describing one AVP type */
   72: struct ppp_l2tp_avp_info {
   73: 	const char		*name;		/* textual name */
   74: 	ppp_l2tp_avp_decode_t	*decode;	/* decode contents */
   75: 	u_int16_t		vendor;		/* vendor id */
   76: 	u_int16_t		type;		/* attribute type */
   77: 	u_char			hidden_ok;	/* avp allowed to be hidden */
   78: 	u_char			mandatory;	/* set mandatory bit (xmit) */
   79: 	u_int16_t		min_length;	/* minimum length of value */
   80: 	u_int16_t		max_length;	/* maximum length of value */
   81: };
   82: 
   83: /* Structure describing one AVP */
   84: struct ppp_l2tp_avp {
   85: 	u_char			mandatory;	/* mandatory bit */
   86: 	u_int16_t		vendor;		/* vendor id */
   87: 	u_int16_t		type;		/* attribute type */
   88: 	u_int16_t		vlen;		/* length of attribute value */
   89: 	void			*value;		/* attribute value */
   90: };
   91: 
   92: /* Structure describing a list of AVP's */
   93: struct ppp_l2tp_avp_list {
   94: 	u_int			length;		/* length of list */
   95: 	struct ppp_l2tp_avp	*avps;		/* array of avps in list */
   96: };
   97: 
   98: /* Individual AVP structures */
   99: struct messagetype_avp {
  100: 	u_int16_t	mesgtype;
  101: };
  102: 
  103: struct codesresulterror_avp {
  104: 	u_int16_t	result;
  105: 	u_int16_t	error;
  106: 	char		errmsg[0];
  107: };
  108: 
  109: struct protoversion_avp {
  110: 	u_int8_t	version;
  111: 	u_int8_t	revision;
  112: };
  113: 
  114: struct framecap_avp {
  115: 	u_char		async;
  116: 	u_char		sync;
  117: };
  118: 
  119: struct bearercap_avp {
  120: 	u_char		analog;
  121: 	u_char		digital;
  122: };
  123: 
  124: struct tiebreaker_avp {
  125: 	u_char		value[8];
  126: };
  127: 
  128: struct firmware_avp {
  129: 	u_int16_t	revision;
  130: };
  131: 
  132: struct hostname_avp {
  133: 	char		hostname[0];
  134: };
  135: 
  136: struct vendorname_avp {
  137: 	char		vendorname[0];
  138: };
  139: 
  140: struct tunnelid_avp {
  141: 	u_int16_t	id;
  142: };
  143: 
  144: struct sessionid_avp {
  145: 	u_int16_t	id;
  146: };
  147: 
  148: struct windowsize_avp {
  149: 	u_int16_t	size;
  150: };
  151: 
  152: struct challenge_avp {
  153: 	u_int		length;
  154: 	u_char		value[0];
  155: };
  156: 
  157: struct challengeresp_avp {
  158: 	u_char		value[16];
  159: };
  160: 
  161: struct causecode_avp {
  162: 	u_int16_t	causecode;
  163: 	u_int8_t	causemsg;
  164: 	char		message[0];
  165: };
  166: 
  167: struct serialnum_avp {
  168: 	u_int32_t	serialnum;
  169: };
  170: 
  171: struct minbps_avp {
  172: 	u_int32_t	minbps;
  173: };
  174: 
  175: struct maxbps_avp {
  176: 	u_int32_t	maxbps;
  177: };
  178: 
  179: struct bearer_avp {
  180: 	u_char		analog;
  181: 	u_char		digital;
  182: };
  183: 
  184: struct framing_avp {
  185: 	u_char		async;
  186: 	u_char		sync;
  187: };
  188: 
  189: struct callednum_avp {
  190: 	char		number[0];
  191: };
  192: 
  193: struct callingnum_avp {
  194: 	char		number[0];
  195: };
  196: 
  197: struct subaddress_avp {
  198: 	char		number[0];
  199: };
  200: 
  201: struct txconnect_avp {
  202: 	u_int32_t	bps;
  203: };
  204: 
  205: struct rxconnect_avp {
  206: 	u_int32_t	bps;
  207: };
  208: 
  209: struct channelid_avp {
  210: 	u_int32_t	channel;
  211: };
  212: 
  213: struct groupid_avp {
  214: 	u_int		length;
  215: 	u_char		data[0];
  216: };
  217: 
  218: struct recvlcp_avp {
  219: 	u_int		length;
  220: 	u_char		data[0];
  221: };
  222: 
  223: struct lastsentlcp_avp {
  224: 	u_int		length;
  225: 	u_char		data[0];
  226: };
  227: 
  228: struct lastrecvlcp_avp {
  229: 	u_int		length;
  230: 	u_char		data[0];
  231: };
  232: 
  233: struct proxyauth_avp {
  234: 	u_int16_t	type;
  235: };
  236: 
  237: struct proxyname_avp {
  238: 	u_int		length;
  239: 	char		data[0];
  240: };
  241: 
  242: struct proxychallenge_avp {
  243: 	u_int		length;
  244: 	u_char		data[0];
  245: };
  246: 
  247: struct proxyid_avp {
  248: 	u_int16_t	id;
  249: };
  250: 
  251: struct proxyresp_avp {
  252: 	u_int		length;
  253: 	u_char		data[0];
  254: };
  255: 
  256: struct callerror_avp {
  257: 	u_int32_t	crc;
  258: 	u_int32_t	frame;
  259: 	u_int32_t	overrun;
  260: 	u_int32_t	buffer;
  261: 	u_int32_t	timeout;
  262: 	u_int32_t	alignment;
  263: };
  264: 
  265: struct accm_avp {
  266: 	u_int32_t	xmit;
  267: 	u_int32_t	recv;
  268: };
  269: 
  270: struct seqrequired_avp {
  271: };
  272: 
  273: /*
  274:  * This structure describes a suite of AVPs in host-friendly format.
  275:  * Typically only a sub-set of the AVPs listed will be used.
  276:  */
  277: struct ppp_l2tp_avp_ptrs {
  278: 	struct messagetype_avp		*message;
  279: 	struct codesresulterror_avp	*errresultcode;
  280: 	struct protoversion_avp		*protocol;
  281: 	struct framecap_avp		*framingcap;
  282: 	struct bearercap_avp		*bearercap;
  283: 	struct tiebreaker_avp		*tiebreaker;
  284: 	struct firmware_avp		*firmware;
  285: 	struct hostname_avp		*hostname;
  286: 	struct vendorname_avp		*vendor;
  287: 	struct tunnelid_avp		*tunnelid;
  288: 	struct sessionid_avp		*sessionid;
  289: 	struct windowsize_avp		*winsize;
  290: 	struct challenge_avp		*challenge;
  291: 	struct challengeresp_avp	*challengresp;
  292: 	struct causecode_avp		*causecode;
  293: 	struct serialnum_avp		*serialnum;
  294: 	struct minbps_avp		*minbps;
  295: 	struct maxbps_avp		*maxbps;
  296: 	struct bearer_avp		*bearer;
  297: 	struct framing_avp		*framing;
  298: 	struct callednum_avp		*callednum;
  299: 	struct callingnum_avp		*callingnum;
  300: 	struct subaddress_avp		*subaddress;
  301: 	struct txconnect_avp		*txconnect;
  302: 	struct rxconnect_avp		*rxconnect;
  303: 	struct channelid_avp		*channelid;
  304: 	struct groupid_avp		*groupid;
  305: 	struct recvlcp_avp		*recvlcp;
  306: 	struct lastsentlcp_avp		*lastsendlcp;
  307: 	struct lastrecvlcp_avp		*lastrecvlcp;
  308: 	struct proxyauth_avp		*proxyauth;
  309: 	struct proxyname_avp		*proxyname;
  310: 	struct proxychallenge_avp	*proxychallenge;
  311: 	struct proxyid_avp		*proxyid;
  312: 	struct proxyresp_avp		*proxyres;
  313: 	struct callerror_avp		*callerror;
  314: 	struct accm_avp			*accm;
  315: 	struct seqrequired_avp		*seqrequired;
  316: };
  317: 
  318: /* L2TP result codes for StopCCN messages */
  319: #define L2TP_RESULT_CLEARED	1	/* general reqst. to clear connection */
  320: #define L2TP_RESULT_ERROR	2	/* general error: see error code */
  321: #define L2TP_RESULT_DUP_CTRL	3	/* dupliate control channel */
  322: #define L2TP_RESULT_NOT_AUTH	4	/* control channel not authorized */
  323: #define L2TP_RESULT_PROTO_VERS	5	/* unsupported protocol: max=err code */
  324: #define L2TP_RESULT_SHUTDOWN	6	/* being shut down */
  325: #define L2TP_RESULT_FSM		7	/* fsm error */
  326: 
  327: /* L2TP result codes for CDN messages */
  328: #define L2TP_RESULT_DRP_CARRIER	1	/* lost carrier */
  329: #define L2TP_RESULT_ERROR	2	/* general error: see error code */
  330: #define L2TP_RESULT_ADMIN	3	/* administrative disconnect */
  331: #define L2TP_RESULT_AVAIL_TEMP	4	/* temp. lack of available resources */
  332: #define L2TP_RESULT_AVAIL_PERM	5	/* perm. lack of available resources */
  333: #define L2TP_RESULT_DEST	6	/* invalid destination */
  334: #define L2TP_RESULT_NO_CARRIER	7	/* no carrier detected */
  335: #define L2TP_RESULT_BUSY	8	/* busy signal */
  336: #define L2TP_RESULT_NO_DIALTONE	9	/* no dial tone */
  337: #define L2TP_RESULT_TIMEOUT	10	/* timeout during establishment */
  338: #define L2TP_RESULT_NO_FRAMING	11	/* no appropriate framing detected */
  339: 
  340: /* L2TP error codes */
  341: #define L2TP_ERROR_NO_CTRL	1	/* no control connection exists */
  342: #define L2TP_ERROR_LENGTH	2	/* length is wrong */
  343: #define L2TP_ERROR_BAD_VALUE	3	/* invalid or field non-zero resv. */
  344: #define L2TP_ERROR_RESOURCES	4	/* insufficient resources */
  345: #define L2TP_ERROR_INVALID_ID	5	/* invalid session id */
  346: #define L2TP_ERROR_GENERIC	6	/* generic vendor-specific error */
  347: #define L2TP_ERROR_TRY_ANOTHER	7	/* try another lns */
  348: #define L2TP_ERROR_MANDATORY	8	/* rec'd unknown mandatory avp */
  349: 
  350: /***********************************************************************
  351: 			AVP TYPES
  352: ***********************************************************************/
  353: 
  354: enum ppp_l2tp_avp_type {
  355: 	AVP_MESSAGE_TYPE		=0,
  356: 	AVP_RESULT_CODE			=1,
  357: 	AVP_PROTOCOL_VERSION		=2,
  358: 	AVP_FRAMING_CAPABILITIES	=3,
  359: 	AVP_BEARER_CAPABILITIES		=4,
  360: 	AVP_TIE_BREAKER			=5,
  361: 	AVP_FIRMWARE_REVISION		=6,
  362: 	AVP_HOST_NAME			=7,
  363: 	AVP_VENDOR_NAME			=8,
  364: 	AVP_ASSIGNED_TUNNEL_ID		=9,
  365: 	AVP_RECEIVE_WINDOW_SIZE		=10,
  366: 	AVP_CHALLENGE			=11,
  367: 	AVP_CAUSE_CODE			=12,
  368: 	AVP_CHALLENGE_RESPONSE		=13,
  369: 	AVP_ASSIGNED_SESSION_ID		=14,
  370: 	AVP_CALL_SERIAL_NUMBER		=15,
  371: 	AVP_MINIMUM_BPS			=16,
  372: 	AVP_MAXIMUM_BPS			=17,
  373: 	AVP_BEARER_TYPE			=18,
  374: 	AVP_FRAMING_TYPE		=19,
  375: 	AVP_CALLED_NUMBER		=21,
  376: 	AVP_CALLING_NUMBER		=22,
  377: 	AVP_SUB_ADDRESS			=23,
  378: 	AVP_TX_CONNECT_SPEED		=24,
  379: 	AVP_PHYSICAL_CHANNEL_ID		=25,
  380: 	AVP_INITIAL_RECV_CONFREQ	=26,
  381: 	AVP_LAST_SENT_CONFREQ		=27,
  382: 	AVP_LAST_RECV_CONFREQ		=28,
  383: 	AVP_PROXY_AUTHEN_TYPE		=29,
  384: 	AVP_PROXY_AUTHEN_NAME		=30,
  385: 	AVP_PROXY_AUTHEN_CHALLENGE	=31,
  386: 	AVP_PROXY_AUTHEN_ID		=32,
  387: 	AVP_PROXY_AUTHEN_RESPONSE	=33,
  388: 	AVP_CALL_ERRORS			=34,
  389: 	AVP_ACCM			=35,
  390: 	AVP_RANDOM_VECTOR		=36,
  391: 	AVP_PRIVATE_GROUP_ID		=37,
  392: 	AVP_RX_CONNECT_SPEED		=38,
  393: 	AVP_SEQUENCING_REQUIRED		=39,
  394: 	AVP_MAX				=40
  395: };
  396: 
  397: /***********************************************************************
  398: 			AVP FUNCTIONS
  399: ***********************************************************************/
  400: 
  401: __BEGIN_DECLS
  402: 
  403: /*
  404:  * Create an AVP pointers structure from an AVP list.
  405:  *
  406:  * AVP's not listed in the pointers structure are simply omitted.
  407:  *
  408:  * Returns:
  409:  *	NULL	If failure (errno is set)
  410:  *	ptrs	New pointers structure
  411:  */
  412: extern struct	ppp_l2tp_avp_ptrs *ppp_l2tp_avp_list2ptrs(
  413: 			const struct ppp_l2tp_avp_list *list);
  414: 
  415: /*
  416:  * Destroy an AVP pointers structure.
  417:  *
  418:  * Arguments:
  419:  *	ptrsp	Pointer to 'AVP pointers' pointer; it gets set to NULL
  420:  */
  421: extern void	ppp_l2tp_avp_ptrs_destroy(struct ppp_l2tp_avp_ptrs **ptrsp);
  422: 
  423: /*
  424:  * Create a new AVP structure.
  425:  *
  426:  * Arguments:
  427:  *	mandatory Set mandatory bit
  428:  *	vendor	Attribute vendor
  429:  *	type	Attribute type
  430:  *	value	Value contents
  431:  *	vlen	Length of value contents
  432:  *
  433:  * Returns:
  434:  *	NULL	If failure (errno is set)
  435:  *	avp	New AVP structure
  436:  */
  437: extern struct	ppp_l2tp_avp *ppp_l2tp_avp_create(int mandatory,
  438: 			u_int16_t vendor, u_int16_t type, const void *value,
  439: 			size_t vlen);
  440: 
  441: /*
  442:  * Copy an AVP struture.
  443:  *
  444:  * Returns:
  445:  *	NULL	If failure (errno is set)
  446:  *	ptr	New AVP structure
  447:  */
  448: extern struct	ppp_l2tp_avp *ppp_l2tp_avp_copy(const struct ppp_l2tp_avp *avp);
  449: 
  450: /*
  451:  * Destroy an AVP structure.
  452:  *
  453:  * Arguments:
  454:  *	avpp	Pointer to AVP pointer; it gets set to NULL
  455:  */
  456: extern void	ppp_l2tp_avp_destroy(struct ppp_l2tp_avp **avpp);
  457: 
  458: /*
  459:  * Create a new AVP list.
  460:  *
  461:  * Returns:
  462:  *	NULL	If failure (errno is set)
  463:  *	ptr	New AVP list structure
  464:  */
  465: extern struct	ppp_l2tp_avp_list *ppp_l2tp_avp_list_create(void);
  466: 
  467: /*
  468:  * Insert an AVP into a list.
  469:  *
  470:  * Arguments:
  471:  *	list	List to insert AVP into
  472:  *	avpp	Pointer to AVP pointer; it gets set to NULL if successful
  473:  *	index	Where in list to insert; special case -1 means 'at the end'
  474:  *
  475:  * Returns:
  476:  *	 0	Successful
  477:  *	-1	If failure (errno is set)
  478:  */
  479: extern int	ppp_l2tp_avp_list_insert(struct ppp_l2tp_avp_list *list,
  480: 			struct ppp_l2tp_avp **avpp, unsigned index);
  481: 
  482: /*
  483:  * Create a new AVP and add it to the end of the given list. That is, this
  484:  * ia a combination of ppp_l2tp_avp_create() and ppp_l2tp_avp_list_insert()
  485:  * added for convenience in a common operation.
  486:  *
  487:  * Arguments:
  488:  *	list	List to append AVP to
  489:  *	mandatory Set mandatory bit
  490:  *	vendor	Attribute vendor
  491:  *	type	Attribute type
  492:  *	value	Value contents
  493:  *	vlen	Length of value contents
  494:  *
  495:  * Returns:
  496:  *	 0	Successful
  497:  *	-1	If failure (errno is set)
  498:  */
  499: extern int	ppp_l2tp_avp_list_append(struct ppp_l2tp_avp_list *list,
  500: 		    int mandatory, u_int16_t vendor, u_int16_t type,
  501: 		    const void *value, size_t vlen);
  502: 
  503: /*
  504:  * Extract an AVP from a list.
  505:  *
  506:  * Arguments:
  507:  *	list	List to extract AVP from
  508:  *	index	Which item to extract
  509:  *
  510:  * Returns:
  511:  *	avp	If 'index' is valid, extracted item
  512:  *	NULL	If 'index' is out of range
  513:  */
  514: extern struct	ppp_l2tp_avp *ppp_l2tp_avp_list_extract(
  515: 			struct ppp_l2tp_avp_list *list, u_int index);
  516: 
  517: /*
  518:  * Remove and destroy an AVP from a list.
  519:  *
  520:  * Arguments:
  521:  *	list	List to remove AVP from
  522:  *	index	Which item to remove
  523:  *
  524:  * Returns:
  525:  *	 0	If 'index' is valid and AVP was removed
  526:  *	-1	If 'index' is out of range
  527:  */
  528: extern int	ppp_l2tp_avp_list_remove(
  529: 			struct ppp_l2tp_avp_list *list, u_int index);
  530: 
  531: /*
  532:  * Find an AVP in a list.
  533:  *
  534:  * Arguments:
  535:  *	list	List of AVP's
  536:  *	vendor	AVP vendor
  537:  *	type	AVP attribute type
  538:  *
  539:  * Returns:
  540:  *	index	If found, index of AVP in list
  541:  *	-1	If not found.
  542:  */
  543: extern int	ppp_l2tp_avp_list_find(const struct ppp_l2tp_avp_list *list,
  544: 			u_int16_t vendor, u_int16_t type);
  545: 
  546: /*
  547:  * Copy an AVP list.
  548:  *
  549:  * Returns:
  550:  *	NULL	If failure (errno is set)
  551:  *	ptr	New AVP list structure
  552:  */
  553: extern struct	ppp_l2tp_avp_list *ppp_l2tp_avp_list_copy(
  554: 			const struct ppp_l2tp_avp_list *list);
  555: 
  556: /*
  557:  * Destroy an AVP list.
  558:  *
  559:  * Arguments:
  560:  *	listp	Pointer to AVP list pointer; it gets set to NULL
  561:  */
  562: extern void	ppp_l2tp_avp_list_destroy(struct ppp_l2tp_avp_list **listp);
  563: 
  564: /*
  565:  * Encode a list of AVP's into a single buffer, preserving the order
  566:  * of the AVP's.  If a shared secret is supplied, and any of the AVP's
  567:  * are hidden, then any required random vector AVP's are created and
  568:  * inserted automatically.
  569:  *
  570:  * Arguments:
  571:  *	info	AVP info list, terminated with NULL name
  572:  *	list	List of AVP structures to encode
  573:  *	secret	Shared secret for hiding AVP's, or NULL for none.
  574:  *	slen	Length of shared secret (if secret != NULL)
  575:  *	buf	Buffer for the data, or NULL to only compute length.
  576:  *
  577:  * Returns:
  578:  *	-1	If failure (errno is set)
  579:  *	length	If successful, length of encoded data (in bytes)
  580:  *
  581:  * Possibilities for errno:
  582:  *	EILSEQ	Invalid data format
  583:  */
  584: extern int	ppp_l2tp_avp_pack(const struct ppp_l2tp_avp_info *info,
  585: 			const struct ppp_l2tp_avp_list *list,
  586: 			const u_char *secret, size_t slen, u_char *buf);
  587: 
  588: /*
  589:  * Decode a packet into an array of unpacked AVP structures, preserving
  590:  * the order of the AVP's. Random vector AVP's are automatically removed.
  591:  *
  592:  * Arguments:
  593:  *	info	AVP info list, terminated with NULL name
  594:  *	data	Original packed AVP data packet
  595:  *	dlen	Length of the data pointed to by 'data'
  596:  *	secret	Shared secret for unhiding AVP's, or NULL for none.
  597:  *	slen	Length of shared secret (if secret != NULL)
  598:  *
  599:  * Returns:
  600:  *	NULL	If failure (errno is set)
  601:  *	length	If successful, the unpacked list
  602:  *
  603:  * Possibilities for errno:
  604:  *	EILSEQ	Invalid data format
  605:  *	EAUTH	Hidden AVP found but no shared secret was provided
  606:  *	ENOSYS	Mandatory but unrecognized AVP seen (i.e., AVP not in list)
  607:  */
  608: extern struct	ppp_l2tp_avp_list *ppp_l2tp_avp_unpack(
  609: 			const struct ppp_l2tp_avp_info *info,
  610: 			u_char *data, size_t dlen,
  611: 			const u_char *secret, size_t slen);
  612: 
  613: /*
  614:  * AVP decoders
  615:  */
  616: extern ppp_l2tp_avp_decode_t	ppp_l2tp_avp_decode_MESSAGE_TYPE;
  617: extern ppp_l2tp_avp_decode_t	ppp_l2tp_avp_decode_RESULT_CODE;
  618: extern ppp_l2tp_avp_decode_t	ppp_l2tp_avp_decode_PROTOCOL_VERSION;
  619: extern ppp_l2tp_avp_decode_t	ppp_l2tp_avp_decode_FRAMING_CAPABILITIES;
  620: extern ppp_l2tp_avp_decode_t	ppp_l2tp_avp_decode_BEARER_CAPABILITIES;
  621: extern ppp_l2tp_avp_decode_t	ppp_l2tp_avp_decode_TIE_BREAKER;
  622: extern ppp_l2tp_avp_decode_t	ppp_l2tp_avp_decode_FIRMWARE_REVISION;
  623: extern ppp_l2tp_avp_decode_t	ppp_l2tp_avp_decode_HOST_NAME;
  624: extern ppp_l2tp_avp_decode_t	ppp_l2tp_avp_decode_VENDOR_NAME;
  625: extern ppp_l2tp_avp_decode_t	ppp_l2tp_avp_decode_ASSIGNED_TUNNEL_ID;
  626: extern ppp_l2tp_avp_decode_t	ppp_l2tp_avp_decode_RECEIVE_WINDOW_SIZE;
  627: extern ppp_l2tp_avp_decode_t	ppp_l2tp_avp_decode_CHALLENGE;
  628: extern ppp_l2tp_avp_decode_t	ppp_l2tp_avp_decode_CAUSE_CODE;
  629: extern ppp_l2tp_avp_decode_t	ppp_l2tp_avp_decode_CHALLENGE_RESPONSE;
  630: extern ppp_l2tp_avp_decode_t	ppp_l2tp_avp_decode_ASSIGNED_SESSION_ID;
  631: extern ppp_l2tp_avp_decode_t	ppp_l2tp_avp_decode_CALL_SERIAL_NUMBER;
  632: extern ppp_l2tp_avp_decode_t	ppp_l2tp_avp_decode_MINIMUM_BPS;
  633: extern ppp_l2tp_avp_decode_t	ppp_l2tp_avp_decode_MAXIMUM_BPS;
  634: extern ppp_l2tp_avp_decode_t	ppp_l2tp_avp_decode_BEARER_TYPE;
  635: extern ppp_l2tp_avp_decode_t	ppp_l2tp_avp_decode_FRAMING_TYPE;
  636: extern ppp_l2tp_avp_decode_t	ppp_l2tp_avp_decode_CALLED_NUMBER;
  637: extern ppp_l2tp_avp_decode_t	ppp_l2tp_avp_decode_CALLING_NUMBER;
  638: extern ppp_l2tp_avp_decode_t	ppp_l2tp_avp_decode_SUB_ADDRESS;
  639: extern ppp_l2tp_avp_decode_t	ppp_l2tp_avp_decode_TX_CONNECT_SPEED;
  640: extern ppp_l2tp_avp_decode_t	ppp_l2tp_avp_decode_PHYSICAL_CHANNEL_ID;
  641: extern ppp_l2tp_avp_decode_t	ppp_l2tp_avp_decode_INITIAL_RECV_CONFREQ;
  642: extern ppp_l2tp_avp_decode_t	ppp_l2tp_avp_decode_LAST_SENT_CONFREQ;
  643: extern ppp_l2tp_avp_decode_t	ppp_l2tp_avp_decode_LAST_RECV_CONFREQ;
  644: extern ppp_l2tp_avp_decode_t	ppp_l2tp_avp_decode_PROXY_AUTHEN_TYPE;
  645: extern ppp_l2tp_avp_decode_t	ppp_l2tp_avp_decode_PROXY_AUTHEN_NAME;
  646: extern ppp_l2tp_avp_decode_t	ppp_l2tp_avp_decode_PROXY_AUTHEN_CHALLENGE;
  647: extern ppp_l2tp_avp_decode_t	ppp_l2tp_avp_decode_PROXY_AUTHEN_ID;
  648: extern ppp_l2tp_avp_decode_t	ppp_l2tp_avp_decode_PROXY_AUTHEN_RESPONSE;
  649: extern ppp_l2tp_avp_decode_t	ppp_l2tp_avp_decode_CALL_ERRORS;
  650: extern ppp_l2tp_avp_decode_t	ppp_l2tp_avp_decode_ACCM;
  651: extern ppp_l2tp_avp_decode_t	ppp_l2tp_avp_decode_RANDOM_VECTOR;
  652: extern ppp_l2tp_avp_decode_t	ppp_l2tp_avp_decode_PRIVATE_GROUP_ID;
  653: extern ppp_l2tp_avp_decode_t	ppp_l2tp_avp_decode_RX_CONNECT_SPEED;
  654: extern ppp_l2tp_avp_decode_t	ppp_l2tp_avp_decode_SEQUENCING_REQUIRED;
  655: 
  656: __END_DECLS
  657: 
  658: #endif /* _PPP_L2TP_PDEL_PPP_PPP_L2TP_AVP_H_ */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>