File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / mpd / src / l2tp_ctrl.h
Revision 1.1.1.2 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Nov 1 09:56:12 2016 UTC (7 years, 8 months ago) by misho
Branches: mpd, MAIN
CVS tags: v5_9p16, v5_9, v5_8p7, v5_8p1_cross, v5_8p1, v5_8, HEAD
mpd 5.8

    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_CTRL_H_
   42: #define _PPP_L2TP_PDEL_PPP_PPP_L2TP_CTRL_H_
   43: 
   44: /*
   45:  * API between L2TP 'control' and 'link' code. The control code handles
   46:  * the L2TP control connection. The link code handles plumbing netgraph,
   47:  * and interfacing with the PPP engine.
   48:  *
   49:  * Each control connection is represented by a 'struct ppp_l2tp_ctrl',
   50:  * and each session by a 'struct ppp_l2tp_sess'. The link side may store
   51:  * its own opaque pointer in these structures as well.
   52:  *
   53:  * The functions and callbacks are designed so that whenever either side
   54:  * declares a control connection or session 'terminated', then the other
   55:  * side (whose function is being called) must not refer to that object
   56:  * any more.
   57:  *
   58:  * It is presumed that the 'link' side has a mutex which is held while
   59:  * calling any of the 'control' side functions, and which is acquired
   60:  * first when any 'link' side functions are invoked. In other words,
   61:  * the control side is not reentrant (though see 'ppp_l2tp_initiated_t'
   62:  * for an exception).
   63:  */
   64: 
   65: struct ppp_l2tp_ctrl;			/* control connection structure */
   66: struct ppp_l2tp_sess;			/* call session structure */
   67: 
   68: /************************************************************************
   69: 		CONTROL -> LINK CALLBACK FUNCTIONS
   70: ************************************************************************/
   71: 
   72: /*
   73:  * This is called when a control connection gets connected state
   74:  *
   75:  * Arguments:
   76:  *	ctrl	Control connection
   77:  */
   78: typedef void	ppp_l2tp_ctrl_connected_t(struct ppp_l2tp_ctrl *ctrl);
   79: 
   80: /*
   81:  * This is called when a control connection is terminated for any reason
   82:  * other than a call ppp_l2tp_ctrl_destroy().
   83:  *
   84:  * Arguments:
   85:  *	ctrl	Control connection
   86:  *	result	Result code (never zero)
   87:  *	error	Error code (if result == L2TP_RESULT_GENERAL, else zero)
   88:  *	errmsg	Error message string
   89:  */
   90: typedef void	ppp_l2tp_ctrl_terminated_t(struct ppp_l2tp_ctrl *ctrl,
   91: 			u_int16_t result, u_int16_t error, const char *errmsg);
   92: 
   93: /*
   94:  * This is called just before control connection is destroyed for any reason
   95:  * other than a call ppp_l2tp_ctrl_destroy().
   96:  *
   97:  * Arguments:
   98:  *	ctrl	Control connection
   99:  */
  100: typedef void	ppp_l2tp_ctrl_destroyed_t(struct ppp_l2tp_ctrl *ctrl);
  101: 
  102: /*
  103:  * This callback is used to report the peer's initiating a new incoming
  104:  * or outgoing call.
  105:  *
  106:  * In the case of an incoming call, when/if the call eventually connects,
  107:  * the ppp_l2tp_connected_t callback will be called by the control side.
  108:  *
  109:  * In the case of an outgoing call, the link side is responsible for calling
  110:  * ppp_l2tp_connected() when/if the call is connected.
  111:  *
  112:  * This callback may choose to call ppp_l2tp_terminate() (to deny the call)
  113:  * or ppp_l2tp_connected() (to accept it immediately if outgoing) before
  114:  * returning.
  115:  *
  116:  * The link side is expected to plumb the netgraph session hook at this time.
  117:  *
  118:  * Arguments:
  119:  *	ctrl	Associated control connection
  120:  *	sess	Session structure
  121:  *	out	Non-zero to indicate outgoing call
  122:  *	avps	AVP's contained in the associated Outgoing-Call-Request
  123:  *		or Incoming-Call-Request control message.
  124:  */
  125: typedef void	ppp_l2tp_initiated_t(struct ppp_l2tp_ctrl *ctrl,
  126: 			struct ppp_l2tp_sess *sess, int out,
  127: 			const struct ppp_l2tp_avp_list *avps,
  128: 			u_char *include_length, u_char *enable_dseq);
  129: 
  130: /*
  131:  * This callback is used to report successful connection of a remotely
  132:  * initiated incoming call (see ppp_l2tp_initiated_t) or a locally initiated
  133:  * outgoing call (see ppp_l2tp_initiate()).  That is, we are acting as
  134:  * the LNS for this session.
  135:  *
  136:  * Arguments:
  137:  *	sess	Session structure
  138:  *	avps	AVP's contained in the associated Outgoing-Call-Connected
  139:  *		or Incoming-Call-Connected control message.
  140:  */
  141: typedef void	ppp_l2tp_connected_t(struct ppp_l2tp_sess *sess,
  142: 			const struct ppp_l2tp_avp_list *avps);
  143: 
  144: /*
  145:  * This callback is called when any call, whether successfully connected
  146:  * or not, is terminated for any reason other than explict termination
  147:  * from the link side (via a call to either ppp_l2tp_terminate() or
  148:  * ppp_l2tp_ctrl_destroy()).
  149:  *
  150:  * Arguments:
  151:  *	sess	Session structure
  152:  *	result	Result code (never zero)
  153:  *	error	Error code (if result == L2TP_RESULT_GENERAL, else zero)
  154:  *	errmsg	Error message string
  155:  */
  156: typedef void	ppp_l2tp_terminated_t(struct ppp_l2tp_sess *sess,
  157: 			u_int16_t result, u_int16_t error, const char *errmsg);
  158: 
  159: /*
  160:  * This callback is used when the remote side sends a Set-Link-Info
  161:  * message. It is optional and may be NULL if not required.
  162:  *
  163:  * Arguments:
  164:  *	sess	Session structure
  165:  *	xmit	LAC's send ACCM
  166:  *	recv	LAC's receive ACCM
  167:  */
  168: typedef void	ppp_l2tp_set_link_info_t(struct ppp_l2tp_sess *sess,
  169: 			u_int32_t xmit, u_int32_t recv);
  170: 
  171: /*
  172:  * This callback is used when the remote side sends a WAN-Error-Notify
  173:  * message. It is optional and may be NULL if not required.
  174:  *
  175:  * Arguments:
  176:  *	sess	Session structure
  177:  *	crc	CRC errors
  178:  *	frame	Framing errors
  179:  *	overrun	Hardware overrun errors
  180:  *	buffer	Buffer overrun errors
  181:  *	timeout	Timeout errors
  182:  *	align	Alignment errors
  183:  */
  184: typedef void	ppp_l2tp_wan_error_notify_t(struct ppp_l2tp_sess *sess,
  185: 			u_int32_t crc, u_int32_t frame, u_int32_t overrun,
  186: 			u_int32_t buffer, u_int32_t timeout, u_int32_t align);
  187: 
  188: /* Callback structure provided by the link side */
  189: struct ppp_l2tp_ctrl_cb {
  190: 	ppp_l2tp_ctrl_connected_t	*ctrl_connected;
  191: 	ppp_l2tp_ctrl_terminated_t	*ctrl_terminated;
  192: 	ppp_l2tp_ctrl_destroyed_t	*ctrl_destroyed;
  193: 	ppp_l2tp_initiated_t		*initiated;
  194: 	ppp_l2tp_connected_t		*connected;
  195: 	ppp_l2tp_terminated_t		*terminated;
  196: 	ppp_l2tp_set_link_info_t	*set_link_info;
  197: 	ppp_l2tp_wan_error_notify_t	*wan_error_notify;
  198: };
  199: 
  200: /************************************************************************
  201: 			LINK -> CONTROL FUNCTIONS
  202: ************************************************************************/
  203: 
  204: __BEGIN_DECLS
  205: 
  206: /*
  207:  * This function creates a new control connection. If successful, the
  208:  * control code will create a ng_l2tp(4) node and fill in *nodep and
  209:  * the 'hook' buffer. The link code must then connect this hook to the
  210:  * appropriate L2TP packet delivery node before the next context switch.
  211:  *
  212:  * The control code guarantees exactly one call in the future to the
  213:  * ppp_l2tp_ctrl_terminated_t callback unless ppp_l2tp_ctrl_destroy()
  214:  * is called first.
  215:  *
  216:  * Arguments:
  217:  *	ctx	Event context for use by control code
  218:  *	mutex	Mutex for operation
  219:  *	cb	Pointer to link callback functions
  220:  *	log	Where to log stuff (if successful, the log is consumed)
  221:  *	peer_id	Unique identifier for peer (used for tie-breakers)
  222:  *	initiate Whether to send a SCCRQ or just wait for one
  223:  *	nodep	Pointer to netgraph node ID variable
  224:  *	hook	Buffer for hook on L2TP netgraph node (size >= NG_HOOKSIZ)
  225:  *	avps	List of AVP's to include in the associated
  226:  *		Start-Control-Connection-Request or
  227:  *		Start-Control-Connection-Reply control message.
  228:  *	secret	Shared secret (or NULL if none required)
  229:  *	seclen	Length of shared secret (if secret != NULL)
  230:  *
  231:  * Returns NULL if failure (errno is set), otherwise a pointer to an
  232:  * opaque control connection object.
  233:  */
  234: extern struct	ppp_l2tp_ctrl *ppp_l2tp_ctrl_create(struct pevent_ctx *ctx,
  235: 			pthread_mutex_t *mutex,
  236: 			const struct ppp_l2tp_ctrl_cb *cb,
  237: 			u_int32_t peer_id, ng_ID_t *nodep,
  238: 			char *hook, const struct ppp_l2tp_avp_list *avps,
  239: 			const void *secret, size_t seclen,
  240: 			u_char hide_avps);
  241: 
  242: /*
  243:  * This function initiates a new tunnel connection.
  244:  *
  245:  * Arguments:
  246:  *	ctrl	Control connection
  247:  *
  248:  * Returns:
  249:  *	NULL	Initiation failed, errno is set
  250:  *	ctrl	Control structure
  251:  */
  252: extern struct	ppp_l2tp_ctrl *ppp_l2tp_ctrl_initiate(struct ppp_l2tp_ctrl *ctrl);
  253: 
  254: /*
  255:  * Close a control connection gracefully.
  256:  *
  257:  * All active sessions will be terminated, and eventually
  258:  * ppp_l2tp_ctrl_terminated_t will be called, assuming no
  259:  * intervening call to ppp_l2tp_ctrl_destroy() has been made.
  260:  *
  261:  * Arguments:
  262:  *	ctrl	Control connection structure
  263:  *	result	Result code (never zero)
  264:  *	error	Error code (if result == L2TP_RESULT_GENERAL, else zero)
  265:  *	errmsg	Error message string
  266:  */
  267: extern void	ppp_l2tp_ctrl_shutdown(struct ppp_l2tp_ctrl *ctrl,
  268: 			u_int16_t result, u_int16_t error, const char *errmsg);
  269: 
  270: /*
  271:  * Immediately destroy a control connection and all associated sessions.
  272:  * This does *not* result in any callbacks to the link side for either
  273:  * active sessions (ppp_l2tp_terminated_t) or the control connection
  274:  * itself (ppp_l2tp_ctrl_terminated_t).
  275:  *
  276:  * Upon return, *ctrlp will be set to NULL.
  277:  *
  278:  * Arguments:
  279:  *	ctrlp	Pointer to the control connection descriptor pointer
  280:  */
  281: extern void	ppp_l2tp_ctrl_destroy(struct ppp_l2tp_ctrl **ctrlp);
  282: 
  283: /*
  284:  * Returns control connection status.
  285:  *
  286:  * Arguments:
  287:  *	ctrlp	Pointer to the control connection descriptor pointer
  288:  */
  289: extern char *	ppp_l2tp_ctrl_stats(struct ppp_l2tp_ctrl *ctrl,
  290: 			char *buf, size_t buf_len);
  291: 
  292: /*
  293:  * This function initiates a new session, either an as an incoming or
  294:  * outgoing call request to the peer.
  295:  *
  296:  * In the case of an incoming call, when/if the call eventually connects,
  297:  * ppp_l2tp_connected() must be called.
  298:  *
  299:  * In the case of an outgoing call, when/if the call eventually connects,
  300:  * the link's ppp_l2tp_connected_t callback will be invoked.
  301:  *
  302:  * The link side is expected to plumb the netgraph session hook at this time.
  303:  *
  304:  * Arguments:
  305:  *	ctrl	Control connection
  306:  *	out	Non-zero to indicate outgoing call
  307:  *	avps	List of AVP's to include in the associated
  308:  *		Outgoing-Call-Request or Incoming-Call-Request
  309:  *		control message.
  310:  *
  311:  * Returns:
  312:  *	NULL	Initiation failed, errno is set
  313:  *	sess	Session structure
  314:  */
  315: extern struct	ppp_l2tp_sess *ppp_l2tp_initiate(struct ppp_l2tp_ctrl *ctrl,
  316: 			int out, u_char include_length, u_char enable_dseq, 
  317: 			const struct ppp_l2tp_avp_list *avps);
  318: 
  319: /*
  320:  * This function is used to report successful connection of a remotely
  321:  * initiated outgoing call (see ppp_l2tp_initiated_t) or a locally initiated
  322:  * incoming call (see ppp_l2tp_initiate()). That is, we are acting as
  323:  * the LAC for this session.
  324:  *
  325:  * Note: if this function returns -1, no special action is required;
  326:  * the control side will close the connection gracefully as if
  327:  * ppp_l2tp_terminate() had been called.
  328:  *
  329:  * Arguments:
  330:  *	sess	Session structure
  331:  *	avps	List of AVP's to include in the associated
  332:  *		Outgoing-Call-Connected or Incoming-Call-Connected
  333:  *		control message.
  334:  *
  335:  * Returns:
  336:  *	 0	Connection successful
  337:  *	-1	Connection failed, errno is set
  338:  */
  339: extern int	ppp_l2tp_connected(struct ppp_l2tp_sess *sess,
  340: 			const struct ppp_l2tp_avp_list *avps);
  341: 
  342: /*
  343:  * This function terminates a session. The session may be in any state.
  344:  * The control code will *not* make any futher calls to link callbacks
  345:  * regarding this session, so the link should clean up any associated
  346:  * state.
  347:  *
  348:  * Arguments:
  349:  *	sess	Session structure
  350:  *	result	Result code (must not be zero)
  351:  *	error	Error code (if result == L2TP_RESULT_GENERAL, else zero)
  352:  *	errmsg	Error message string (optional; may be NULL)
  353:  */
  354: extern void	ppp_l2tp_terminate(struct ppp_l2tp_sess *sess,
  355: 			u_int16_t result, u_int16_t error, const char *errmsg);
  356: 
  357: /*
  358:  * This function is used to send the remote side a Set-Link-Info
  359:  * message.
  360:  *
  361:  * Arguments:
  362:  *	sess	Session structure
  363:  *	xmit	LAC's send ACCM
  364:  *	recv	LAC's receive ACCM
  365:  */
  366: extern int	ppp_l2tp_set_link_info(struct ppp_l2tp_sess *sess,
  367: 			u_int32_t xmit, u_int32_t recv);
  368: 
  369: /*
  370:  * Get or set the link side cookie corresponding to a control connection
  371:  * or a call session.
  372:  */
  373: extern void	*ppp_l2tp_ctrl_get_cookie(struct ppp_l2tp_ctrl *ctrl);
  374: extern void	ppp_l2tp_ctrl_set_cookie(struct ppp_l2tp_ctrl *ctrl,
  375: 			void *cookie);
  376: extern void	*ppp_l2tp_sess_get_cookie(struct ppp_l2tp_sess *sess);
  377: extern void	ppp_l2tp_sess_set_cookie(struct ppp_l2tp_sess *sess,
  378: 			void *cookie);
  379: 
  380: /*
  381:  * Get session's Call Serial Number.
  382:  */
  383: extern uint32_t	ppp_l2tp_sess_get_serial(struct ppp_l2tp_sess *sess);
  384: 
  385: /*
  386:  * Get the node ID and hook name for the hook that corresponds
  387:  * to a control connection's L2TP frames.
  388:  */
  389: extern void	ppp_l2tp_ctrl_get_hook(struct ppp_l2tp_ctrl *ctrl,
  390: 			ng_ID_t *nodep, const char **hookp);
  391: 
  392: /*
  393:  * Get local/remote hostnames.
  394:  */
  395: extern int	ppp_l2tp_ctrl_get_self_name(struct ppp_l2tp_ctrl *ctrl,
  396: 			void *buf, size_t buf_len);
  397: extern int	ppp_l2tp_ctrl_get_peer_name(struct ppp_l2tp_ctrl *ctrl,
  398: 			void *buf, size_t buf_len);
  399: extern char*	ppp_l2tp_ctrl_get_peer_name_p(struct ppp_l2tp_ctrl *ctrl);
  400: /*
  401:  * Get the node ID and hook name for the hook that corresponds
  402:  * to a session's data packets.
  403:  */
  404: extern void	ppp_l2tp_sess_get_hook(struct ppp_l2tp_sess *sess,
  405: 			ng_ID_t *nodep, const char **hookp);
  406: 
  407: /*
  408:  * Informs that hook has been connected and temporal tee can be shutted down.
  409:  */
  410: extern void	ppp_l2tp_sess_hooked(struct ppp_l2tp_sess *sess);
  411: 
  412: __END_DECLS
  413: 
  414: #endif /* _PPP_L2TP_PDEL_PPP_PPP_L2TP_CTRL_H_ */

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