FreeBSD-5.3/usr.sbin/atm/scspd/scsp_msg.h

/*
 *
 * ===================================
 * 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: src/usr.sbin/atm/scspd/scsp_msg.h,v 1.3 2002/05/16 23:57:37 arr Exp $
 *
 */

/*
 * 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)					\
		free((c)->atmarp_data);				\
	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 */