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>