Annotation of embedaddon/mpd/src/l2tp_ctrl.h, revision 1.1
1.1 ! misho 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:
! 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>