root/drivers/net/fddi/skfp/h/smt.h
/* SPDX-License-Identifier: GPL-2.0-or-later */
/******************************************************************************
 *
 *      (C)Copyright 1998,1999 SysKonnect,
 *      a business unit of Schneider & Koch & Co. Datensysteme GmbH.
 *
 *      The information in this file is provided "AS IS" without warranty.
 *
 ******************************************************************************/

/*
 *      SMT 7.2 frame definitions
 */

#ifndef _SMT_
#define _SMT_

/* #define SMT5_10 */
#define SMT6_10
#define SMT7_20

#define OPT_PMF         /* if parameter management is supported */
#define OPT_SRF         /* if status report is supported */

/*
 * SMT frame version 5.1
 */

#define SMT_VID 0x0001                  /* V 5.1 .. 6.1 */
#define SMT_VID_2 0x0002                /* V 7.2 */

struct smt_sid {
        u_char  sid_oem[2] ;                    /* implementation spec. */
        struct fddi_addr sid_node ;             /* node address */
} ;

typedef u_char  t_station_id[8] ;

/*
 * note on alignment :
 * sizeof(struct smt_header) = 32
 * all parameters are long aligned
 * if struct smt_header starts at offset 0, all longs are aligned correctly
 * (FC starts at offset 3)
 */
_packed struct smt_header {
        struct fddi_addr        smt_dest ;      /* destination address */
        struct fddi_addr        smt_source ;    /* source address */
        u_char                  smt_class ;     /* NIF, SIF ... */
        u_char                  smt_type ;      /* req., response .. */
        u_short                 smt_version ;   /* version id */
        u_int                   smt_tid ;       /* transaction ID */
        struct smt_sid          smt_sid ;       /* station ID */
        u_short                 smt_pad ;       /* pad with 0 */
        u_short                 smt_len ;       /* length of info field */
} ;
#define SWAP_SMTHEADER  "662sl8ss"

#if     0
/*
 * MAC FC values
 */
#define FC_SMT_INFO     0x41            /* SMT info */
#define FC_SMT_NSA      0x4f            /* SMT Next Station Addressing */
#endif


/*
 * type codes
 */
#define SMT_ANNOUNCE    0x01            /* announcement */
#define SMT_REQUEST     0x02            /* request */
#define SMT_REPLY       0x03            /* reply */

/*
 * class codes
 */
#define SMT_NIF         0x01            /* neighbor information frames */
#define SMT_SIF_CONFIG  0x02            /* station information configuration */
#define SMT_SIF_OPER    0x03            /* station information operation */
#define SMT_ECF         0x04            /* echo frames */
#define SMT_RAF         0x05            /* resource allocation */
#define SMT_RDF         0x06            /* request denied */
#define SMT_SRF         0x07            /* status report */
#define SMT_PMF_GET     0x08            /* parameter management get */
#define SMT_PMF_SET     0x09            /* parameter management set */
#define SMT_ESF         0xff            /* extended service */

#define SMT_MAX_ECHO_LEN        4458    /* max length of SMT Echo */
#if     defined(CONC) || defined(CONC_II)
#define SMT_TEST_ECHO_LEN       50      /* test length of SMT Echo */
#else
#define SMT_TEST_ECHO_LEN       SMT_MAX_ECHO_LEN        /* test length */
#endif

#define SMT_MAX_INFO_LEN        (4352-20)       /* max length for SMT info */


/*
 * parameter types
 */

struct smt_para {
        u_short p_type ;                /* type */
        u_short p_len ;                 /* length of parameter */
} ;

#define PARA_LEN        (sizeof(struct smt_para))

#define SMTSETPARA(p,t)         (p)->para.p_type = (t),\
                                (p)->para.p_len = sizeof(*(p)) - PARA_LEN

/*
 * P01 : Upstream Neighbor Address, UNA
 */
#define SMT_P_UNA       0x0001          /* upstream neighbor address */
#define SWAP_SMT_P_UNA  "s6"

