root/usr/src/cmd/cmd-inet/usr.sbin/snoop/snoop_mip.h
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (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 (c) 1999 by Sun Microsystems, Inc.
 * All rights reserved.
 */

#ifndef _SNOOP_MIP_H
#define _SNOOP_MIP_H

#ifdef __cplusplus
extern "C" {
#endif

#define ALIGN(ptr)              (ptr)

/*
 *      E X T E N S I O N S
 */

typedef struct {
        uchar_t         type;
        uchar_t         length;
} exthdr_t;

/* This header is used for Generalized MIP Authentication Extensions */
typedef struct {
        uint8_t         type;
        uint8_t         subtype;
        uint16_t        length;
} gen_exthdr_t;

#define MN_HA_AUTH      32
#define MN_FA_AUTH      33
#define FA_HA_AUTH      34
#define GEN_AUTH        36
#define MN_HA_KEY       126
#define MN_HA_TRAVERSE  129
#define ENCAP_DELIV     130
#define MN_NAI          131
#define FA_CHALLENGE    132
#define MN_FA_KEY       133

/* Subtypes for Generalized MIP Authentication Extension (GEN_AUTH) */
#define GEN_AUTH_MN_AAA         1

#define KEY_ALG_NONE            0
#define SA_MD5_MODE_PREF_SUF    2       /* ...in prefix+suffix */
#define SA_HMAC_MD5             3

/*
 *      R E G I S T R A T I O N    P R O T O C O L
 */

#define REG_TYPE_REQ    1
#define REG_TYPE_REP    3

typedef struct ident_str {
        uint32_t high_bits;     /* generated by the HA */
        uint32_t low_bits;      /* generated by the MN */
} ident_t;

#ifdef __sparc
#ifdef _BIT_FIELDS_HTOL
typedef struct registration_request_str {
        uchar_t         type;           /* must be REG_TYPE_REQ */
        uchar_t
                Simultaneous_registration :     1,
                Broadcasts_desired :            1,
                Decapsulation_done_locally :    1, /* ...by the popup MN */
                Minimal_encap_desired :         1,
                GRE_encap_desired :             1,
                VJ_compression_desired :        1,
                BiDirectional_Tunnel_desired :  1,
                reserved :                      1;
        ushort_t        lifetime;       /* 0 = dereg; 0xffff = infinity */
        in_addr_t       home_addr;      /* address of the MN */
        in_addr_t       home_agent_addr; /* address of a HA */
        in_addr_t       care_of_addr;   /* address of decap endpoint */
        ident_t         identification; /* for replay protection */
} regreq_t;
#endif /* _BIT_FIELDS_HTOL */
#endif /* __sparc */

#ifdef __i386
#ifdef _BIT_FIELDS_LTOH
typedef struct registration_request_str {
        uchar_t         type;           /* must be REG_TYPE_REQ */
        uchar_t
                reserved :                      1,
                BiDirectional_Tunnel_desired :  1,
                VJ_compression_desired :        1,
                GRE_encap_desired :             1,
                Minimal_encap_desired :         1,
                Decapsulation_done_locally :    1, /* ...by the popup MN */
                Broadcasts_desired :            1,
                Simultaneous_registration :     1;
        ushort_t        lifetime;       /* 0 = dereg; 0xffff = infinity */
        in_addr_t       home_addr;      /* address of the MN */
        in_addr_t       home_agent_addr; /* address of a HA */
        in_addr_t       care_of_addr;   /* address of decap endpoint */
        ident_t         identification; /* for replay protection */
} regreq_t;
#endif /* _BIT_FIELDS_LTOH */
#endif /* __i386 */

/*
 * Registration Reply sent by a home agent to a mobile node in
 * response to a registration request.
 */
typedef struct registration_reply_str {
        uchar_t         type;           /* must be REG_TYPE_REP */
        uchar_t         code;           /* refer to draft document */
        ushort_t        lifetime;       /* 0 = dereg; 0xffff = infinity */
        in_addr_t       home_addr;      /* address of the mobile node */
        in_addr_t       home_agent_addr; /* address of the home agent */
        ident_t         identification; /* derived from request's field */
} regrep_t;

/* service ok */
#define REPLY_CODE_ACK                                  0
#define REPLY_CODE_ACK_NO_SIMULTANEOUS                  1

/* denied by FA */
#define REPLY_CODE_FA_NACK_UNSPECIFIED                  64
#define REPLY_CODE_FA_NACK_PROHIBITED                   65
#define REPLY_CODE_FA_NACK_RESOURCES                    66
#define REPLY_CODE_FA_NACK_MN_AUTH                      67
#define REPLY_CODE_FA_NACK_HA_AUTH                      68
#define REPLY_CODE_FA_NACK_LIFETIME                     69
#define REPLY_CODE_FA_NACK_BAD_REQUEST                  70
#define REPLY_CODE_FA_NACK_BAD_REPLY                    71
#define REPLY_CODE_FA_NACK_ENCAP_UNAVAILABLE            72
#define REPLY_CODE_FA_NACK_VJ_UNAVAILABLE               73
#define REPLY_CODE_FA_NACK_BIDIR_TUNNEL_UNAVAILABLE     74
#define REPLY_CODE_FA_NACK_BIDIR_TUNNEL_NO_TBIT         75
#define REPLY_CODE_FA_NACK_BIDIR_TUNNEL_TOO_DISTANT     76
#define REPLY_CODE_FA_NACK_ICMP_HA_NET_UNREACHABLE      80
#define REPLY_CODE_FA_NACK_ICMP_HA_HOST_UNREACHABLE     81
#define REPLY_CODE_FA_NACK_ICMP_HA_PORT_UNREACHABLE     82
#define REPLY_CODE_FA_NACK_ICMP_HA_UNREACHABLE          88
#define REPLY_CODE_FA_NACK_UNIQUE_HOMEADDR_REQD         96
#define REPLY_CODE_FA_NACK_MISSING_NAI                  97
#define REPLY_CODE_FA_NACK_MISSING_HOME_AGENT           98
#define REPLY_CODE_FA_NACK_MISSING_HOMEADDR             99
#define REPLY_CODE_FA_NACK_UNKNOWN_CHALLENGE            104
#define REPLY_CODE_FA_NACK_MISSING_CHALLENGE            105
#define REPLY_CODE_FA_NACK_MISSING_MN_FA                106

/* denied by HA */
#define REPLY_CODE_HA_NACK_UNSPECIFIED                  128
#define REPLY_CODE_HA_NACK_PROHIBITED                   129
#define REPLY_CODE_HA_NACK_RESOURCES                    130
#define REPLY_CODE_HA_NACK_MN_AUTH                      131
#define REPLY_CODE_HA_NACK_FA_AUTH                      132
#define REPLY_CODE_HA_NACK_ID_MISMATCH                  133
#define REPLY_CODE_HA_NACK_BAD_REQUEST                  134
#define REPLY_CODE_HA_NACK_TOO_MANY_BINDINGS            135
#define REPLY_CODE_HA_NACK_BAD_HA_ADDRESS               136
#define REPLY_CODE_HA_NACK_BIDIR_TUNNEL_UNAVAILABLE     137
#define REPLY_CODE_HA_NACK_BIDIR_TUNNEL_NO_TBIT         138
#define REPLY_CODE_HA_NACK_BIDIR_ENCAP_UNAVAILABLE      139

/*
 * OTHER EXTENSIONS
 */

/*
 * The second set consists of those extensions which may appear only
 * in ICMP Router Discovery messages [4].  Currently, Mobile IP
 * defines the following Types for Extensions appearing in ICMP
 * Router Discovery messages:
 *
 * 0  One-byte PaddingOne-byte Padding (encoded with no Length nor
 * Data field)
 * 16  Mobility Agent Advertisement
 * 19  Prefix-Lengths
 */
#define ICMP_ADV_MSG_PADDING_EXT        0
#define ICMP_ADV_MSG_MOBILITY_AGT_EXT   16
#define ICMP_ADV_MSG_PREFIX_LENGTH_EXT  19
#define ICMP_ADV_MSG_FA_CHALLENGE       24
#define ICMP_ADV_MSG_FA_NAI             25


/*
 * Mobility Agent Advertisement Extension
 * The Mobility Agent Adv Extension follows the ICMP Router
 * Advertisement fields.It is used to indicate that an ICMP Router
 * Advertisement message is also an Agent Advertisement being sent
 * by a mobility agent.
 *
 * Type         16
 * Length       (6 + 4*N), where N is the number of care-of addresses
 *              advertised.
 *
 * Sequence Number
 * The count of Agent Advertisement messages sent since the
 * agent was initialized (Section 2.3.2).
 *
 * Registration Lifetime
 * The longest lifetime (measured in seconds) that this
 * agent is willing to accept in any Registration Request.
 * A value of 0xffff indicates infinity.  This field has no
 * relation to the "Lifetime" field within the ICMP Router
 * Advertisement portion of the Agent Advertisement.
 *
 * R    Registration required.  Registration with this foreign
 * agent (or another foreign agent on this link) is required
 * rather than using a co-located care-of address.
 *
 * B    Busy.  The foreign agent will not accept registrations
 * from additional mobile nodes.
 *
 * H    Home agent.  This agent offers service as a home agent
 * on the link on which this Agent Advertisement message is
 * sent.
 *
 * F    Foreign agent.  This agent offers service as a foreign
 * agent on the link on which this Agent Advertisement
 * message is sent.
 *
 * M    Minimal encapsulation.  This agent implements receiving
 * tunneled datagrams that use minimal encapsulation [15].
 *
 * G    GRE encapsulation.  This agent implements receiving
 * tunneled datagrams that use GRE encapsulation [8].
 *
 * V    Van Jacobson header compression.  This agent supports use
 * of Van Jacobson header compression [10] over the link
 * with any registered mobile node.
 *
 * reserved     sent as zero; ignored on reception.
 *
 * Care-of Address(es)
 * The advertised foreign agent care-of address(es) provided
 * by this foreign agent.  An Agent Advertisement MUST
 * include at least one care-of address if the 'F' bit
 * is set.  The number of care-of addresses present is
 * determined by the Length field in the Extension.
 *
 * A HA must always be prepared to serve the mobile nodes for
 * which it is the home agent. A FA may at times be too busy
 * to serve additional MNs; even so, it must continue to send
 * Agent Advertisements, so that any mobile nodes already registered
 * with it will know that they have not moved out of range of the
 * foreign agent and that the  has not failed.  A foreign
 * agent may indicate that it is "too busy" to allow new MNs to
 * register with it, by setting the 'B' bit in its Agent Adv.
 * An Agent Adv message MUST NOT have the 'B' bit set if the
 * 'F' bit is not also set, and at least one of the 'F' bit and the
 * 'H'  bit MUST be set in any Agent Advertisement message sent.
 *
 * When a FA wishes to require registration even from those
 * mobile nodes which have acquired a co-located care-of address, it
 * sets the 'R' bit to one. Because this bit applies only to foreign
 * agents, an agent MUST NOT set the 'R' bit to one unless the 'F'
 * bit is also set to one.
 */
#ifdef __sparc
#ifdef _BIT_FIELDS_HTOL
typedef struct mobility_agt_adv_extension {
        uchar_t         type;
        uchar_t         length;
        ushort_t        sequence_num;
        ushort_t        reg_lifetime;
        ushort_t        reg_bit:1,
                        busy_bit:1,
                        ha_bit:1,
                        fa_bit:1,
                        minencap_bit:1,
                        greencap_bit:1,
                        vanjacob_hdr_comp_bit:1,
                        reverse_tunnel_bit:1,
                        reserved:8;
} mobagtadvext_t;

#endif /* _BIT_FIELDS_HTOL */
#endif /* __sparc */

#ifdef __i386
#ifdef _BIT_FIELDS_LTOH
typedef struct mobility_agt_adv_extension {
        uchar_t         type;
        uchar_t         length;
        ushort_t        sequence_num;
        ushort_t        reg_lifetime;
        uchar_t
                        reverse_tunnel_bit:1,
                        vanjacob_hdr_comp_bit:1,
                        greencap_bit:1,
                        minencap_bit:1,
                        fa_bit:1,
                        ha_bit:1,
                        busy_bit:1,
                        reg_bit:1;
        uchar_t         reserved;
} mobagtadvext_t;
#endif /* _BIT_FIELDS_LTOH */
#endif /* __i386 */

#ifdef __cplusplus
}
#endif

#endif /* _SNOOP_MIP_H */