root/usr/src/uts/common/io/ppp/sppptun/sppptun_impl.h
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */

/*
 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

/*
 * sppptun_impl.h - Internal sppptun data exposed for adb/mdb macros.
 */

#ifndef _SPPPTUN_IMPL_H
#define _SPPPTUN_IMPL_H

#ifdef  __cplusplus
extern "C" {
#endif

/* For use with insque/remque (belongs in a system header!) */
struct qelem {
        struct qelem *q_forw;
        struct qelem *q_back;
};

typedef struct tunll_s tunll_t;
typedef struct tuncl_s tuncl_t;

typedef struct {
        kstat_named_t   lks_octrls;             /* sent control messages */
        kstat_named_t   lks_octrl_drop;         /* dropped control messages */
        kstat_named_t   lks_clients;            /* number of clients (tcls) */
        kstat_named_t   lks_walks;              /* PPPoE tcl walks */
        kstat_named_t   lks_in_nomatch;         /* input without match */
        kstat_named_t   lks_indata;             /* input data packets */
        kstat_named_t   lks_indata_drops;       /* input data packet drops */
        kstat_named_t   lks_inctrls;            /* input control packets */
        kstat_named_t   lks_inctrl_drops;       /* input control pkt drops */
} tll_kstats_t;

#define TLL_KSTATS_NAMES \
        "octrls", "octrl_drop", "clients", "walks", "in_nomatch", \
        "indata", "indata_drops", "inctrls", "inctrl_drops"

typedef struct {
        kstat_named_t   cks_octrls;             /* sent control messages */
        kstat_named_t   cks_octrl_drop;         /* dropped control messages */
        kstat_named_t   cks_octrl_spec;         /* special control messages */
        kstat_named_t   cks_walks;              /* PPPoE tcl walks */
        kstat_named_t   cks_inctrls;            /* input control messages */
        kstat_named_t   cks_inctrl_drops;       /* input control pkt drops */
} tcl_kstats_t;

#define TCL_KSTATS_NAMES \
        "octrls", "octrl_drop", "octrl_spec", "walks", "inctrls", \
        "inctrl_drops"

/*
 * Tunnel lower layer structure; module open; connects to output device.
 *
 * Note: tll_flags member carefully aligned to match with tcl_flags in
 * following structure so that we don't have to continually look at
 * q_next to determine context.  Do not move these around.
 *
 * Note: this is also defined in uts/adb/common/tunll.dbg; if you change
 * this structure, don't forget to change the adb/mdb macro.
 */
struct tunll_s {
        uint32_t tll_flags;             /* See TLLF_* below */
        void *tll_next, *tll_prev;

        int tll_error;
        queue_t *tll_wq;                /* Output data sent here */
        tuncl_t *tll_defcl;             /* Default client (daemon) */
        ppptun_atype tll_lcladdr;       /* Local address */

        tuncl_t *tll_lastcl;            /* Silly PPPoE optimization */

        ppptun_lname tll_name;
        int tll_index;
        int tll_muxid;
        int tll_style;                  /* Interface type; PTS_* */
        int tll_alen;                   /* Address length */

        int tll_msg_pending;
        mblk_t *tll_msg_deferred;

        mblk_t *tll_onclose;

        tll_kstats_t tll_kstats;        /* current statistics */
        kstat_t *tll_ksp;               /* pointer to kstats allocation */

        uint_t tll_sap;                 /* SAP for PPPoE */

        zoneid_t tll_zoneid;
};

/*
 * Tunnel client structure; used for each device open.
 *
 * There is one of these for each PPP session plus (perhaps) one for
 * each tunneling protocol server daemon.
 *
 * Note: this is also defined in uts/adb/common/tuncl.dbg; if you change
 * this structure, don't forget to change the adb/mdb macro.
 */
struct tuncl_s {
        uint32_t tcl_flags;             /* TCLF_ flags below */

        tunll_t *tcl_data_tll;          /* Pointer to data interface */
        tunll_t *tcl_ctrl_tll;          /* Pointer to control */

        queue_t *tcl_rq;                /* Received data sent here. */

        uint32_t tcl_seq;

        uint32_t tcl_ctlval;            /* Control distinguisher */

        uint_t  tcl_style;              /* Saved style */
        uint_t  tcl_ltunid;             /* Local Tunnel ID (L2F/L2TP) */
        uint_t  tcl_rtunid;             /* Remote Tunnel ID (L2F/L2TP) */
        uint_t  tcl_lsessid;            /* Local Session ID (minor node) */
        uint_t  tcl_rsessid;            /* Remote Session ID */
        ppptun_atype    tcl_address;

        int     tcl_unit;               /* PPP unit number (for debug) */
        struct pppstat64 tcl_stats;     /* Standard PPP statistics */
        tcl_kstats_t tcl_kstats;        /* current statistics */
        kstat_t *tcl_ksp;               /* pointer to kstats allocation */

        zoneid_t tcl_zoneid;
};

#define TO_TLL(p) \
        ((tunll_t *)((uintptr_t)(p) - offsetof(tunll_t, tll_next)))

#define TLLF_NOTLOWER           0x00000001      /* never set */
#define TLLF_CLOSING            0x00000002      /* driver detach initiated */
#define TLLF_CLOSE_DONE         0x00000004      /* detach sent; waiting */
#define TLLF_SHUTDOWN_DONE      0x00000008      /* detach done */

#define TCLF_ISCLIENT           0x00000001      /* always set */
#define TCLF_FASTPATH           0x00000004      /* enable fast path recv */
#define TCLF_DAEMON             0x00000010      /* server side; session 0 */
#define TCLF_SPEER_DONE         0x00000020      /* SPEER ioctl done */

#ifdef  __cplusplus
}
#endif

#endif /* _SPPPTUN_IMPL_H */