struct smt_p_una {
        struct smt_para para ;          /* generic parameter header */
        u_short una_pad ;
        struct fddi_addr una_node ;     /* node address, zero if unknown */
} ;

/*
 * P02 : Station Descriptor
 */
#define SMT_P_SDE       0x0002          /* station descriptor */
#define SWAP_SMT_P_SDE  "1111"

#define SMT_SDE_STATION         0       /* end node */
#define SMT_SDE_CONCENTRATOR    1       /* concentrator */

struct smt_p_sde {
        struct smt_para para ;          /* generic parameter header */
        u_char  sde_type ;              /* station type */
        u_char  sde_mac_count ;         /* number of MACs */
        u_char  sde_non_master ;        /* number of A,B or S ports */
        u_char  sde_master ;            /* number of S ports on conc. */
} ;

/*
 * P03 : Station State
 */
#define SMT_P_STATE     0x0003          /* station state */
#define SWAP_SMT_P_STATE        "scc"

struct smt_p_state {
        struct smt_para para ;          /* generic parameter header */
        u_short st_pad ;
        u_char  st_topology ;           /* topology */
        u_char  st_dupl_addr ;          /* duplicate address detected */
} ;
#define SMT_ST_WRAPPED          (1<<0)  /* station wrapped */
#define SMT_ST_UNATTACHED       (1<<1)  /* unattached concentrator */
#define SMT_ST_TWISTED_A        (1<<2)  /* A-A connection, twisted ring */
#define SMT_ST_TWISTED_B        (1<<3)  /* B-B connection, twisted ring */
#define SMT_ST_ROOTED_S         (1<<4)  /* rooted station */
#define SMT_ST_SRF              (1<<5)  /* SRF protocol supported */
#define SMT_ST_SYNC_SERVICE     (1<<6)  /* use synchronous bandwidth */

#define SMT_ST_MY_DUPA          (1<<0)  /* my station detected dupl. */
#define SMT_ST_UNA_DUPA         (1<<1)  /* my UNA detected duplicate */

/*
 * P04 : timestamp
 */
#define SMT_P_TIMESTAMP 0x0004          /* time stamp */
#define SWAP_SMT_P_TIMESTAMP    "8"
struct smt_p_timestamp {
        struct smt_para para ;          /* generic parameter header */
        u_char  ts_time[8] ;            /* time, resolution 80nS, unique */
} ;

/*
 * P05 : station policies
 */
#define SMT_P_POLICY    0x0005          /* station policies */
#define SWAP_SMT_P_POLICY       "ss"

struct smt_p_policy {
        struct smt_para para ;          /* generic parameter header */
        u_short pl_config ;
        u_short pl_connect ;            /* bit string POLICY_AA ... */
} ;
#define SMT_PL_HOLD             1       /* hold policy supported (Dual MAC) */

/*
 * P06 : latency equivalent
 */
#define SMT_P_LATENCY   0x0006          /* latency */
#define SWAP_SMT_P_LATENCY      "ssss"

/*
 * note: latency has two phy entries by definition
 * for a SAS, the 2nd one is null
 */
struct smt_p_latency {
        struct smt_para para ;          /* generic parameter header */
        u_short lt_phyout_idx1 ;        /* index */
        u_short lt_latency1 ;           /* latency , unit : byte clock */
        u_short lt_phyout_idx2 ;        /* 0 if SAS */
        u_short lt_latency2 ;           /* 0 if SAS */
} ;

/*
 * P07 : MAC neighbors
 */
#define SMT_P_NEIGHBORS 0x0007          /* MAC neighbor description */
#define SWAP_SMT_P_NEIGHBORS    "ss66"

struct smt_p_neighbor {
        struct smt_para para ;          /* generic parameter header */
        u_short nb_mib_index ;          /* MIB index */
        u_short nb_mac_index ;          /* n+1 .. n+m, m = #MACs, n = #PHYs */
        struct fddi_addr nb_una ;       /* UNA , 0 for unknown */
        struct fddi_addr nb_dna ;       /* DNA , 0 for unknown */
} ;

