Annotation of embedaddon/libpdel/ppp/ppp_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 is terminated for any reason
! 74: * other than a call ppp_l2tp_ctrl_destroy().
! 75: *
! 76: * Arguments:
! 77: * ctrl Control connection
! 78: * result Result code (never zero)
! 79: * error Error code (if result == L2TP_RESULT_GENERAL, else zero)
! 80: * errmsg Error message string
! 81: */
! 82: typedef void ppp_l2tp_ctrl_terminated_t(struct ppp_l2tp_ctrl *ctrl,
! 83: u_int16_t result, u_int16_t error, const char *errmsg);
! 84:
! 85: /*
! 86: * This callback is used to report the peer's initiating a new incoming
! 87: * or outgoing call.
! 88: *
! 89: * In the case of an incoming call, when/if the call eventually connects,
! 90: * the ppp_l2tp_connected_t callback will be called by the control side.
! 91: *
! 92: * In the case of an outgoing call, the link side is responsible for calling
! 93: * ppp_l2tp_connected() when/if the call is connected.
! 94: *
! 95: * This callback may choose to call ppp_l2tp_terminate() (to deny the call)
! 96: * or ppp_l2tp_connected() (to accept it immediately if outgoing) before
! 97: * returning.
! 98: *
! 99: * The link side is expected to plumb the netgraph session hook at this time.
! 100: *
! 101: * Arguments:
! 102: * ctrl Associated control connection
! 103: * sess Session structure
! 104: * out Non-zero to indicate outgoing call
! 105: * avps AVP's contained in the associated Outgoing-Call-Request
! 106: * or Incoming-Call-Request control message.
! 107: */
! 108: typedef void ppp_l2tp_initiated_t(struct ppp_l2tp_ctrl *ctrl,
! 109: struct ppp_l2tp_sess *sess, int out,
! 110: const struct ppp_l2tp_avp_list *avps);
! 111:
! 112: /*
! 113: * This callback is used to report successful connection of a remotely
! 114: * initiated incoming call (see ppp_l2tp_initiated_t) or a locally initiated
! 115: * outgoing call (see ppp_l2tp_initiate()). That is, we are acting as
! 116: * the LNS for this session.
! 117: *
! 118: * Arguments:
! 119: * sess Session structure
! 120: * avps AVP's contained in the associated Outgoing-Call-Connected
! 121: * or Incoming-Call-Connected control message.
! 122: */
! 123: typedef void ppp_l2tp_connected_t(struct ppp_l2tp_sess *sess,
! 124: const struct ppp_l2tp_avp_list *avps);
! 125:
! 126: /*
! 127: * This callback is called when any call, whether successfully connected
! 128: * or not, is terminated for any reason other than explict termination
! 129: * from the link side (via a call to either ppp_l2tp_terminate() or
! 130: * ppp_l2tp_ctrl_destroy()).
! 131: *
! 132: * Arguments:
! 133: * sess Session structure
! 134: * result Result code (never zero)
! 135: * error Error code (if result == L2TP_RESULT_GENERAL, else zero)
! 136: * errmsg Error message string
! 137: */
! 138: typedef void ppp_l2tp_terminated_t(struct ppp_l2tp_sess *sess,
! 139: u_int16_t result, u_int16_t error, const char *errmsg);
! 140:
! 141: /*
! 142: * This callback is used when the remote side sends a Set-Link-Info
! 143: * message. It is optional and may be NULL if not required.
! 144: *
! 145: * Arguments:
! 146: * sess Session structure
! 147: * xmit LAC's send ACCM
! 148: * recv LAC's receive ACCM
! 149: */
! 150: typedef void ppp_l2tp_set_link_info_t(struct ppp_l2tp_sess *sess,
! 151: u_int32_t xmit, u_int32_t recv);
! 152:
! 153: /*
! 154: * This callback is used when the remote side sends a WAN-Error-Notify
! 155: * message. It is optional and may be NULL if not required.
! 156: *
! 157: * Arguments:
! 158: * sess Session structure
! 159: * crc CRC errors
! 160: * frame Framing errors
! 161: * overrun Hardware overrun errors
! 162: * buffer Buffer overrun errors
! 163: * timeout Timeout errors
! 164: * align Alignment errors
! 165: */
! 166: typedef void ppp_l2tp_wan_error_notify_t(struct ppp_l2tp_sess *sess,
! 167: u_int32_t crc, u_int32_t frame, u_int32_t overrun,
! 168: u_int32_t buffer, u_int32_t timeout, u_int32_t align);
! 169:
! 170: /* Callback structure provided by the link side */
! 171: struct ppp_l2tp_ctrl_cb {
! 172: ppp_l2tp_ctrl_terminated_t *ctrl_terminated;
! 173: ppp_l2tp_initiated_t *initiated;
! 174: ppp_l2tp_connected_t *connected;
! 175: ppp_l2tp_terminated_t *terminated;
! 176: ppp_l2tp_set_link_info_t *set_link_info;
! 177: ppp_l2tp_wan_error_notify_t *wan_error_notify;
! 178: };
! 179:
! 180: /************************************************************************
! 181: LINK -> CONTROL FUNCTIONS
! 182: ************************************************************************/
! 183:
! 184: __BEGIN_DECLS
! 185:
! 186: /*
! 187: * This function creates a new control connection. If successful, the
! 188: * control code will create a ng_l2tp(4) node and fill in *nodep and
! 189: * the 'hook' buffer. The link code must then connect this hook to the
! 190: * appropriate L2TP packet delivery node before the next context switch.
! 191: *
! 192: * The control code guarantees exactly one call in the future to the
! 193: * ppp_l2tp_ctrl_terminated_t callback unless ppp_l2tp_ctrl_destroy()
! 194: * is called first.
! 195: *
! 196: * Arguments:
! 197: * ctx Event context for use by control code
! 198: * mutex Mutex for operation
! 199: * cb Pointer to link callback functions
! 200: * log Where to log stuff (if successful, the log is consumed)
! 201: * peer_id Unique identifier for peer (used for tie-breakers)
! 202: * initiate Whether to send a SCCRQ or just wait for one
! 203: * nodep Pointer to netgraph node ID variable
! 204: * hook Buffer for hook on L2TP netgraph node (size >= NG_HOOKSIZ)
! 205: * avps List of AVP's to include in the associated
! 206: * Start-Control-Connection-Request or
! 207: * Start-Control-Connection-Reply control message.
! 208: * secret Shared secret (or NULL if none required)
! 209: * seclen Length of shared secret (if secret != NULL)
! 210: *
! 211: * Returns NULL if failure (errno is set), otherwise a pointer to an
! 212: * opaque control connection object.
! 213: */
! 214: extern struct ppp_l2tp_ctrl *ppp_l2tp_ctrl_create(struct pevent_ctx *ctx,
! 215: pthread_mutex_t *mutex,
! 216: const struct ppp_l2tp_ctrl_cb *cb, struct ppp_log *log,
! 217: int initiate, u_int32_t peer_id, ng_ID_t *nodep,
! 218: char *hook, const struct ppp_l2tp_avp_list *avps,
! 219: const void *secret, size_t seclen);
! 220:
! 221: /*
! 222: * Close a control connection gracefully.
! 223: *
! 224: * All active sessions will be terminated, and eventually
! 225: * ppp_l2tp_ctrl_terminated_t will be called, assuming no
! 226: * intervening call to ppp_l2tp_ctrl_destroy() has been made.
! 227: *
! 228: * Arguments:
! 229: * ctrl Control connection structure
! 230: * result Result code (never zero)
! 231: * error Error code (if result == L2TP_RESULT_GENERAL, else zero)
! 232: * errmsg Error message string
! 233: */
! 234: extern void ppp_l2tp_ctrl_shutdown(struct ppp_l2tp_ctrl *ctrl,
! 235: u_int16_t result, u_int16_t error, const char *errmsg);
! 236:
! 237: /*
! 238: * Immediately destroy a control connection and all associated sessions.
! 239: * This does *not* result in any callbacks to the link side for either
! 240: * active sessions (ppp_l2tp_terminated_t) or the control connection
! 241: * itself (ppp_l2tp_ctrl_terminated_t).
! 242: *
! 243: * Upon return, *ctrlp will be set to NULL.
! 244: *
! 245: * Arguments:
! 246: * ctrlp Pointer to the control connection descriptor pointer
! 247: */
! 248: extern void ppp_l2tp_ctrl_destroy(struct ppp_l2tp_ctrl **ctrlp);
! 249:
! 250: /*
! 251: * This function initiates a new session, either an as an incoming or
! 252: * outgoing call request to the peer.
! 253: *
! 254: * In the case of an incoming call, when/if the call eventually connects,
! 255: * ppp_l2tp_connected() must be called.
! 256: *
! 257: * In the case of an outgoing call, when/if the call eventually connects,
! 258: * the link's ppp_l2tp_connected_t callback will be invoked.
! 259: *
! 260: * The link side is expected to plumb the netgraph session hook at this time.
! 261: *
! 262: * Arguments:
! 263: * ctrl Control connection
! 264: * out Non-zero to indicate outgoing call
! 265: * avps List of AVP's to include in the associated
! 266: * Outgoing-Call-Request or Incoming-Call-Request
! 267: * control message.
! 268: *
! 269: * Returns:
! 270: * NULL Initiation failed, errno is set
! 271: * sess Session structure
! 272: */
! 273: extern struct ppp_l2tp_sess *ppp_l2tp_initiate(struct ppp_l2tp_ctrl *ctrl,
! 274: int out, const struct ppp_l2tp_avp_list *avps);
! 275:
! 276: /*
! 277: * This function is used to report successful connection of a remotely
! 278: * initiated outgoing call (see ppp_l2tp_initiated_t) or a locally initiated
! 279: * incoming call (see ppp_l2tp_initiate()). That is, we are acting as
! 280: * the LAC for this session.
! 281: *
! 282: * Note: if this function returns -1, no special action is required;
! 283: * the control side will close the connection gracefully as if
! 284: * ppp_l2tp_terminate() had been called.
! 285: *
! 286: * Arguments:
! 287: * sess Session structure
! 288: * avps List of AVP's to include in the associated
! 289: * Outgoing-Call-Connected or Incoming-Call-Connected
! 290: * control message.
! 291: *
! 292: * Returns:
! 293: * 0 Connection successful
! 294: * -1 Connection failed, errno is set
! 295: */
! 296: extern int ppp_l2tp_connected(struct ppp_l2tp_sess *sess,
! 297: const struct ppp_l2tp_avp_list *avps);
! 298:
! 299: /*
! 300: * This function terminates a session. The session may be in any state.
! 301: * The control code will *not* make any futher calls to link callbacks
! 302: * regarding this session, so the link should clean up any associated
! 303: * state.
! 304: *
! 305: * Arguments:
! 306: * sess Session structure
! 307: * result Result code (must not be zero)
! 308: * error Error code (if result == L2TP_RESULT_GENERAL, else zero)
! 309: * errmsg Error message string (optional; may be NULL)
! 310: */
! 311: extern void ppp_l2tp_terminate(struct ppp_l2tp_sess *sess,
! 312: u_int16_t result, u_int16_t error, const char *errmsg);
! 313:
! 314: /*
! 315: * Get or set the link side cookie corresponding to a control connection
! 316: * or a call session.
! 317: */
! 318: extern void *ppp_l2tp_ctrl_get_cookie(struct ppp_l2tp_ctrl *ctrl);
! 319: extern void ppp_l2tp_ctrl_set_cookie(struct ppp_l2tp_ctrl *ctrl,
! 320: void *cookie);
! 321: extern void *ppp_l2tp_sess_get_cookie(struct ppp_l2tp_sess *sess);
! 322: extern void ppp_l2tp_sess_set_cookie(struct ppp_l2tp_sess *sess,
! 323: void *cookie);
! 324:
! 325: /*
! 326: * Get the node ID and hook name for the hook that corresponds
! 327: * to a control connection's L2TP frames.
! 328: */
! 329: extern void ppp_l2tp_ctrl_get_hook(struct ppp_l2tp_ctrl *ctrl,
! 330: ng_ID_t *nodep, const char **hookp);
! 331:
! 332: /*
! 333: * Get the node ID and hook name for the hook that corresponds
! 334: * to a session's data packets.
! 335: */
! 336: extern void ppp_l2tp_sess_get_hook(struct ppp_l2tp_sess *sess,
! 337: ng_ID_t *nodep, const char **hookp);
! 338:
! 339: __END_DECLS
! 340:
! 341: #endif /* _PPP_L2TP_PDEL_PPP_PPP_L2TP_CTRL_H_ */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>