Files
2026-07-30 11:19:44 +05:30

1539 lines
47 KiB
C

/* ipmip4_msgext.h - ipmip4_msgext.h */
/*
******************************************************************************
* HEADER FILE
*
* Document no: @(#) $Name: VXWORKS_ITER40_2019102207 $ $RCSfile: ipmip4_msgext.h,v $ $Revision: 1.15.2.1 $
* $Source: /home/interpeak/CVSRoot/ipmip4/include/private/ipmip4_msgext.h,v $
* $Author: svc-cmnet $ $Date: 2013-03-13 07:45:31 $
* $State: Exp $ $Locker: $
*
* INTERPEAK_COPYRIGHT_STRING
* Design and implementation by Joel Hortelius <joel.hortelius@interpeak.se>
******************************************************************************
*/
#ifndef IPMIP4_MSGEXT_H
#define IPMIP4_MSGEXT_H
/*
****************************************************************************
* 1 DESCRIPTION
****************************************************************************
* Base class containing defintions and methods to parse MIP4 registration
* requests and icmp advertisements.
*/
/*
DESCRIPTION
Base class containing defintions and methods to parse MIP4 registration
requests, options and icmp advertisements.
EXAMPLE
.CS
void my_parse_request(struct Ipmip4_my_context *ctx, Ipmip_proc_t *proc, Ipmip4_pktbuf_t *pbuf)
{
/@ Parse the registration request and locate all the various extensions
provided with it @/
pbuf->ext.mobile.result = ipmip4_msgext_mobile_parse_ext(&ctx->ipmip4,
proc,
pbuf,
IPMIP4_REGREQ_LENGTH);
switch (pbuf->ext.mobile.result)
{
case IPMIP4_REG_EXT_FAILED_AUTH:
/@ Bad or duplicate Authentication Extensions @/
return;
case IPMIP4_REG_EXT_POORLY_FORMED:
/@ A badly foormed extension was located in the frame @/
return;
case IPMIP4_REG_EXT_DISCARD:
/@ The parse code decided to discard this request. Usually this
occurs when an unknown non-skippable extension is located @/
return;
}
}
.CE
*/
/*
****************************************************************************
* 2 CONFIGURATION
****************************************************************************
*/
/*
****************************************************************************
* 3 INCLUDE FILES
****************************************************************************
*/
#include <ipcom_clib2.h>
#include <private/ipmip_pktbuf.h>
#include <private/ipmip_lladdr.h>
#include <private/ipmip4_ntop.h>
#include "ipmip4_vendor_ext.h"
#ifdef __cplusplus
extern "C" {
#endif
/*
****************************************************************************
* 4 DEFINES
****************************************************************************
*/
/* general reply codes. */
#define IPMIP4_CODE_REP_REG_ACCEPTED 0 /* OK: 0=supports multiple bindings */
#define IPMIP4_CODE_REP_REG_ACCEPTED_BUT_NO_SIM_BINDS 1 /* 1=not (1 only used during
non-dereg register reply when
we can't support the request
of multiple bindings. */
/* rfc3344 reply codes used by foreign agent */
#define IPMIP4_CODE_REP_FA_REASON_UNSPECIFIED 64 /* reason unspecified [RFC3344] */
#define IPMIP4_CODE_REP_FA_ADMIN_PROHIBIT 65 /* administratively prohibited [RFC3344] */
#define IPMIP4_CODE_REP_FA_INSUFFICIENT_RESOURCES 66 /* insufficient resources [RFC3344] */
#define IPMIP4_CODE_REP_FA_MN_FAILED_AUTH 67 /* mobile node failed authentication [RFC3344,RFC3012] */
#define IPMIP4_CODE_REP_FA_HA_FAILED_AUTH 68 /* home agent failed authentication [RFC3344] */
#define IPMIP4_CODE_REP_FA_LIFETIME_TOO_LONG 69 /* requested Lifetime too long [RFC3344] */
#define IPMIP4_CODE_REP_FA_POORLY_FORMED_REQUEST 70 /* poorly formed Request [RFC3344] */
#define IPMIP4_CODE_REP_FA_POORLY_FORMED_REPLY 71 /* poorly formed Reply [RFC3344] */
#define IPMIP4_CODE_REP_FA_ENCAP_UNAVAIL 72 /* requested encapsulation unavailable [RFC3344] */
#define IPMIP4_CODE_REP_FA_RESERVED_UNAVAIL 73 /* reserved and unavailable [RFC3344] */
#define IPMIP4_CODE_REP_FA_REV_TUNNEL_UNAVAIL 74 /* request reverse tunnel unavailable [RFC3024] */
#define IPMIP4_CODE_REP_FA_REV_TUNNEL_MANDATORY 75 /* reverse runnel is mandatory and 'T' bit not set [RFC3024] */
#define IPMIP4_CODE_REP_FA_MN_TOO_DISTANT 76 /* mobile node too distant [RFC3024] */
#define IPMIP4_CODE_REP_FA_INVALID_CAREOF_ADDRESS 77 /* invalid care-of address [RFC3344] */
#define IPMIP4_CODE_REP_FA_REG_TIMEOUT 78 /* registration timeout [RFC3344] */
#define IPMIP4_CODE_REP_FA_DELIVERY_UNAVAIL 79 /* delivery style not supported [RFC3024] */
#define IPMIP4_CODE_REP_FA_HOME_NET_UNREACH 80 /* home network unreachable (ICMP error received) [RFC3344] */
#define IPMIP4_CODE_REP_FA_HOME_AGENT_UNREACH 81 /* home agent host unreachable (ICMP error received) [RFC3344] */
#define IPMIP4_CODE_REP_FA_HOME_AGENT_PORT_UNREACH 82 /* home agent port unreachable (ICMP error received) [RFC3344] */
#define IPMIP4_CODE_REP_FA_HOME_AGENT_ERROR 88 /* home agent unreachable (other ICMP error received) [RFC3344] */
#define IPMIP4_CODE_REP_FA_VENDOR_SPECIFIC 89 /* vendor-specific reason [Quick] */
#define IPMIP4_CODE_REP_FA_NONZERO_HOMEADDR_REQ 96 /* nonzero_homeaddr_reqd [RFC2794] */
#define IPMIP4_CODE_REP_FA_MISSING_NAI 97 /* missing_nai [RFC2794] */
#define IPMIP4_CODE_REP_FA_MISSING_HOME_AGENT 98 /* missing_home_agent [RFC2794] */
#define IPMIP4_CODE_REP_FA_MISSING_HOME_ADDRESS 99 /* missing_homeaddr [RFC2794] */
#define IPMIP4_CODE_REP_FA_ERROR_FA_1 100 /* ERROR-FA-1 [RFC3115] */
#define IPMIP4_CODE_REP_FA_ERROR_FA_2 101 /* ERROR-FA-2 [RFC3115] */
#define IPMIP4_CODE_REP_FA_UNKNOWN_CHALLENGE 104 /* unknown_challenge [RFC3012] */
#define IPMIP4_CODE_REP_FA_MISSING_CHALLENGE 105 /* missing_challenge [RFC3012] */
#define IPMIP4_CODE_REP_FA_STALE_CHALLENGE 106 /* stale_challenge [RFC3012] */
#define IPMIP4_CODE_REP_FA_MISSING_MN_FA 107 /* MISSING_MN_FA [RFC3957] */
#define IPMIP4_CODE_REP_FA_BAD_AAA_AUTH 108 /* fa_bad_aaa_auth [RFC4721] */
#define IPMIP4_CODE_REP_FA_HA_WRONG_CHALLENGE 109 /* wrong_challenge [RFC4721] */
#define IPMIP4_CODE_REP_FA_EXPERIMENTAL 127 /* FA Error Code for Experimental use [RFC4064] */
#define IPMIP4_CODE_REP_FA(code) ((code) <= 8 || ((code) >= 64 && (code) < 128))
/* reply codes for registration denied by home agent. */
#define IPMIP4_CODE_REP_HA_REASON_UNSPECIFIED 128
#define IPMIP4_CODE_REP_HA_ADMIN_PROHIBIT 129
#define IPMIP4_CODE_REP_HA_INSUFFICIENT_RESOURCES 130
#define IPMIP4_CODE_REP_HA_MN_FAILED_AUTH 131
#define IPMIP4_CODE_REP_HA_FA_FAILED_AUTH 132
#define IPMIP4_CODE_REP_HA_REG_ID_MISMATCH 133
#define IPMIP4_CODE_REP_HA_POORLY_FORMED_REQUEST 134
#define IPMIP4_CODE_REP_HA_TOO_MANY_SIM 135
#define IPMIP4_CODE_REP_HA_UNKNOWN_HOME_AGENT_ADDR 136 /* unknown home agent address [RFC3344] */
/* rfc2344 HA codes: */
#define IPMIP4_CODE_REP_HA_REV_TUNNEL_UNAVAIL 137 /* request reverse tunnel unavailable [RFC3024] */
#define IPMIP4_CODE_REP_HA_REV_TUNNEL_MANDATORY 138 /* reverse runnel is mandatory and 'T' bit not set [RFC3024] */
#define IPMIP4_CODE_REP_HA_ENCAP_UNAVAIL 139 /* requested encapsulation unavailable [RFC3024] */
#define IPMIP4_CODE_REP_HA_ERROR_HA_1 140 /* ERROR-HA-1 [RFC3115] */
#define IPMIP4_CODE_REP_HA_ERROR_HA_2 141 /* ERROR-HA-2 [RFC3115] */
#define IPMIP4_CODE_REP_HA_UDP_ENCAP_UNAVAIL 142 /* ERROR_HA_UDP-ENCAP_UNAVAIL [RFC3519] */
#define IPMIP4_CODE_REP_HA_REGISTER_REDIRECTED 143 /* Reregister with redirected HA [RFC4433] */
#define IPMIP4_CODE_REP_HA_BAD_AAA_AUTH 144 /* ha_bad_aaa_auth [RFC4721] */
/* rfc5177 HA codes: */
#define IPMIP4_CODE_REP_HA_MOBNET_ERROR 147 /* Mobile Network Prefix operation error (HA_MOBNET_ERROR) [RFC5177]*/
#define IPMIP4_CODE_REP_HA_MOBNET_DISALLOWED 148 /* Mobile Router operation is not permitted (HA_MOBNET_DISALLOWED) [RFC5177]*/
#define IPMIP4_CODE_REP_HA_EXPERIMENTAL 192 /* HA Error Code for Experimental use [RFC4064] */
#define IPMIP4_CODE_REP_FA_INVALID_HOME_AGENT_ADDRESS 194 /* FA does not serve MN as HA */
#define IPMIP4_CODE_REP_HA(code) ((code) <= 8 || ((code) >= 128))
/* Known extensions */
#define IPMIP4_EXT_TYPE_MOBILE_HOME_AUTH 32
#define IPMIP4_EXT_TYPE_MOBILE_FOREIGN_AUTH 33
#define IPMIP4_EXT_TYPE_FOREIGN_HOME_AUTH 34
#define IPMIP4_EXT_TYPE_FOREIGN_FOREIGN_AUTH 35
#define IPMIP4_EXT_TYPE_GENERIC_AUTH 36
#define IPMIP4_EXT_TYPE_CVSE 38
#define IPMIP4_EXT_TYPE_MN_FA_KEYGEN_REQ 40
#define IPMIP4_EXT_TYPE_MN_FA_KEYGEN_REP 41
#define IPMIP4_EXT_TYPE_MN_HA_KEYGEN_REQ 42
#define IPMIP4_EXT_TYPE_MN_HA_KEYGEN_REP 43
#define IPMIP4_EXT_TYPE_UDP_TUNNEL_REP 44
#define IPMIP4_EXT_TYPE_FA_ERROR 45
#define IPMIP4_EXT_TYPE_PMIPV4_NON_SKIPPABLE 47
#define IPMIP4_EXT_TYPE_NAI_MOBILE 131
#define IPMIP4_EXT_TYPE_AGENT_ADV_CHALLENGE 132
#define IPMIP4_EXT_TYPE_NVSE 134
#define IPMIP4_EXT_TYPE_NAI_AGENT 136
#define IPMIP4_EXT_TYPE_REVOCATION 137
#define IPMIP4_EXT_TYPE_LLA 138
#define IPMIP4_EXT_TYPE_DYNAMIC_HA 139
#define IPMIP4_EXT_TYPE_UDP_TUNNEL_REQ 144
#define IPMIP4_EXT_TYPE_PMIPV4 147
#define IPMIP4_EXT_TYPE_MOBNET 148
# define IPMIP4_MOBNET_SUBTYPE_REGISTRATION 0
# define IPMIP4_MOBNET_SUBTYPE_ACK_EXPLICIT 1
# define IPMIP4_MOBNET_SUBTYPE_ACK_IMPLICIT 2
# define IPMIP4_MOBNET_SUCCESS 0
# define IPMIP4_MOBNET_INVALID_PREFIX_LEN 1
# define IPMIP4_MOBNET_UNAUTHORIZED 2
# define IPMIP4_MOBNET_FWDING_SETUP_FAILED 3
#define IPMIP4_PMIPV4_SUBTYPE_PER_NODE_AUTH_METHOD 1
# define IPMIP4_PMIPV4_AUTH_TYPE_METHOD_FA_HA 1
# define IPMIP4_PMIPV4_AUTH_TYPE_METHOD_IPSEC 2
#define IPMIP4_PMIPV4_SUBTYPE_INTERFACE_ID 1
#define IPMIP4_PMIPV4_SUBTYPE_DEVICE_ID 2
# define IPMIP4_PMIPV4_DEVICE_ID_ETH 1
# define IPMIP4_PMIPV4_DEVICE_ID_MEID 2
# define IPMIP4_PMIPV4_DEVICE_ID_IMEI 3
# define IPMIP4_PMIPV4_DEVICE_ID_ESN 4
#define IPMIP4_PMIPV4_SUBTYPE_SUBSCRIBER_ID 3
# define IPMIP4_PMIPV4_SUBSCRIBER_ID_IMSI 1
#define IPMIP4_PMIPV4_SUBTYPE_ACCESS_TYPE 4
# define IPMIP4_PMIPV4_ACCESS_TYPE_802_3 1
# define IPMIP4_PMIPV4_ACCESS_TYPE_802_11ABG 2
# define IPMIP4_PMIPV4_ACCESS_TYPE_802_16E 3
# define IPMIP4_PMIPV4_ACCESS_TYPE_802_16M 4
# define IPMIP4_PMIPV4_ACCESS_TYPE_3GPP_EUTRAN_LTE 5
# define IPMIP4_PMIPV4_ACCESS_TYPE_3GPP_UTRAN_GERAN 6
# define IPMIP4_PMIPV4_ACCESS_TYPE_3GPP2_1XRTT_HRPD 7
# define IPMIP4_PMIPV4_ACCESS_TYPE_3GPP2_UMB 8
#define IPMIP4_NAI_SUBTYPE_HA 1
#define IPMIP4_NAI_SUBTYPE_AAAH 2
#define IPMIP4_EXT_GENERIC_AUTH_SUBTYPE_MN_AAA 1
#define IPMIP4_FA_ERROR_SUBTYPE_0 0
#define IPMIP4_KEYGEN_SUBTYPE_1 1
#define IPMIP4_DYNAMIC_HA_SUBTYPE_REQUESTED 1
#define IPMIP4_DYNAMIC_HA_SUBTYPE_REDIRECTED 2
/* Reg codes: */
#define IPMIP4_CODE_REQ_SIM_BINDINGS 0x80
#define IPMIP4_CODE_REQ_BROADCAST 0x40
#define IPMIP4_CODE_REQ_DECAPSULATION 0x20 /* use co-located address (no foreign agent). */
#define IPMIP4_CODE_REQ_MINIMAL_ENC 0x10
#define IPMIP4_CODE_REQ_GRE_ENC 0x08
#define IPMIP4_CODE_REQ_RESERVED1 0x04
#define IPMIP4_CODE_REQ_REVERSE_TUNNELING 0x02
#define IPMIP4_CODE_REQ_RESERVED0 0x01
#define IPMIP4_MSGEXT_MAX_EXTENSIONS 6
#define IPMIP4_MSGEXT_SHDR_HDR_SIZE 2
#define IPMIP4_MSGEXT_LHDR_HDR_SIZE 4
#define IPMIP4_MSGEXT_UHDR_TYPE(uhdr) (((Ipmip4_msgext_uhdr_t *)uhdr)->shdr.type)
#define IPMIP4_MSGEXT_SHDR_EXT_DATA(uhdr) (((Ip_u8 *)(uhdr)) + IPMIP4_MSGEXT_SHDR_HDR_SIZE)
#define IPMIP4_MSGEXT_SHDR_EXT_SIZE(uhdr) (((Ipmip4_msgext_uhdr_t *)uhdr)->shdr.length)
#define IPMIP4_MSGEXT_SHDR_TOT_SIZE(uhdr) (IPMIP4_MSGEXT_SHDR_EXT_SIZE(uhdr) + IPMIP4_MSGEXT_SHDR_HDR_SIZE)
#define IPMIP4_MSGEXT_LHDR_EXT_DATA(uhdr) (((Ip_u8 *)(uhdr)) + IPMIP4_MSGEXT_LHDR_HDR_SIZE)
#define IPMIP4_MSGEXT_LHDR_EXT_SIZE(uhdr) (IP_GET_NTOHS(&((Ipmip4_msgext_uhdr_t *)uhdr)->lhdr.length))
#define IPMIP4_MSGEXT_LHDR_TOT_SIZE(uhdr) (IPMIP4_MSGEXT_LHDR_EXT_SIZE(uhdr) + IPMIP4_MSGEXT_LHDR_HDR_SIZE)
#define IPMIP4_MSGEXT_LHDR_SUBTYPE(uhdr) (((Ipmip4_msgext_uhdr_t *)uhdr)->lhdr.subtype)
#define IPMIP4_MSGEXT_VSE_HEADER (6)
#define IPMIP4_MSGEXT_NVSE_EXT_DATA(uhdr) (((Ip_u8 *)IPMIP4_MSGEXT_SHDR_EXT_DATA(uhdr)) + IPMIP4_MSGEXT_VSE_HEADER)
#define IPMIP4_MSGEXT_NVSE_EXT_SIZE(uhdr) (IPMIP4_MSGEXT_SHDR_EXT_SIZE(uhdr) - IPMIP4_MSGEXT_VSE_HEADER)
#define IPMIP4_MSGEXT_CVSE_EXT_DATA(uhdr) (((Ip_u8 *)IPMIP4_MSGEXT_LHDR_EXT_DATA(uhdr)) + IPMIP4_MSGEXT_VSE_HEADER)
#define IPMIP4_MSGEXT_CVSE_EXT_SIZE(uhdr) (IPMIP4_MSGEXT_LHDR_EXT_SIZE(uhdr) - IPMIP4_MSGEXT_VSE_HEADER)
#define IPMIP4_MSGEXT_AUTHENTICATED(uhdr, uauth) ((Ip_u8 *)(uhdr) <= (Ip_u8 *)(uauth)? IP_TRUE : IP_FALSE)
/* ICMP types: */
#define IPMIP4_ICMP_AGENT_ADVERTISEMENT 9
#define IPMIP4_ICMP_ROUTER_SOLICITATION 10
/* ICMP codes: */
#define IPMIP4_ICMP_CODE_GENERIC_ROUTER 0
#define IPMIP4_ICMP_CODE_AGENT_ONLY 16
/* ICMP extentions */
#define IPMIP4_ICMP_EXT_TYPE_MOBILITY_AGENT_ADV 16
#define IPMIP4_ICMP_EXT_TYPE_AGENT_ADV_CHALLENGE 24
#define IPMIP4_ICMP_EXT_TYPE_NAI_AGENT 136
#define IPMIP4_ICMP_EXT_TYPE_LLA 140
/* Return codes when parsing Reg extensions */
#define IPMIP4_REG_EXT_UNKNOWN_VSE (1)
#define IPMIP4_REG_EXT_SUCCESS (0)
#define IPMIP4_REG_EXT_POORLY_FORMED (-1)
#define IPMIP4_REG_EXT_FAILED_AUTH (-2)
#define IPMIP4_REG_EXT_DISCARD (-3)
#define IPMIP4_TYPE_REG_NAT_ENCAP 4
/*
****************************************************************************
* 5 TYPES
****************************************************************************
*/
typedef struct Ipmip4_icmp_ext_lla_struct
{
Ip_u8 type; /* IPMIP4_ICMP_EXT_TYPE_LLA */
Ip_u8 length; /* 1 + len(identifier) = 7 in mac case */
Ip_u8 subtype; /* IPMIP4_LLA_SUBTYPE_MAC */
Ip_u8 lla[1];
}
Ipmip4_icmp_lla_ext_t;
#include <ipcom_align16.h>
/*
*===========================================================================
* Foreign agent advertisement (ICMP)
*===========================================================================
*/
typedef struct IP_PACKED1 Ipmip4_icmp_advert
{
Ip_u8 icmp_type; /* 9 = IPMIPFA_ICMP_TYPE_ADV */
Ip_u8 icmp_code; /* 16 = IPMIPFA_ICMP_CODE_AGENT_ONLY
* 0 = IPMIPFA_ICMP_CODE_GENERIC_ROUTER
* Act agent only for mobile nodes,
* no generic routing. */
Ip_u16 icmp_checksum; /* Set to 0 then calc */
Ip_u8 adv_num_addrs; /* [0..] */
Ip_u8 adv_addr_entry_size; /* 2 (anything non-zero) */
Ip_u16 adv_lifetime;
/* Router addresses and preference levels are skipped for mobile agents */
} IP_PACKED2
Ipmip4_icmp_advert_t;
typedef struct IP_PACKED1 Ipmip4_icmp_advrt
{
Ip_u32 address;
Ip_u32 pref_level;
} IP_PACKED2
Ipmip4_icmp_advrt_t;
/*
*===========================================================================
* Foreign agent solicitation (ICMP)
*===========================================================================
*/
typedef struct IP_PACKED1 Ipmip4_icmp_solicit
{
Ip_u8 icmp_type;
Ip_u8 icmp_code;
Ip_u16 icmp_checksum;
Ip_u32 icmp_reserved;
} IP_PACKED2
Ipmip4_icmp_solicit_t;
/*
*===========================================================================
* Ipmip4_icmp_ext_advert
*===========================================================================
* The Mobility Agent Advertisement 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.
*/
typedef struct IP_PACKED1 Ipmip4_icmp_ext_advert
{
Ip_u8 type; /* IPMIPFA_ICMP_EXT_TYPE_MOBILITY_AGENT_ADV */
Ip_u8 length; /* 6 + 4*N (N=number of care-of addresses) */
Ip_u16 seq; /* init to 0 */
Ip_u16 reg_lifetime; /* willing regtime, 0xffff = infinite */
Ip_u16 flags; /* IPMIPFA_ADVEXT_FLAG_xxx */
Ip_u32 coa[1]; /* One or more care-of-addresses */
} IP_PACKED2
Ipmip4_icmp_ext_advert_t;
/* Registration required. Registration with this foreign
agent (or another foreign agent on this link) is required
even when using a co-located care-of address.*/
#define IPMIP4_ICMP_ADVEXT_FLAG_REG_REQUIRED (1 << 15)
/* Busy. The foreign agent will not accept registrations
from additional mobile nodes. */
#define IPMIP4_ICMP_ADVEXT_FLAG_BUSY (1 << 14)
/* Home agent. This agent offers service as a home agent on
the link on which this Agent Advertisement message is
sent.*/
#define IPMIP4_ICMP_ADVEXT_FLAG_HOME_AGENT (1 << 13)
/* Foreign agent. This agent offers service as a foreign
agent on the link on which this Agent Advertisement
message is sent. */
#define IPMIP4_ICMP_ADVEXT_FLAG_FOREIGN_AGENT (1 << 12)
/* Minimal encapsulation. This agent implements receiving
tunneled datagrams that use minimal encapsulation */
#define IPMIP4_ICMP_ADVEXT_FLAG_MINIMAL_ENCAP (1 << 11)
/* GRE encapsulation. This agent implements receiving
tunneled datagrams that use GRE encapsulation */
#define IPMIP4_ICMP_ADVEXT_FLAG_GRE_ENCAP (1 << 10)
/* Sent as zero; ignored on reception. */
#define IPMIP4_ICMP_ADVEXT_FLAG_RESERVED (1 << 9)
/* Foreign agent supports reverse tunneling */
#define IPMIP4_ICMP_ADVEXT_FLAG_REV_TUNNEL (1 << 8)
/* UDP Tunneling supported */
#define IPMIP4_ICMP_ADVEXT_FLAG_UDP_TUNNELING (1 << 7)
/* Registration Revocation */
#define IPMIP4_ICMP_ADVEXT_FLAG_REVOCATION (1 << 6)
/*
*===========================================================================
* Registration request and reply
*===========================================================================
*/
typedef struct IP_PACKED1 Ipmip4_regreq
{
Ip_u8 type;
Ip_u8 code;
Ip_u16 lifetime;
Ip_u32 home_addr;
Ip_u32 home_agent;
Ip_u32 care_of_addr;
Ip_u32 id[2];
} IP_PACKED2
Ipmip4_regreq_t;
#define IPMIP4_TYPE_REG_REQUEST 1
#define IPMIP4_REGREQ_LENGTH 24
typedef struct IP_PACKED1 Ipmip4_regrep
{
Ip_u8 type;
Ip_u8 code;
Ip_u16 lifetime;
Ip_u32 home_addr;
Ip_u32 home_agent;
Ip_u32 id[2];
} IP_PACKED2
Ipmip4_regrep_t;
#define IPMIP4_TYPE_REG_REPLY 3
#define IPMIP4_REGREP_LENGTH 20
typedef struct IP_PACKED1 Ipmip4_hrqst
{
Ip_u8 type;
Ip_u8 flags;
Ip_u16 reserved1;
Ip_u16 lifetime;
Ip_u16 reserved2;
Ip_u32 home_addr;
Ip_u32 home_agent;
Ip_u32 id[2];
} IP_PACKED2
Ipmip4_hrqst_t;
typedef struct IP_PACKED1 Ipmip4_hrply
{
Ip_u8 type;
Ip_u8 flags;
Ip_u8 reserved1;
Ip_u8 code;
Ip_u16 lifetime;
Ip_u16 reserved2;
Ip_u32 home_addr;
Ip_u32 home_agent;
Ip_u32 id[2];
} IP_PACKED2
Ipmip4_hrply_t;
#define IPMIP4_TYPE_REG_HRQST 16
#define IPMIP4_TYPE_REG_HRPLY 17
#define IPMIP4_FLAG_REG_HRQST_L2_ST 0x80
#define IPMIP4_FLAG_REG_HRQST_L2_TT 0x40
#define IPMIP4_FLAG_REG_HRQST_RENEW 0x20
#define IPMIP4_FLAG_REG_HRQST_MINIMAL_ENC 0x10
#define IPMIP4_FLAG_REG_HRQST_GRE_ENC 0x08
#define IPMIP4_FLAG_REG_HRQST_REVERSE_TUNNELING 0x04
#define IPMIP4_FLAG_REG_HRQST_SHOULD_TUNNEL 0x02
#define IPMIP4_FLAG_REG_HRQST_RESERVED0 0x01
#define IPMIP4_FLAG_REG_HRQST_L2_HTT (0x80|0x40)
#define IPMIP4_FLAG_REG_HRQST_L2_ALL (0x80|0x40|0x20)
#define IPMIP4_CODE_REG_HRPLY_SUCCESS 0
#define IPMIP4_CODE_REG_HRPLY_FAILURE 1
#define IPMIP4_TYPE_REG_REGREVREQ 7
#define IPMIP4_REG_EXT_REGREV_FLAG_INFORM (1 << 0)
#define IPMIP4_REG_EXT_REGREV_FLAG_AGENT (1 << 1)
#define IPMIP4_REGREVREQ_LENGTH 20
typedef struct IP_PACKED1 Ipmip4_regrevreq
{
Ip_u8 type;
Ip_u8 reserved;
Ip_u16 flags;
Ip_u32 home_address;
Ip_u32 home_domain;
Ip_u32 foreign_domain;
Ip_u32 identifier;
} IP_PACKED2
Ipmip4_regrevreq_t;
#define IPMIP4_TYPE_REG_REGREVACK 15
#define IPMIP4_REGREVACK_LENGTH 12
typedef struct IP_PACKED1 Ipmip4_regrevack
{
Ip_u8 type;
Ip_u8 reserved;
Ip_u16 flags;
Ip_u32 home_address;
Ip_u32 identifier;
} IP_PACKED2
Ipmip4_regrevack_t;
typedef struct IP_PACKED1 Ipmip4_reg_ext_cvse
{
Ip_u8 type; /* One of the IPMIP4_EXT_TYPE_xxx constants */
Ip_u8 reserved;
Ip_u16 length; /* Length of this CVSE */
Ip_u32 vendor_id; /* Vendor data */
Ip_u16 vendor_type; /* Vendor Type */
Ip_u8 vendor_data[2];
} IP_PACKED2
Ipmip4_reg_ext_cvse_t;
typedef struct IP_PACKED1 Ipmip4_reg_ext_nvse
{
Ip_u8 type; /* One of the IPMIP4_EXT_TYPE_xxx constants */
Ip_u8 length; /* Length of this NVSE */
Ip_u16 reserved; /* Reserved */
Ip_u32 vendor_id; /* Vendor identifier */
Ip_u16 vendor_type; /* Vendor Type */
Ip_u8 vendor_data[2];
} IP_PACKED2
Ipmip4_reg_ext_nvse_t;
/**/
#define IPMIP4_REG_EXT_UDP_FLAG_FORCED 0x80
#define IPMIP4_REG_EXT_UDP_FLAG_REGREQ 0x40
typedef struct IP_PACKED1 Ipmip4_reg_ext_udp_tunnel_req
{
Ip_u8 type; /* One of the IPMIP4_EXT_TYPE_xxx constants */
Ip_u8 length;
Ip_u8 sub_type; /* Sub type */
Ip_u8 __reserved1[1];
Ip_u8 flags; /* Flags */
Ip_u8 encap; /* Encapsulation */
Ip_u8 __reserved2[2];
} IP_PACKED2
Ipmip4_reg_ext_udp_tunnel_req_t;
typedef struct IP_PACKED1 Ipmip4_reg_ext_udp_tunnel_rep
{
Ip_u8 type; /* One of the IPMIP4_EXT_TYPE_xxx constants */
Ip_u8 length;
Ip_u8 sub_type; /* Sub type */
Ip_u8 code; /* Reply code */
Ip_u8 flags; /* Flags */
Ip_u8 __reserved1[1]; /* */
Ip_u16 keep_alive; /* Keep alive */
} IP_PACKED2
Ipmip4_reg_ext_udp_tunnel_rep_t;
#define IPMIP4_REG_EXT_REVOCATION_INFORM 0x01
typedef struct IP_PACKED1 Ipmip4_reg_ext_revocation
{
Ip_u8 type; /* One of the IPMIP4_EXT_TYPE_xxx constants */
Ip_u8 length;
Ip_u16 flags;
Ip_u32 timestamp;
} IP_PACKED2
Ipmip4_reg_ext_revocation_t;
/*
*===========================================================================
* Auth extension (sub-type of reg_ext)
*===========================================================================
*/
#define IPMIP4_EXT_AUTHHDR_LENGTH 6
#define IPMIP4_EXT_AUTH_LENGTH 22
typedef struct IP_PACKED1 Ipmip4_ext_auth
{
Ip_u8 type; /* 32=mn-ha, 33=mn-fa, 34=fa-ha */
Ip_u8 length; /* 4+16 (spi+authenticator) */
Ip_u8 spi[4]; /* use IP_SET_HTONL IP_GET_NTOHL with this one */
Ip_u8 authenticator[16]; /* MD5 */
/* size sum 22 */
} IP_PACKED2
Ipmip4_ext_auth_t;
#define IPMIP4_EXT_GENAUTHHDR_LENGTH 8
#define IPMIP4_EXT_GENAUTH_LENGTH 24
typedef struct IP_PACKED1 Ipmip4_ext_gen_auth
{
Ip_u8 type; /* 32=mn-ha, 33=mn-fa, 34=fa-ha */
Ip_u8 subtype; /* 32=mn-ha, 33=mn-fa, 34=fa-ha */
Ip_u16 length; /* 4+16 (spi+authenticator) */
Ip_u8 spi[4]; /* use IP_SET_HTONL IP_GET_NTOHL with this one */
Ip_u8 authenticator[16]; /* MD5 */
/* size sum 22 */
} IP_PACKED2
Ipmip4_ext_gen_auth_t;
typedef struct IP_PACKED1 Ipmip4_ext_keyreq
{
Ip_u8 type; /* 32=mn-ha, 33=mn-fa, 34=fa-ha */
Ip_u8 subtype; /* 32=mn-ha, 33=mn-fa, 34=fa-ha */
Ip_u16 length; /* 4+16 (spi+authenticator) */
Ip_u8 spi[4]; /* use IP_SET_HTONL IP_GET_NTOHL with this one */
} IP_PACKED2
Ipmip4_ext_keyreq_t;
#define IPMIP4_EXT_KEYREP_HA_LENGTH 20
typedef struct IP_PACKED1 Ipmip4_ext_keyrep_ha
{
Ip_u8 type; /* 32=mn-ha, 33=mn-fa, 34=fa-ha */
Ip_u8 subtype; /* 32=mn-ha, 33=mn-fa, 34=fa-ha */
Ip_u16 length; /* 4+16 (spi+authenticator) */
Ip_u32 lifetime;
Ip_u32 aaa_spi;
Ip_u32 spi;
Ip_u16 alg_id;
Ip_u16 replay;
Ip_u8 nonce[4];
} IP_PACKED2
Ipmip4_ext_keyrep_ha_t;
#define IPMIP4_EXT_KEYREP_FA_LENGTH 18
typedef struct IP_PACKED1 Ipmip4_ext_keyrep_fa
{
Ip_u8 type; /* 32=mn-ha, 33=mn-fa, 34=fa-ha */
Ip_u8 subtype; /* 32=mn-ha, 33=mn-fa, 34=fa-ha */
Ip_u16 length; /* 4+16 (spi+authenticator) */
Ip_u32 lifetime;
Ip_u32 aaa_spi;
Ip_u32 spi;
Ip_u16 alg_id;
Ip_u8 nonce[2];
} IP_PACKED2
Ipmip4_ext_keyrep_fa_t;
/*
*===========================================================================
* NEMO extension (sub-type of reg_ext)
*===========================================================================
*/
typedef struct IP_PACKED1 Ipmip4_reg_ext_mobnet_req
{
Ip_u8 type; /* One of the IPMIP4_EXT_TYPE_xxx constants */
Ip_u8 length;
Ip_u8 sub_type; /* Sub type */
Ip_u8 prefix_len; /* Reply code */
Ip_u32 prefix; /* Prefix */
} IP_PACKED2
Ipmip4_reg_ext_mobnet_req_t;
typedef struct IP_PACKED1 Ipmip4_reg_ext_mobnet_rep
{
Ip_u8 type; /* One of the IPMIP4_EXT_TYPE_xxx constants */
Ip_u8 length;
Ip_u8 sub_type; /* Sub type */
Ip_u8 code; /* Sub type */
Ip_u8 prefix_len; /* Reply code */
Ip_u8 reserved; /* Reply code */
Ip_u8 prefix[4]; /* Prefix */
} IP_PACKED2
Ipmip4_reg_ext_mobnet_rep_t;
/*
*===========================================================================
* Ipmip4_msgext_shdr
*===========================================================================
*/
typedef struct IP_PACKED1 Ipmip4_msgext_shdr
{
Ip_u8 type;
Ip_u8 length;
} IP_PACKED2
Ipmip4_msgext_shdr_t;
/*
*===========================================================================
* Ipmip4_msgext_lhdr
*===========================================================================
*/
typedef struct IP_PACKED1 Ipmip4_msgext_lhdr
{
Ip_u8 type;
Ip_u8 subtype;
Ip_u16 length;
} IP_PACKED2
Ipmip4_msgext_lhdr_t;
typedef struct IP_PACKED1 Ipmip4_nvse
{
Ip_u8 __reserved[2];
Ip_u8 vendor_id[4]; /* ID in network byte order */
Ip_u8 vendor_type[2]; /* Type in network byte order */
Ip_u8 vendor_data[4]; /* May be larger, set to this size for align purposes */
} IP_PACKED2
Ipmip4_nvse_t;
typedef struct IP_PACKED1 Ipmip4_cvse
{
Ip_u8 vendor_id[4]; /* ID in network byte order */
Ip_u8 vendor_type[2]; /* Type in network byte order */
Ip_u8 vendor_data[2]; /* May be larger, set to this size for align purposes */
} IP_PACKED2
Ipmip4_cvse_t;
typedef struct IP_PACKED1 Ipmip4_pmipv4_per_node_auth_method
{
Ip_u8 type;
Ip_u8 subtype;
Ip_u16 length;
Ip_u8 method;
} IP_PACKED2
Ipmip4_pmipv4_per_node_auth_method_t;
typedef struct IP_PACKED1 Ipmip4_pmipv4_access_type
{
Ip_u8 type;
Ip_u8 length;
Ip_u8 sub_type;
Ip_u8 tech_type;
} IP_PACKED2
Ipmip4_pmipv4_access_type_t;
typedef struct IP_PACKED1 Ipmip4_pmipv4_interface_id
{
Ip_u8 type;
Ip_u8 length;
Ip_u8 sub_type;
Ip_u8 identifier[1];
} IP_PACKED2
Ipmip4_pmipv4_interface_id_t;
typedef struct IP_PACKED1 Ipmip4_pmipv4_device_id
{
Ip_u8 type;
Ip_u8 length;
Ip_u8 sub_type;
Ip_u8 id_type;
Ip_u8 identifier[4]; /* May be larger, set to this size for align purposes */
} IP_PACKED2
Ipmip4_pmipv4_device_id_t;
typedef struct IP_PACKED1 Ipmip4_pmipv4_subscriber_id
{
Ip_u8 type;
Ip_u8 length;
Ip_u8 sub_type;
Ip_u8 id_type;
Ip_u8 identifier[4]; /* May be larger, set to this size for align purposes */
} IP_PACKED2
Ipmip4_pmipv4_subscriber_id_t;
#include <ipcom_align16.h>
struct Ipmip4_context;
struct Ipmip_proc;
struct Ipmip4_pktbuf;
typedef union Ipmip4_msgext_uhdr
{
Ipmip4_msgext_lhdr_t lhdr;
Ipmip4_msgext_shdr_t shdr;
} Ipmip4_msgext_uhdr_t;
typedef struct Ipmip4_msgext_array
{
int found;
Ipmip4_msgext_uhdr_t *ext[IPMIP4_MSGEXT_MAX_EXTENSIONS];
}
Ipmip4_msgext_array_t;
typedef struct Ipmip4_msgext_mobile
{
int result;
Ipmip4_msgext_uhdr_t *erronous;
/* LLAS */
Ipmip4_msgext_array_t lla;
/* MOBNET requests */
Ipmip4_msgext_array_t mobnet;
/* Authentication Extensions */
Ipmip4_msgext_uhdr_t *mobile_home;
Ipmip4_msgext_uhdr_t *mobile_foreign;
Ipmip4_msgext_uhdr_t *foreign_foreign;
Ipmip4_msgext_uhdr_t *foreign_home;
Ipmip4_msgext_uhdr_t *mn_aaa;
Ipmip4_msgext_uhdr_t *mn_fa_keyreq;
Ipmip4_msgext_uhdr_t *mn_fa_keyrep;
Ipmip4_msgext_uhdr_t *mn_ha_keyreq;
Ipmip4_msgext_uhdr_t *mn_ha_keyrep;
/* Various extensions */
Ipmip4_msgext_uhdr_t *revocation;
Ipmip4_msgext_uhdr_t *challenge;
Ipmip4_msgext_uhdr_t *nai_agent_ha;
Ipmip4_msgext_uhdr_t *nai_agent_aaah;
Ipmip4_msgext_uhdr_t *nai_mobile;
Ipmip4_msgext_uhdr_t *udp_tunnel_rep;
Ipmip4_msgext_uhdr_t *udp_tunnel_req;
Ipmip4_msgext_uhdr_t *fa_error;
Ipmip4_msgext_uhdr_t *dynamic_ha_request;
Ipmip4_msgext_uhdr_t *dynamic_ha_redirect;
/* Proxy MIPv4 Extensions */
Ip_u8 pmipv4_extensions;
Ipmip4_msgext_uhdr_t *pmipv4_node_auth_method;
Ipmip4_msgext_uhdr_t *pmipv4_interface_id;
Ipmip4_msgext_uhdr_t *pmipv4_device_id;
Ipmip4_msgext_uhdr_t *pmipv4_subscriber_id;
Ipmip4_msgext_uhdr_t *pmipv4_access_type;
Ipmip4_vendor_ext_msgext_t vendor;
} Ipmip4_msgext_mobile_t;
typedef int (*Ipmip4_msgext_parse_ext_t) (struct Ipmip4_context *ctx, struct Ipmip_proc *proc, struct Ipmip4_pktbuf *pbuf, Ipmip4_msgext_uhdr_t *uhdr, void *extdata);
typedef int (*Ipmip4_msgext_parse_t) (Ipmip4_msgext_mobile_t *mobile, Ipmip4_msgext_uhdr_t *uhdr);
typedef int (*Ipmip4_msgext_vendor_callback_t) (Ipmip4_msgext_mobile_t *mobile, void *mdata, int req);
typedef struct Ipmip4_msgext_vendor_parse
{
Ipcom_list next;
Ip_u32 vendor_id;
Ipmip4_msgext_parse_t parse;
Ipmip4_msgext_vendor_callback_t callback;
} Ipmip4_msgext_vendor_parse_t;
typedef struct Ipmip4_msgext_vendor_parse_ext
{
Ipcom_list next;
Ip_u32 vendor_id;
Ipmip_pktbuf_payload_t pktaux;
Ipmip4_msgext_parse_ext_t parse;
} Ipmip4_msgext_vendor_parse_ext_t;
typedef struct Ipmip4_msgext_parse_config
{
Ipcom_list vendor;
} Ipmip4_msgext_parse_config_t;
typedef struct Ipmip4_msgext_icmp
{
/* LLAS */
Ipmip4_msgext_array_t lla;
/* Various extensions */
Ipmip4_msgext_uhdr_t *challenge;
Ipmip4_msgext_uhdr_t *agent;
Ipmip4_msgext_uhdr_t *nai_agent_ha;
Ipmip4_msgext_uhdr_t *nai_agent_aaah;
} Ipmip4_msgext_icmp_t;
/*
****************************************************************************
* 6 FUNCTIONS
****************************************************************************
*/
/*******************************************************************************
*
* ipmip4_msgext_mobile_find - ipmip4_msgext_mobile_find
*
* Locate an extension in an 'extension buffer'.
*
* Parameters:
* \is
* \i extensions
* The extension.
* \i length
* The length of extensions.
* \i types
* The extension(s) we're looking for
* \i type_size
* Number of types.
* \i hdr
* The extension header
* \i hdr_size
* The size of the extension header
* \ie
*
* RETURNS: The total size of the extension.
*
* ERRNO:
*
* NOMANUAL
*/
IP_GLOBAL Ip_ssize_t ipmip4_msgext_mobile_find
(
Ip_u8 *extensions,
Ip_ssize_t length,
Ip_u8 *types,
Ip_u8 type_size,
Ip_u8 **hdr,
Ip_u8 *hdr_size
);
/*******************************************************************************
*
* ipmip4_msgext_icmp_find - ipmip4_msgext_icmp_find
*
* Locate an extension in an 'extension buffer'.
*
* Parameters:
* \is
* \i extensions
* The extension.
* \i length
* The length of extensions.
* \i types
* The extension(s) we're looking for
* \i type_size
* Number of types.
* \i hdr
* The extension header
* \i hdr_size
* The size of the extension header
* \ie
*
* RETURNS: The total size of the extension.
*
* ERRNO:
*
* NOMANUAL
*/
IP_GLOBAL Ip_ssize_t ipmip4_msgext_icmp_find
(
Ip_u8 *extensions,
Ip_ssize_t length,
Ip_u8 *types,
Ip_u8 type_size,
Ip_u8 **hdr,
Ip_u8 *hdr_size
);
/*******************************************************************************
*
* ipmip4_msgext_mobile_parse_ext - ipmip4_msgext_mobile_parse_ext
*
* Parse a mobile message and extract and do basic verification
* on the extensions.
*
* Parameters:
* \is
* \i ctx
* The generic mobility singleton context for IPMIP4. For each started mobility
* entity, there exists a mobility context which tracks configuration, system
* events, available features and started processes. The mobility context is
* created using ipmip4_context_create(). See ipmip4_context.h for
* more information regarding the mobility entity context singleton.
* \i proc
* The process context associated with the currently executing thread. Each
* thread and/or process in MIP must have its own unique process context.
* If a process is started using ipmip_proc_start, the process context will
* be allocated automatically by the IPMIP framework. Otherwise it must
* be allocated using ipmip_proc_alloc().
* \i pbuf
* Packet buffer
* \i offset
* Offset to start parsing
* \ie
*
* RETURNS: IPMIP4_REG_EXT_SUCCESS on success.
*
* ERRNO:
*
* NOMANUAL
*/
IP_GLOBAL int ipmip4_msgext_mobile_parse_ext
(
struct Ipmip4_context *ctx,
struct Ipmip_proc *proc,
struct Ipmip4_pktbuf *pbuf,
Ip_size_t offset
);
/*******************************************************************************
*
* ipmip4_msgext_icmp_parse - ipmip4_msgext_icmp_parse
*
* Parse an icmp message and extract and do basic verification
* on the extensions.
*
* Parameters:
* \is
* \i proc
* The process context associated with the currently executing thread. Each
* thread and/or process in MIP must have its own unique process context.
* If a process is started using ipmip_proc_start, the process context will
* be allocated automatically by the IPMIP framework. Otherwise it must
* be allocated using ipmip_proc_alloc().
* \i ifname
* Name of arriving interface
* \i from
* The source address.
* \i msgext
* The icmp msg extension object.
* \i ext_ptr
* Pointer to the extension block
* \i ext_size
* Size of the extension block.
* \ie
*
* RETURNS: IPMIP4_REG_EXT_SUCCESS on success.
*
* ERRNO:
*
* NOMANUAL
*/
IP_GLOBAL int ipmip4_msgext_icmp_parse
(
struct Ipmip_proc *proc,
char *ifname,
Ip_u32 from,
Ipmip4_msgext_icmp_t *msgext,
Ip_u8 *ext_ptr,
Ip_ssize_t ext_size
);
/*******************************************************************************
*
* ipmip4_msgext_shdr_equal - ipmip4_msgext_shdr_equal
*
* Compare two shdrs and see if they're equal.
*
* Parameters:
* \is
* \i hdr1
* First header.
* \i hdr2
* Second header
* \ie
*
* RETURNS: IP_TRUE if equal, IP_FALSE otherwise.
*
* ERRNO:
*
*/
IP_GLOBAL Ip_bool ipmip4_msgext_shdr_equal
(
Ipmip4_msgext_uhdr_t *hdr1,
Ipmip4_msgext_uhdr_t *hdr2
);
/*******************************************************************************
*
* ipmip4_msgext_lhdr_equal - ipmip4_msgext_lhdr_equal
*
* Compare two lhdrs and see if they're equal.
*
* Parameters:
* \is
* \i hdr1
* First header.
* \i hdr2
* Second header
* \ie
*
* RETURNS: IP_TRUE if equal, IP_FALSE otherwise.
*
* ERRNO:
*
*/
IP_GLOBAL Ip_bool ipmip4_msgext_lhdr_equal
(
Ipmip4_msgext_uhdr_t *hdr1,
Ipmip4_msgext_uhdr_t *hdr2
);
/*******************************************************************************
*
* ipmip4_msgext_shdr_dup - ipmip4_msgext_shdr_dup
*
* Duplicate a shdr
*
* Parameters:
* \is
* \i hdr
* hdr to duplicate
* \ie
*
* RETURNS: A newly allocated duplicate, or IP_NULL if it fails.
*
* ERRNO:
*
*/
IP_GLOBAL Ipmip4_msgext_uhdr_t * ipmip4_msgext_shdr_dup
(
Ipmip4_msgext_uhdr_t *hdr
);
/*******************************************************************************
*
* ipmip4_msgext_lhdr_dup - ipmip4_msgext_lhdr_dup
*
* Duplicate a lhdr
*
* Parameters:
* \is
* \i hdr
* hdr to duplicate
* \ie
*
* RETURNS: A newly allocated duplicate, or IP_NULL if it fails.
*
* ERRNO:
*
*/
IP_GLOBAL Ipmip4_msgext_uhdr_t * ipmip4_msgext_lhdr_dup
(
Ipmip4_msgext_uhdr_t *hdr
);
/*******************************************************************************
*
* ipmip4_msgext_errmsg - ipmip4_msgext_errmsg
*
* Returns the human readable representation of an error
* code.
*
* Parameters:
* \is
* \i errcode
* The error code
* \ie
*
* RETURNS: A const char array with the appropriate error message text.
*
* ERRNO:
*
*/
IP_GLOBAL const char * ipmip4_msgext_errmsg
(
int errcode
);
/*******************************************************************************
*
* ipmip4_msgext_buffer_append_lhdr - ipmip4_msgext_buffer_append_lhdr
*
* Append an LHDR to a buffer pointer.
*
* Parameters:
* \is
* \i buf
* A pointer to an initialized dynamic mobility buffer. See ipmip_buffer.h
* for more information regarding dynamic buffers and their capabilities.
* \i uhdr
* The LHDR
* \ie
*
* RETURNS: The offset to the stored data if successful, -1 otherwise.
*
* ERRNO:
*
*/
IP_GLOBAL int ipmip4_msgext_buffer_append_lhdr
(
Ipmip_buffer_t *buf,
Ipmip4_msgext_uhdr_t *uhdr
);
/*******************************************************************************
*
* ipmip4_msgext_buffer_append_shdr - ipmip4_msgext_buffer_append_shdr
*
* Append an SHDR to a buffer pointer.
*
* Parameters:
* \is
* \i buf
* A pointer to an initialized dynamic mobility buffer. See ipmip_buffer.h
* for more information regarding dynamic buffers and their capabilities.
* \i uhdr
* The SHDR
* \ie
*
* RETURNS: The offset to the stored data if successful, -1 otherwise.
*
* ERRNO:
*
*/
IP_GLOBAL int ipmip4_msgext_buffer_append_shdr
(
Ipmip_buffer_t *buf,
Ipmip4_msgext_uhdr_t *uhdr
);
/*******************************************************************************
*
* ipmip4_msgext_buffer_create_shdr - ipmip4_msgext_buffer_create_shdr
*
* Create a SHDR
*
* Parameters:
* \is
* \i buf
* A pointer to an initialized dynamic mobility buffer. See ipmip_buffer.h
* for more information regarding dynamic buffers and their capabilities.
* \i type
* The SHDR type
* \i nelem
* Number of elements to concatenate
* \i ...
* nelem data, size pairs.
* \ie
*
* RETURNS: No return value
*
* ERRNO:
*
*/
IP_GLOBAL void ipmip4_msgext_buffer_create_shdr
(
Ipmip_buffer_t *buf,
Ip_u32 type,
Ip_size_t nelem,
...
);
/*******************************************************************************
*
* ipmip4_msgext_vendor_parse_ext_register - ipmip4_msgext_vendor_parse_ext_register
*
* Register a vendor extension parse structure
*
* Parameters:
* \is
* \i pext
* Vendor registration extension
* \i nelem
* Number of elements to concatenate
* \i ...
* nelem data, size pairs.
* \ie
*
* RETURNS: No return value
*
* ERRNO:
*
*/
IP_GLOBAL void ipmip4_msgext_vendor_parse_ext_register
(
Ipcom_list *vendor_list,
struct Ipmip_pktbuf_pktaux *pktaux,
Ipmip4_msgext_vendor_parse_ext_t *pext
);
/*******************************************************************************
*
* ipmip4_msgext_mobile_copy - ipmip4_msgext_mobile_copy
*
* Copy all MSGEXT and buffer information from src to dst. The values
* and data in src will be freed once this call has been completed. The
* same goes for all values that existed in dst prior to this call.
*
* Parameters:
* \is
* \i ctx
* The generic mobility singleton context for IPMIP4. For each started mobility
* entity, there exists a mobility context which tracks configuration, system
* events, available features and started processes. The mobility context is
* created using ipmip4_context_create(). See ipmip4_context.h for
* more information regarding the mobility entity context singleton.
* \i pbuf_dst
* Destination
* \i pbuf_src
* Source
* \ie
*
* RETURNS: No return value
*
* ERRNO:
*
* NOMANUAL
*/
IP_GLOBAL void ipmip4_msgext_mobile_copy
(
struct Ipmip4_context *ctx,
struct Ipmip4_pktbuf *pbuf_dst,
struct Ipmip4_pktbuf *pbuf_src
);
/*******************************************************************************
*
* ipmip4_msgext_nai_mn - ipmip4_msgext_nai_mn
*
* Create a NAI_MN based on the nai that has been provided in this function.
* If naibuf is IP_NULL, data will be dynamically allocated to create it,
* otherwise it will be assumed that naibuf is large enough to hold the
* NAI_MN
*
* Parameters:
* \is
* \i naibuf
* Buffer to create the NAI in, or IP_NULL if it is to be created dynamically
* \i nai
* The NAI to use
* \i nai_len
* The length of the NAI
* \ie
*
* RETURNS: The newly created NAI_MN.
*
* ERRNO:
*
*/
IP_GLOBAL Ipmip4_msgext_shdr_t *ipmip4_msgext_nai_mn
(
void *naibuf,
const char *nai,
Ip_size_t nai_len
);
/*******************************************************************************
*
* ipmip4_msgext_nai_mn_dup - ipmip4_msgext_nai_mn_dup
*
* Duplicate a NAI_MN. The copy is stored in dynamically allocated memory.
*
* Parameters:
* \is
* \i nai
* The nai to duplicate
* \ie
*
* RETURNS: The newly created NAI_MN.
*
* ERRNO:
*
* NOMANUAL
*/
IP_GLOBAL Ipmip4_msgext_shdr_t *ipmip4_msgext_nai_mn_dup
(
Ipmip4_msgext_shdr_t *nai
);
/*******************************************************************************
*
* ipmip4_msgext_pmipv4_per_node_auth_method - ipmip4_msgext_pmipv4_per_node_auth_method
*
* Create a PMIPv4 per node auth mobility extension based on the method provided.
* The extension will be created in dynamically allocated memory.
*
* Parameters:
* \is
* \i method
* The authentication method
* \ie
*
* RETURNS: The newly created extension
*
* ERRNO:
*
* NOMANUAL
*/
IP_GLOBAL Ipmip4_msgext_lhdr_t *ipmip4_msgext_pmipv4_per_node_auth_method
(
Ip_u8 method
);
/*******************************************************************************
*
* ipmip4_msgext_pmipv4_access_type - ipmip4_msgext_pmipv4_access_type
*
* Create a PMIPv4 access type mobility extension based on the access type provided.
* The extension will be created in dynamically allocated memory.
*
* Parameters:
* \is
* \i access_type
* The access type
* \ie
*
* RETURNS: The newly created extension
*
* ERRNO:
*
* NOMANUAL
*/
IP_GLOBAL Ipmip4_msgext_shdr_t *ipmip4_msgext_pmipv4_access_type
(
Ip_u8 access_type
);
/*******************************************************************************
*
* ipmip4_msgext_pmipv4_device_id - ipmip4_msgext_pmipv4_device_id
*
* Create a PMIPv4 device id mobility extension based on the access type provided.
* The extension will be created in dynamically allocated memory.
*
* Parameters:
* \is
* \i device_id
* The device identifier
* \i device_data
* The device identifier data
* \i device_data_len
* The length of device data
* \ie
*
* RETURNS: The newly created extension
*
* ERRNO:
*
* NOMANUAL
*/
IP_GLOBAL Ipmip4_msgext_shdr_t *ipmip4_msgext_pmipv4_device_id
(
Ip_u8 device_id,
void *device_data,
Ip_size_t device_data_len
);
/*******************************************************************************
*
* ipmip4_msgext_pmipv4_interface_id - ipmip4_msgext_pmipv4_interface_id
*
* Create a PMIPv4 interface id mobility extension based on the access type provided.
* The extension will be created in dynamically allocated memory.
*
* Parameters:
* \is
* \i if_data
* The interface identifier data
* \i if_data_len
* The length of interface identifier data
* \ie
*
* RETURNS: The newly created extension
*
* ERRNO:
*
* NOMANUAL
*/
IP_GLOBAL Ipmip4_msgext_shdr_t *ipmip4_msgext_pmipv4_interface_id
(
void *if_data,
Ip_size_t if_data_len
);
/*******************************************************************************
*
* ipmip4_msgext_pmipv4_subscriber_id - ipmip4_msgext_pmipv4_subscriber_id
*
* Create a PMIPv4 subscriber id mobility extension based on the access type provided.
* The extension will be created in dynamically allocated memory.
*
* Parameters:
* \is
* \i sub_id
* The subscriber identifier
* \i sub_data
* The subscriber identifier data
* \i sub_data_len
* The length of subscriber data
* \ie
*
* RETURNS: The newly created extension
*
* ERRNO:
*
* NOMANUAL
*/
IP_GLOBAL Ipmip4_msgext_shdr_t *ipmip4_msgext_pmipv4_subscriber_id
(
Ip_u8 sub_id,
void *sub_data,
Ip_size_t sub_data_len
);
#ifdef __cplusplus
}
#endif
#endif
/*
****************************************************************************
* END OF FILE
****************************************************************************
*/