/*
 * PHY record
 */
#define SMT_PHY_A       0               /* A port */
#define SMT_PHY_B       1               /* B port */
#define SMT_PHY_S       2               /* slave port */
#define SMT_PHY_M       3               /* master port */

#define SMT_CS_DISABLED 0               /* connect state : disabled */
#define SMT_CS_CONNECTING       1       /* connect state : connecting */
#define SMT_CS_STANDBY  2               /* connect state : stand by */
#define SMT_CS_ACTIVE   3               /* connect state : active */

#define SMT_RM_NONE     0
#define SMT_RM_MAC      1

struct smt_phy_rec {
        u_short phy_mib_index ;         /* MIB index */
        u_char  phy_type ;              /* A/B/S/M */
        u_char  phy_connect_state ;     /* disabled/connecting/active */
        u_char  phy_remote_type ;       /* A/B/S/M */
        u_char  phy_remote_mac ;        /* none/remote */
        u_short phy_resource_idx ;      /* 1 .. n */
} ;

/*
 * MAC record
 */
struct smt_mac_rec {
        struct fddi_addr mac_addr ;             /* MAC address */
        u_short         mac_resource_idx ;      /* n+1 .. n+m */
} ;

/*
 * P08 : path descriptors
 * should be really an array ; however our environment has a fixed number of
 * PHYs and MACs
 */
#define SMT_P_PATH      0x0008                  /* path descriptor */
#define SWAP_SMT_P_PATH "[6s]"

struct smt_p_path {
        struct smt_para para ;          /* generic parameter header */
        struct smt_phy_rec      pd_phy[2] ;     /* PHY A */
        struct smt_mac_rec      pd_mac ;        /* MAC record */
} ;

/*
 * P09 : MAC status
 */
#define SMT_P_MAC_STATUS        0x0009          /* MAC status */
#define SWAP_SMT_P_MAC_STATUS   "sslllllllll"

struct smt_p_mac_status {
        struct smt_para para ;          /* generic parameter header */
        u_short st_mib_index ;          /* MIB index */
        u_short st_mac_index ;          /* n+1 .. n+m */
        u_int   st_t_req ;              /* T_Req */
        u_int   st_t_neg ;              /* T_Neg */
        u_int   st_t_max ;              /* T_Max */
        u_int   st_tvx_value ;          /* TVX_Value */
        u_int   st_t_min ;              /* T_Min */
        u_int   st_sba ;                /* synchr. bandwidth alloc */
        u_int   st_frame_ct ;           /* frame counter */
        u_int   st_error_ct ;           /* error counter */
        u_int   st_lost_ct ;            /* lost frames counter */
} ;

/*
 * P0A : PHY link error rate monitoring
 */
#define SMT_P_LEM       0x000a          /* link error monitor */
#define SWAP_SMT_P_LEM  "ssccccll"
/*
 * units of lem_cutoff,lem_alarm,lem_estimate : 10**-x
 */
struct smt_p_lem {
        struct smt_para para ;          /* generic parameter header */
        u_short lem_mib_index ;         /* MIB index */
        u_short lem_phy_index ;         /* 1 .. n */
        u_char  lem_pad2 ;              /* be nice and make it even . */
        u_char  lem_cutoff ;            /* 0x4 .. 0xf, default 0x7 */
        u_char  lem_alarm ;             /* 0x4 .. 0xf, default 0x8 */
        u_char  lem_estimate ;          /* 0x0 .. 0xff */
        u_int   lem_reject_ct ;         /* 0x00000000 .. 0xffffffff */
        u_int   lem_ct ;                /* 0x00000000 .. 0xffffffff */
} ;

/*
 * P0B : MAC frame counters
 */
#define SMT_P_MAC_COUNTER 0x000b        /* MAC frame counters */
#define SWAP_SMT_P_MAC_COUNTER  "ssll"

