mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-22 11:17:19 +00:00
463 lines
11 KiB
C
463 lines
11 KiB
C
/*
|
|
*
|
|
* ===================================
|
|
* HARP | Host ATM Research Platform
|
|
* ===================================
|
|
*
|
|
*
|
|
* This Host ATM Research Platform ("HARP") file (the "Software") is
|
|
* made available by Network Computing Services, Inc. ("NetworkCS")
|
|
* "AS IS". NetworkCS does not provide maintenance, improvements or
|
|
* support of any kind.
|
|
*
|
|
* NETWORKCS MAKES NO WARRANTIES OR REPRESENTATIONS, EXPRESS OR IMPLIED,
|
|
* INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
* AND FITNESS FOR A PARTICULAR PURPOSE, AS TO ANY ELEMENT OF THE
|
|
* SOFTWARE OR ANY SUPPORT PROVIDED IN CONNECTION WITH THIS SOFTWARE.
|
|
* In no event shall NetworkCS be responsible for any damages, including
|
|
* but not limited to consequential damages, arising from or relating to
|
|
* any use of the Software or related support.
|
|
*
|
|
* Copyright 1994-1998 Network Computing Services, Inc.
|
|
*
|
|
* Copies of this Software may be made, however, the above copyright
|
|
* notice must be reproduced on all copies.
|
|
*
|
|
* @(#) $FreeBSD$
|
|
*
|
|
*/
|
|
|
|
/*
|
|
* Server Cache Synchronization Protocol (SCSP) Support
|
|
* ----------------------------------------------------
|
|
*
|
|
* SCSP message formats
|
|
*
|
|
*/
|
|
|
|
#ifndef _SCSP_SCSP_MSG_H
|
|
#define _SCSP_SCSP_MSG_H
|
|
|
|
|
|
/*
|
|
* ATMARP constants
|
|
*/
|
|
#define ARP_ATMFORUM 19
|
|
#define ARP_TL_TMASK 0x40 /* Type mask */
|
|
#define ARP_TL_NSAPA 0x00 /* Type = ATM Forum NSAPA */
|
|
#define ARP_TL_E164 0x40 /* Type = E.164 */
|
|
#define ARP_TL_LMASK 0x3f /* Length mask */
|
|
|
|
|
|
/*
|
|
* SCSP version number
|
|
*/
|
|
#define SCSP_VER_1 1
|
|
|
|
|
|
/*
|
|
* SCSP message types
|
|
*/
|
|
#define SCSP_CA_MSG 1
|
|
#define SCSP_CSU_REQ_MSG 2
|
|
#define SCSP_CSU_REPLY_MSG 3
|
|
#define SCSP_CSUS_MSG 4
|
|
#define SCSP_HELLO_MSG 5
|
|
|
|
|
|
/*
|
|
* SCSP Client Protocol IDs
|
|
*/
|
|
#define SCSP_PROTO_ATMARP 1
|
|
#define SCSP_PROTO_NHRP 2
|
|
#define SCSP_PROTO_MARS 3
|
|
#define SCSP_PROTO_DHCP 4
|
|
#define SCSP_PROTO_LNNI 5
|
|
|
|
|
|
/*
|
|
* Extension types
|
|
*/
|
|
#define SCSP_EXT_END 0
|
|
#define SCSP_EXT_AUTH 1
|
|
#define SCSP_EXT_VENDOR 2
|
|
|
|
/*
|
|
* Sequence number bounds
|
|
*/
|
|
#define SCSP_CSA_SEQ_MIN 0x80000001
|
|
#define SCSP_CSA_SEQ_MAX 0x7FFFFFFF
|
|
|
|
|
|
/*
|
|
* Sender, Receiver, or Originator ID lengths
|
|
*/
|
|
#define SCSP_ATMARP_ID_LEN 4
|
|
#define SCSP_NHRP_ID_LEN 4
|
|
#define SCSP_MAX_ID_LEN 4
|
|
|
|
|
|
/*
|
|
* Cache Key lengths
|
|
*/
|
|
#define SCSP_ATMARP_KEY_LEN 4
|
|
#define SCSP_NHRP_KEY_LEN 4
|
|
#define SCSP_MAX_KEY_LEN 4
|
|
|
|
|
|
/*
|
|
* Fixed header
|
|
*/
|
|
struct scsp_nhdr {
|
|
u_char sh_ver; /* SCSP version */
|
|
u_char sh_type; /* Message type */
|
|
u_short sh_len; /* Message length */
|
|
u_short sh_checksum; /* IP checksum over message */
|
|
u_short sh_ext_off; /* Offset of first extension */
|
|
};
|
|
|
|
|
|
/*
|
|
* Mandatory common part
|
|
*/
|
|
struct scsp_nmcp {
|
|
u_short sm_pid; /* Protocol ID */
|
|
u_short sm_sgid; /* Server group ID */
|
|
u_short sm_fill_0; /* Unused */
|
|
u_short sm_flags; /* Flags--see below */
|
|
u_char sm_sid_len; /* Sender ID length */
|
|
u_char sm_rid_len; /* Receiver ID length */
|
|
u_short sm_rec_cnt; /* Number of records */
|
|
#ifdef NOTDEF
|
|
/* Variable length fields */
|
|
u_char sm_sid[]; /* Sender ID (variable) */
|
|
u_char sm_rid[]; /* Receiver ID (variable) */
|
|
#endif
|
|
};
|
|
|
|
|
|
/*
|
|
* Extensions part
|
|
*/
|
|
struct scsp_next {
|
|
u_short se_type; /* Extension type */
|
|
u_short se_len; /* Length */
|
|
#ifdef NOTDEF
|
|
/* Variable length fields */
|
|
u_char se_value[]; /* Extension value */
|
|
#endif
|
|
};
|
|
|
|
|
|
/*
|
|
* Cache State Advertisement record or
|
|
* Cache State Advertisement Summary record
|
|
*/
|
|
struct scsp_ncsa {
|
|
u_short scs_hop_cnt; /* Hop count */
|
|
u_short scs_len; /* Record length */
|
|
u_char scs_ck_len; /* Cache key length */
|
|
u_char scs_oid_len; /* Originator ID length */
|
|
u_short scs_nfill; /* Null bit and filler */
|
|
long scs_seq; /* Sequence number */
|
|
#ifdef NOTDEF
|
|
/* Variable length fields */
|
|
u_char scs_ckey[]; /* Cache key */
|
|
u_char scs_oid[]; /* Originator ID */
|
|
u_char scs_proto[]; /* Protocol-specific (in CSA) */
|
|
#endif
|
|
};
|
|
|
|
#define SCSP_CSAS_NULL 0x8000
|
|
|
|
|
|
/*
|
|
* Cache Alignment message
|
|
*/
|
|
struct scsp_nca {
|
|
long sca_seq; /* Sequence number */
|
|
struct scsp_nmcp sca_mcp; /* Mandatory common */
|
|
#ifdef NOTDEF
|
|
/* Variable length fields */
|
|
struct scsp_ncsa sca_rec[]; /* CSASs */
|
|
#endif
|
|
};
|
|
|
|
#define SCSP_CA_M 0x8000 /* Master/Slave bit */
|
|
#define SCSP_CA_I 0x4000 /* Initialization bit */
|
|
#define SCSP_CA_O 0x2000 /* More bit */
|
|
|
|
|
|
/*
|
|
* Cache State Update Request, Cache State Update Reply, or
|
|
* Cache State Update Solicit message
|
|
*/
|
|
struct scsp_ncsu_msg {
|
|
struct scsp_nmcp scr_mcp; /* Mandatory common */
|
|
#ifdef NOTDEF
|
|
/* Variable length fields */
|
|
struct scsp_ncsa scr_rec[]; /* CSAs */
|
|
#endif
|
|
};
|
|
|
|
|
|
/*
|
|
* Hello message
|
|
*/
|
|
struct scsp_nhello {
|
|
u_short sch_hi; /* Hello interval */
|
|
u_short sch_df; /* Dead factor */
|
|
u_short sch_fill_0; /* Unused */
|
|
u_short sch_fid; /* Family ID */
|
|
struct scsp_nmcp sch_mcp; /* Mandatory common */
|
|
#ifdef NOTDEF
|
|
/* Variable-length fields */
|
|
struct scsp_nrid sch_rid[]; /* Receiver IDs */
|
|
#endif
|
|
};
|
|
|
|
|
|
/*
|
|
* ATMARP-specific Cache State Advertisement record
|
|
*/
|
|
struct scsp_atmarp_ncsa {
|
|
u_short sa_hrd; /* Hardware type -- 0x0013 */
|
|
u_short sa_pro; /* Protocol type -- 0x0800 */
|
|
u_char sa_shtl; /* Src ATM addr type/len */
|
|
u_char sa_sstl; /* Src ATM subaddr type/len */
|
|
u_char sa_state; /* State */
|
|
u_char sa_fill1; /* Unused */
|
|
u_char sa_spln; /* Src proto addr type */
|
|
u_char sa_thtl; /* Tgt ATM addr type/len */
|
|
u_char sa_tstl; /* Tgt ATM subaddr type/len */
|
|
u_char sa_tpln; /* Tgt proto addr len */
|
|
#ifdef NOTDEF
|
|
/* Variable-length fields */
|
|
u_char sa_sha[]; /* Source ATM addr */
|
|
u_char sa_ssa[]; /* Source ATM subaddr */
|
|
u_char sa_spa[]; /* Source IP addr */
|
|
u_char sa_tha[]; /* Target ATM addr */
|
|
u_char sa_tsa[]; /* Target ATM subaddr */
|
|
u_char sa_tpa[]; /* Target IP addr */
|
|
#endif
|
|
};
|
|
|
|
|
|
/*
|
|
* NHRP-specific Cache State Advertisement record
|
|
*/
|
|
struct scsp_nhrp_ncsa {
|
|
u_short sn_af; /* Address family */
|
|
u_short sn_pro; /* NHRP protocol type */
|
|
u_char sn_snap[5]; /* SNAP header */
|
|
u_char sn_ver; /* NHRP version no. */
|
|
u_short sn_flags; /* Flags */
|
|
u_long sn_rid; /* Request ID */
|
|
u_char sn_state; /* State */
|
|
u_char sn_pln; /* Prefix length */
|
|
u_short sn_fill1; /* Unused */
|
|
u_short sn_mtu; /* MTU */
|
|
u_short sn_hold; /* Holding time */
|
|
u_char sn_csatl; /* Client addr type/len */
|
|
u_char sn_csstl; /* Client subaddr type/len */
|
|
u_char sn_cpln; /* Client proto addr len */
|
|
u_char sn_pref; /* Preference for next hop */
|
|
#ifdef NOTDEF
|
|
/* Variable-length fields */
|
|
u_char sn_csa[]; /* Client subnetwork addr */
|
|
u_char sn_css[]; /* Client subnetwork subaddr */
|
|
u_char sn_cpa[]; /* Client protocol addr */
|
|
#endif
|
|
};
|
|
|
|
|
|
/*
|
|
* SCSP messages in internal format
|
|
*
|
|
*
|
|
* Fixed message header
|
|
*/
|
|
struct scsp_hdr {
|
|
u_char msg_type; /* Message type */
|
|
};
|
|
typedef struct scsp_hdr Scsp_hdr;
|
|
|
|
|
|
/*
|
|
* Sender or Receiver ID structure
|
|
*/
|
|
struct scsp_id {
|
|
struct scsp_id *next; /* Next ID */
|
|
u_char id_len; /* ID length */
|
|
u_char id[SCSP_MAX_ID_LEN]; /* ID */
|
|
};
|
|
typedef struct scsp_id Scsp_id;
|
|
|
|
|
|
/*
|
|
* Cacke Key structure
|
|
*/
|
|
struct scsp_ckey {
|
|
u_char key_len; /* Cache key length */
|
|
u_char key[SCSP_MAX_KEY_LEN]; /* Cache key */
|
|
};
|
|
typedef struct scsp_ckey Scsp_ckey;
|
|
|
|
|
|
/*
|
|
* Mandatory common part
|
|
*/
|
|
struct scsp_mcp {
|
|
u_short pid; /* Protocol ID */
|
|
u_short sgid; /* Server group ID */
|
|
u_short flags; /* Flags */
|
|
u_short rec_cnt; /* No. of records attached */
|
|
Scsp_id sid; /* Sender ID */
|
|
Scsp_id rid; /* Receiver ID */
|
|
};
|
|
typedef struct scsp_mcp Scsp_mcp;
|
|
|
|
|
|
/*
|
|
* Extensions part
|
|
*/
|
|
struct scsp_ext {
|
|
struct scsp_ext *next; /* Next extension */
|
|
u_short type; /* Extension type */
|
|
u_short len; /* Length */
|
|
#ifdef NOTDEF
|
|
/* Variable length fields */
|
|
u_char value[]; /* Extension value */
|
|
#endif
|
|
};
|
|
typedef struct scsp_ext Scsp_ext;
|
|
|
|
|
|
/*
|
|
* Cache State Advertisement record or
|
|
* Cache State Advertisement Summary record
|
|
*/
|
|
struct scsp_csa {
|
|
struct scsp_csa *next; /* Next CSAS record */
|
|
u_short hops; /* Hop count */
|
|
u_char null; /* Null flag */
|
|
u_long seq; /* CSA seq. no. */
|
|
Scsp_ckey key; /* Cache key */
|
|
Scsp_id oid; /* Originator ID */
|
|
int trans_ct; /* No. of times CSA sent */
|
|
struct scsp_atmarp_csa *atmarp_data; /* ATMARP data */
|
|
#ifdef NOTDEF
|
|
struct scsp_nhrp_csa *nhrp_data; /* NHRP data */
|
|
#endif
|
|
};
|
|
typedef struct scsp_csa Scsp_csa;
|
|
|
|
/*
|
|
* Macro to free a CSA and any associated protocol-specific data
|
|
*/
|
|
#define SCSP_FREE_CSA(c) \
|
|
{ \
|
|
if ((c)->atmarp_data) { \
|
|
UM_FREE((c)->atmarp_data); \
|
|
} \
|
|
UM_FREE((c)); \
|
|
}
|
|
|
|
|
|
/*
|
|
* Cache Alignment message
|
|
*/
|
|
struct scsp_ca {
|
|
long ca_seq; /* CA msg sequence no. */
|
|
u_char ca_m; /* Master/slave bit */
|
|
u_char ca_i; /* Initialization bit */
|
|
u_char ca_o; /* More bit */
|
|
Scsp_mcp ca_mcp; /* Mandatory common part */
|
|
Scsp_csa *ca_csa_rec; /* Ptr. to CSAS records */
|
|
};
|
|
typedef struct scsp_ca Scsp_ca;
|
|
|
|
|
|
/*
|
|
* Cache State Update Request, Cache State Update Reply, or
|
|
* Cache State Update Solicit message
|
|
*/
|
|
struct scsp_csu_msg {
|
|
Scsp_mcp csu_mcp; /* Mandatory common part */
|
|
Scsp_csa *csu_csa_rec; /* Ptr. to CSA records */
|
|
};
|
|
typedef struct scsp_csu_msg Scsp_csu_msg;
|
|
|
|
|
|
/*
|
|
* Hello message
|
|
*/
|
|
struct scsp_hello {
|
|
u_short hello_int; /* Hello interval */
|
|
u_short dead_factor; /* When is DCS dead? */
|
|
u_short family_id; /* Family ID */
|
|
Scsp_mcp hello_mcp; /* Mandatory common part */
|
|
};
|
|
typedef struct scsp_hello Scsp_hello;
|
|
|
|
|
|
/*
|
|
* NHRP-specific Cache State Advertisement record
|
|
*/
|
|
struct scsp_nhrp_csa {
|
|
u_char req_id; /* Request ID */
|
|
u_char state; /* State */
|
|
u_char pref_len; /* Prefix length */
|
|
u_short flags; /* See below */
|
|
u_short mtu; /* Maximim transmission unit */
|
|
u_short hold_time; /* Entry holding time */
|
|
u_char caddr_tlen; /* Client addr type/length */
|
|
u_char csaddr_tlen; /* Client subaddr type/length */
|
|
u_char cproto_len; /* Client proto addr length */
|
|
u_char pref; /* Preference */
|
|
Atm_addr caddr; /* Client address */
|
|
Atm_addr csaddr; /* Client subaddress */
|
|
struct in_addr cproto_addr; /* Client protocol address */
|
|
};
|
|
typedef struct scsp_nhrp Scsp_nhrp;
|
|
|
|
#define SCSP_NHRP_UNIQ 0x8000
|
|
#define SCSP_NHRP_ARP 0x4000
|
|
|
|
|
|
/*
|
|
* ATMARP-specific Cache State Advertisement record
|
|
*/
|
|
struct scsp_atmarp_csa {
|
|
u_char sa_state; /* State */
|
|
Atm_addr sa_sha; /* Source ATM addr */
|
|
Atm_addr sa_ssa; /* Source ATM subaddr */
|
|
struct in_addr sa_spa; /* Source IP addr */
|
|
Atm_addr sa_tha; /* Target ATM addr */
|
|
Atm_addr sa_tsa; /* Target ATM subaddr */
|
|
struct in_addr sa_tpa; /* Target IP addr */
|
|
};
|
|
typedef struct scsp_atmarp_csa Scsp_atmarp_csa;
|
|
|
|
|
|
/*
|
|
* SCSP message
|
|
*/
|
|
struct scsp_msg {
|
|
Scsp_hdr sc_hdr;
|
|
union {
|
|
Scsp_ca *sc_u_ca;
|
|
Scsp_csu_msg *sc_u_csu_msg;
|
|
Scsp_hello *sc_u_hello;
|
|
} sc_msg_u;
|
|
Scsp_ext *sc_ext;
|
|
};
|
|
typedef struct scsp_msg Scsp_msg;
|
|
|
|
#define sc_msg_type sc_hdr.msg_type
|
|
#define sc_ca sc_msg_u.sc_u_ca
|
|
#define sc_csu_msg sc_msg_u.sc_u_csu_msg
|
|
#define sc_hello sc_msg_u.sc_u_hello
|
|
|
|
#endif /* _SCSP_SCSP_MSG_H */
|