Annotation of embedaddon/libpdel/ppp/ppp_l2tp_ctrl.h, revision 1.1.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>