struct smt_p_mac_counter {
        struct smt_para para ;          /* generic parameter header */
        u_short mc_mib_index ;          /* MIB index */
        u_short mc_index ;              /* mac index */
        u_int   mc_receive_ct ;         /* receive counter */
        u_int   mc_transmit_ct ;        /* transmit counter */
} ;

/*
 * P0C : MAC frame not copied counter
 */
#define SMT_P_MAC_FNC   0x000c          /* MAC frame not copied counter */
#define SWAP_SMT_P_MAC_FNC      "ssl"

struct smt_p_mac_fnc {
        struct smt_para para ;          /* generic parameter header */
        u_short nc_mib_index ;          /* MIB index */
        u_short nc_index ;              /* mac index */
        u_int   nc_counter ;            /* not copied counter */
} ;


/*
 * P0D : MAC priority values
 */
#define SMT_P_PRIORITY  0x000d          /* MAC priority values */
#define SWAP_SMT_P_PRIORITY     "ssl"

struct smt_p_priority {
        struct smt_para para ;          /* generic parameter header */
        u_short pr_mib_index ;          /* MIB index */
        u_short pr_index ;              /* mac index */
        u_int   pr_priority[7] ;        /* priority values */
} ;

/*
 * P0E : PHY elasticity buffer status
 */
#define SMT_P_EB        0x000e          /* PHY EB status */
#define SWAP_SMT_P_EB   "ssl"

struct smt_p_eb {
        struct smt_para para ;          /* generic parameter header */
        u_short eb_mib_index ;          /* MIB index */
        u_short eb_index ;              /* phy index */
        u_int   eb_error_ct ;           /* # of eb overflows */
} ;

/*
 * P0F : manufacturer field
 */
#define SMT_P_MANUFACTURER      0x000f  /* manufacturer field */
#define SWAP_SMT_P_MANUFACTURER ""

struct smp_p_manufacturer {
        struct smt_para para ;          /* generic parameter header */
        u_char mf_data[32] ;            /* OUI + arbitrary data */
} ;

/*
 * P10 : user field
 */
#define SMT_P_USER              0x0010  /* manufacturer field */
#define SWAP_SMT_P_USER ""

struct smp_p_user {
        struct smt_para para ;          /* generic parameter header */
        u_char us_data[32] ;            /* arbitrary data */
} ;



/*
 * P11 : echo data
 */
#define SMT_P_ECHODATA  0x0011          /* echo data */
#define SWAP_SMT_P_ECHODATA     ""

struct smt_p_echo {
        struct smt_para para ;          /* generic parameter header */
        u_char  ec_data[SMT_MAX_ECHO_LEN-4] ;   /* echo data */
} ;

/*
 * P12 : reason code
 */
#define SMT_P_REASON    0x0012          /* reason code */
#define SWAP_SMT_P_REASON       "l"

struct smt_p_reason {
        struct smt_para para ;          /* generic parameter header */
        u_int   rdf_reason ;            /* CLASS/VERSION */
} ;
#define SMT_RDF_CLASS   0x00000001      /* class not supported */
#define SMT_RDF_VERSION 0x00000002      /* version not supported */
#define SMT_RDF_SUCCESS 0x00000003      /* success (PMF) */
#define SMT_RDF_BADSET  0x00000004      /* bad set count (PMF) */
#define SMT_RDF_ILLEGAL 0x00000005      /* read only (PMF) */
#define SMT_RDF_NOPARAM 0x6             /* parameter not supported (PMF) */
#define SMT_RDF_RANGE   0x8             /* out of range */
#define SMT_RDF_AUTHOR  0x9             /* not authorized */
#define SMT_RDF_LENGTH  0x0a            /* length error */
#define SMT_RDF_TOOLONG 0x0b            /* length error */
#define SMT_RDF_SBA     0x0d            /* SBA denied */

/*
 * P13 : refused frame beginning
 */
#define SMT_P_REFUSED   0x0013          /* refused frame beginning */
#define SWAP_SMT_P_REFUSED      "l"

struct smt_p_refused {
        struct smt_para para ;          /* generic parameter header */
        u_int   ref_fc ;                /* 3 bytes 0 + FC */
        struct smt_header       ref_header ;    /* refused header */
} ;

/*
 * P14 : supported SMT versions
 */
#define SMT_P_VERSION   0x0014          /* SMT supported versions */
#define SWAP_SMT_P_VERSION      "sccss"

struct smt_p_version {
        struct smt_para para ;          /* generic parameter header */
        u_short v_pad ;
        u_char  v_n ;                   /* 1 .. 0xff, #versions */
        u_char  v_index ;               /* 1 .. 0xff, index of op. v. */
        u_short v_version[1] ;          /* list of min. 1 version */
        u_short v_pad2 ;                /* pad if necessary */
} ;

/*
 * P15 : Resource Type
 */
#define SWAP_SMT_P0015          "l"

struct smt_p_0015 {
        struct smt_para para ;          /* generic parameter header */
        u_int           res_type ;      /* resource type */
} ;

#define SYNC_BW         0x00000001L     /* Synchronous Bandwidth */

/*
 * P16 : SBA Command
 */
#define SWAP_SMT_P0016          "l"

struct smt_p_0016 {
        struct smt_para para ;          /* generic parameter header */
        u_int           sba_cmd ;       /* command for the SBA */
} ;

#define REQUEST_ALLOCATION      0x1     /* req allocation of sync bandwidth */
#define REPORT_ALLOCATION       0x2     /* rep of sync bandwidth allocation */
#define CHANGE_ALLOCATION       0x3     /* forces a station using sync band-*/
                                        /* width to change its current allo-*/
                                        /* cation */

/*
 * P17 : SBA Payload Request
 */
#define SWAP_SMT_P0017          "l"

struct smt_p_0017 {
        struct smt_para para ;          /* generic parameter header */
        int             sba_pl_req ;    /* total sync bandwidth measured in */
} ;                                     /* bytes per 125 us */

/*
 * P18 : SBA Overhead Request
 */
#define SWAP_SMT_P0018          "l"

struct smt_p_0018 {
        struct smt_para para ;          /* generic parameter header */
        int             sba_ov_req ;    /* total sync bandwidth req for overhead*/
} ;                                     /* measured in bytes per T_Neg */

/*
 * P19 : SBA Allocation Address
 */
#define SWAP_SMT_P0019          "s6"

struct smt_p_0019 {
        struct smt_para para ;          /* generic parameter header */
        u_short         sba_pad ;
        struct fddi_addr alloc_addr ;   /* Allocation Address */
} ;

/*
 * P1A : SBA Category
 */
#define SWAP_SMT_P001A          "l"

struct smt_p_001a {
        struct smt_para para ;          /* generic parameter header */
        u_int           category ;      /* Allocator defined classification */
} ;

/*
 * P1B : Maximum T_Neg
 */
#define SWAP_SMT_P001B          "l"

struct smt_p_001b {
        struct smt_para para ;          /* generic parameter header */
        u_int           max_t_neg ;     /* longest T_NEG for the sync service*/
} ;

/*
 * P1C : Minimum SBA Segment Size
 */
#define SWAP_SMT_P001C          "l"

struct smt_p_001c {
        struct smt_para para ;          /* generic parameter header */
        u_int           min_seg_siz ;   /* smallest number of bytes per frame*/
} ;

/*
 * P1D : SBA Allocatable
 */
#define SWAP_SMT_P001D          "l"

struct smt_p_001d {
        struct smt_para para ;          /* generic parameter header */
        u_int           allocatable ;   /* total sync bw available for alloc */
} ;

/*
 * P20 0B : frame status capabilities
 * NOTE: not in swap table, is used by smt.c AND PMF table
 */
#define SMT_P_FSC       0x200b
/* #define SWAP_SMT_P_FSC       "ssss" */

struct smt_p_fsc {
        struct smt_para para ;          /* generic parameter header */
        u_short fsc_pad0 ;
        u_short fsc_mac_index ;         /* mac index 1 .. ff */
        u_short fsc_pad1 ;
        u_short fsc_value ;             /* FSC_TYPE[0-2] */
} ;

#define FSC_TYPE0       0               /* "normal" node (A/C handling) */
#define FSC_TYPE1       1               /* Special A/C indicator forwarding */
#define FSC_TYPE2       2               /* Special A/C indicator forwarding */

/*
 * P00 21 : user defined authorization (see pmf.c)
 */
#define SMT_P_AUTHOR    0x0021

/*
 * notification parameters
 */
#define SWAP_SMT_P1048  "ll"
struct smt_p_1048 {
        u_int p1048_flag ;
        u_int p1048_cf_state ;
} ;

/*
 * NOTE: all 2xxx 3xxx and 4xxx must include the INDEX in the swap string,
 *      even so the INDEX is NOT part of the struct.
 *      INDEX is already swapped in pmf.c, format in string is '4'
 */
#define SWAP_SMT_P208C  "4lss66"
struct smt_p_208c {
        u_int                   p208c_flag ;
        u_short                 p208c_pad ;
        u_short                 p208c_dupcondition ;
        struct  fddi_addr       p208c_fddilong ;
        struct  fddi_addr       p208c_fddiunalong ;
} ;

#define SWAP_SMT_P208D  "4lllll"
struct smt_p_208d {
        u_int                   p208d_flag ;
        u_int                   p208d_frame_ct ;
        u_int                   p208d_error_ct ;
        u_int                   p208d_lost_ct ;
        u_int                   p208d_ratio ;
} ;

#define SWAP_SMT_P208E  "4llll"
struct smt_p_208e {
        u_int                   p208e_flag ;
        u_int                   p208e_not_copied ;
        u_int                   p208e_copied ;
        u_int                   p208e_not_copied_ratio ;
} ;

#define SWAP_SMT_P208F  "4ll6666s6"

struct smt_p_208f {
        u_int                   p208f_multiple ;
        u_int                   p208f_nacondition ;
        struct fddi_addr        p208f_old_una ;
        struct fddi_addr        p208f_new_una ;
        struct fddi_addr        p208f_old_dna ;
        struct fddi_addr        p208f_new_dna ;
        u_short                 p208f_curren_path ;
        struct fddi_addr        p208f_smt_address ;
} ;

#define SWAP_SMT_P2090  "4lssl"

struct smt_p_2090 {
        u_int                   p2090_multiple ;
        u_short                 p2090_availablepaths ;
        u_short                 p2090_currentpath ;
        u_int                   p2090_requestedpaths ;
} ;

/*
 * NOTE:
 * special kludge for parameters 320b,320f,3210
 * these parameters are part of RAF frames
 * RAF frames are parsed in SBA.C and must be swapped
 * PMF.C has special code to avoid double swapping
 */
#ifdef  LITTLE_ENDIAN
#define SBAPATHINDEX    (0x01000000L)
#else
#define SBAPATHINDEX    (0x01L)
#endif

#define SWAP_SMT_P320B  "42s"

struct  smt_p_320b {
        struct smt_para para ;  /* generic parameter header */
        u_int   mib_index ;
        u_short path_pad ;
        u_short path_index ;
} ;

#define SWAP_SMT_P320F  "4l"

struct  smt_p_320f {
        struct smt_para para ;  /* generic parameter header */
        u_int   mib_index ;
        u_int   mib_payload ;
} ;

#define SWAP_SMT_P3210  "4l"

struct  smt_p_3210 {
        struct smt_para para ;  /* generic parameter header */
        u_int   mib_index ;
        u_int   mib_overhead ;
} ;

#define SWAP_SMT_P4050  "4l1111ll"

struct smt_p_4050 {
        u_int                   p4050_flag ;
        u_char                  p4050_pad ;
        u_char                  p4050_cutoff ;
        u_char                  p4050_alarm ;
        u_char                  p4050_estimate ;
        u_int                   p4050_reject_ct ;
        u_int                   p4050_ct ;
} ;

#define SWAP_SMT_P4051  "4lssss"
struct smt_p_4051 {
        u_int                   p4051_multiple ;
        u_short                 p4051_porttype ;
        u_short                 p4051_connectstate ;
        u_short                 p4051_pc_neighbor ;
        u_short                 p4051_pc_withhold ;
} ;

#define SWAP_SMT_P4052  "4ll"
struct smt_p_4052 {
        u_int                   p4052_flag ;
        u_int                   p4052_eberrorcount ;
} ;

#define SWAP_SMT_P4053  "4lsslss"

struct smt_p_4053 {
        u_int                   p4053_multiple ;
        u_short                 p4053_availablepaths ;
        u_short                 p4053_currentpath ;
        u_int                   p4053_requestedpaths ;
        u_short                 p4053_mytype ;
        u_short                 p4053_neighbortype ;
} ;


#define SMT_P_SETCOUNT  0x1035
#define SWAP_SMT_P_SETCOUNT     "l8"

struct smt_p_setcount {
        struct smt_para para ;          /* generic parameter header */
        u_int           count ;
        u_char          timestamp[8] ;
} ;

/*
 * SMT FRAMES
 */

/*
 * NIF : neighbor information frames
 */
struct smt_nif {
        struct smt_header       smt ;           /* generic header */
        struct smt_p_una        una ;           /* UNA */
        struct smt_p_sde        sde ;           /* station descriptor */
        struct smt_p_state      state ;         /* station state */
#ifdef  SMT6_10
        struct smt_p_fsc        fsc ;           /* frame status cap. */
#endif
} ;

/*
 * SIF : station information frames
 */
struct smt_sif_config {
        struct smt_header       smt ;           /* generic header */
        struct smt_p_timestamp  ts ;            /* time stamp */
        struct smt_p_sde        sde ;           /* station descriptor */
        struct smt_p_version    version ;       /* supported versions */
        struct smt_p_state      state ;         /* station state */
        struct smt_p_policy     policy ;        /* station policy */
        struct smt_p_latency    latency ;       /* path latency */
        struct smt_p_neighbor   neighbor ;      /* neighbors, we have only one*/
#ifdef  OPT_PMF
        struct smt_p_setcount   setcount ;       /* Set Count mandatory */
#endif
        /* WARNING : path MUST BE LAST FIELD !!! (see smt.c:smt_fill_path) */
        struct smt_p_path       path ;          /* path descriptor */
} ;
#define SIZEOF_SMT_SIF_CONFIG   (sizeof(struct smt_sif_config)- \
                                 sizeof(struct smt_p_path))

struct smt_sif_operation {
        struct smt_header       smt ;           /* generic header */
        struct smt_p_timestamp  ts ;            /* time stamp */
        struct smt_p_mac_status status ;        /* mac status */
        struct smt_p_mac_counter mc ;           /* MAC counter */
        struct smt_p_mac_fnc    fnc ;           /* MAC frame not copied */
        struct smp_p_manufacturer man ;         /* manufacturer field */
        struct smp_p_user       user ;          /* user field */
#ifdef  OPT_PMF
        struct smt_p_setcount   setcount ;       /* Set Count mandatory */
#endif
        /* must be last */
        struct smt_p_lem        lem[];          /* phy lem status */
} ;

/*
 * ECF : echo frame
 */
struct smt_ecf {
        struct smt_header       smt ;           /* generic header */
        struct smt_p_echo       ec_echo ;       /* echo parameter */
} ;
#define SMT_ECF_LEN     (sizeof(struct smt_header)+sizeof(struct smt_para))

/*
 * RDF : request denied frame
 */
struct smt_rdf {
        struct smt_header       smt ;           /* generic header */
        struct smt_p_reason     reason ;        /* reason code */
        struct smt_p_version    version ;       /* supported versions */
        struct smt_p_refused    refused ;       /* refused frame fragment */
} ;

/*
 * SBA Request Allocation Response Frame
 */
struct smt_sba_alc_res {
        struct smt_header       smt ;           /* generic header */
        struct smt_p_0015       s_type ;        /* resource type */
        struct smt_p_0016       cmd ;           /* SBA command */
        struct smt_p_reason     reason ;        /* reason code */
        struct smt_p_320b       path ;          /* path type */
        struct smt_p_320f       payload ;       /* current SBA payload */
        struct smt_p_3210       overhead ;      /* current SBA overhead */
        struct smt_p_0019       a_addr ;        /* Allocation Address */
        struct smt_p_001a       cat ;           /* Category - from the request */
        struct smt_p_001d       alloc ;         /* SBA Allocatable */
} ;

/*
 * SBA Request Allocation Request Frame
 */
struct smt_sba_alc_req {
        struct smt_header       smt ;           /* generic header */
        struct smt_p_0015       s_type ;        /* resource type */
        struct smt_p_0016       cmd ;           /* SBA command */
        struct smt_p_320b       path ;          /* path type */
        struct smt_p_0017       pl_req ;        /* requested payload */
        struct smt_p_0018       ov_req ;        /* requested SBA overhead */
        struct smt_p_320f       payload ;       /* current SBA payload */
        struct smt_p_3210       overhead ;      /* current SBA overhead */
        struct smt_p_0019       a_addr ;        /* Allocation Address */
        struct smt_p_001a       cat ;           /* Category - from the request */
        struct smt_p_001b       tneg ;          /* max T-NEG */
        struct smt_p_001c       segm ;          /* minimum segment size */
} ;

/*
 * SBA Change Allocation Request Frame
 */
struct smt_sba_chg {
        struct smt_header       smt ;           /* generic header */
        struct smt_p_0015       s_type ;        /* resource type */
        struct smt_p_0016       cmd ;           /* SBA command */
        struct smt_p_320b       path ;          /* path type */
        struct smt_p_320f       payload ;       /* current SBA payload */
        struct smt_p_3210       overhead ;      /* current SBA overhead */
        struct smt_p_001a       cat ;           /* Category - from the request */
} ;

/*
 * SBA Report Allocation Request Frame
 */
struct smt_sba_rep_req {
        struct smt_header       smt ;           /* generic header */
        struct smt_p_0015       s_type ;        /* resource type */
        struct smt_p_0016       cmd ;           /* SBA command */
} ;

/*
 * SBA Report Allocation Response Frame
 */
struct smt_sba_rep_res {
        struct smt_header       smt ;           /* generic header */
        struct smt_p_0015       s_type ;        /* resource type */
        struct smt_p_0016       cmd ;           /* SBA command */
        struct smt_p_320b       path ;          /* path type */
        struct smt_p_320f       payload ;       /* current SBA payload */
        struct smt_p_3210       overhead ;      /* current SBA overhead */
} ;

/*
 * actions
 */
#define SMT_STATION_ACTION      1
#define SMT_STATION_ACTION_CONNECT      0
#define SMT_STATION_ACTION_DISCONNECT   1
#define SMT_STATION_ACTION_PATHTEST     2
#define SMT_STATION_ACTION_SELFTEST     3
#define SMT_STATION_ACTION_DISABLE_A    4
#define SMT_STATION_ACTION_DISABLE_B    5
#define SMT_STATION_ACTION_DISABLE_M    6

#define SMT_PORT_ACTION         2
#define SMT_PORT_ACTION_MAINT   0
#define SMT_PORT_ACTION_ENABLE  1
#define SMT_PORT_ACTION_DISABLE 2
#define SMT_PORT_ACTION_START   3
#define SMT_PORT_ACTION_STOP    4

#endif  /* _SMT_ */