1522 lines
33 KiB
C
1522 lines
33 KiB
C
/* ipmip_attr.h - ipmip_attr.h */
|
|
/*
|
|
******************************************************************************
|
|
* HEADER FILE
|
|
*
|
|
* Document no: @(#) $Name: VXWORKS_ITER40_2019102207 $ $RCSfile: ipmip_attr.h,v $ $Revision: 1.11 $
|
|
* $Source: /home/interpeak/CVSRoot/ipmip/include/private/ipmip_attr.h,v $
|
|
* $Author: jhorteli $ $Date: 2011-01-21 15:31:28 $
|
|
* $State: Exp $ $Locker: $
|
|
*
|
|
* INTERPEAK_COPYRIGHT_STRING
|
|
* Design and implementation by Joel Hortelius <joel.hortelius@interpeak.se>
|
|
******************************************************************************
|
|
*/
|
|
#ifndef IPMIP_ATTR_H
|
|
#define IPMIP_ATTR_H
|
|
|
|
/*
|
|
****************************************************************************
|
|
* 1 DESCRIPTION
|
|
****************************************************************************
|
|
*/
|
|
|
|
/*
|
|
DESCRIPTION
|
|
|
|
MIP attribute functions required for mobile ip. Deals with retrieval
|
|
and assignment of MIP attributes. MIP Attributes are mainly used when
|
|
communicating with a MIP instance, either between MIP instances or for
|
|
example when retrieving connectivity, statistics or other information from
|
|
a currently active entity.
|
|
|
|
EXAMPLE
|
|
|
|
A basic example of how the attribute functions can be used in a command
|
|
line interface command hook. See the examples in ipmip_context.h for
|
|
'example' type definitions.
|
|
|
|
.CS
|
|
|
|
/@ Define some attributes that the node have @/
|
|
|
|
enum
|
|
{
|
|
IPMIP_MY_NODE_NONE,
|
|
IPMIP_MY_NODE_INFO
|
|
};
|
|
|
|
enum
|
|
{
|
|
IPMIP_MY_NODE_ATTR_NONE,
|
|
IPMIP_MY_NODE_ATTR_NAME,
|
|
IPMIP_MY_NODE_ATTR_IDENTITY,
|
|
IPMIP_MY_NODE_ATTR_MAX
|
|
};
|
|
|
|
Ip_u32 dump_node_to_buffer(struct Ipmip_my_entities *node,
|
|
Ipmip_buffer_t *buffer)
|
|
{
|
|
Ip_u32 rta;
|
|
|
|
/@ We will store all information related to this node within another
|
|
attribute. Nesting attributes like this allows you to store information
|
|
regarding multiple nodes in one buffer. Each IPMIP_MY_NODE_INFO contains
|
|
the information of one node @/
|
|
|
|
rta = ipmip_attr_begin(buffer, IPMIP_MY_NODE_INFO);
|
|
|
|
/@ Store the nodes name @/
|
|
ipmip_attr_put_str(buffer,
|
|
IPMIP_MY_NODE_ATTR_NAME,
|
|
node->name);
|
|
|
|
/@ Store the nodes identity @/
|
|
ipmip_attr_put_u32(buffer,
|
|
IPMIP_MY_NODE_ATTR_IDENTITY,
|
|
node->identity);
|
|
|
|
/@ End this attribute. @/
|
|
ipmip_attr_end(buffer, rta);
|
|
|
|
/@ Return the offset of the IPMIP_MY_NODE_INFO @/
|
|
return rta;
|
|
}
|
|
|
|
/@ Print all known information regarding the node provided by the
|
|
node_info @/
|
|
void get_and_print_node_info(Ipmip_attr_t *node_info)
|
|
{
|
|
ipcom_printf("NAME: %s IDENTITY: %d",
|
|
ipmip_attr_payload_find_str(node_info, IPMIP_MY_NODE_ATTR_NAME)):
|
|
ipmip_attr_payload_find_u32(node_info, IPMIP_MY_NODE_ATTR_IDENTITY)):
|
|
|
|
}
|
|
|
|
/@ This is the entry function taking a 'node' as argument @/
|
|
void node_attr_func(struct Ipmip_my_entities *node)
|
|
{
|
|
Ipmip_buffer_t mybuf;
|
|
Ip_u32 rta;
|
|
|
|
/@ Initialize the buffer @/
|
|
ipmip_buffer_init(&mybuf);
|
|
|
|
/@ Dump the information in the node to attribute form in the buffer @/
|
|
rta = dump_node_to_buffer(node, &mybuf);
|
|
|
|
/@ Print the information in the buffer. Send the IPMIP_MY_NODE_INFO
|
|
attribute to the dump function @/
|
|
get_and_print_node_info((Ipmip_attr_t *)ipmip_buffer_offset(buffer, rta));
|
|
|
|
/@ Free the resources associated with the buffer @/
|
|
ipmip_buffer_release(&mybuf);
|
|
}
|
|
|
|
.CE
|
|
|
|
*/
|
|
|
|
/*
|
|
****************************************************************************
|
|
* 2 CONFIGURATION
|
|
****************************************************************************
|
|
*/
|
|
|
|
/*
|
|
****************************************************************************
|
|
* 3 INCLUDE FILES
|
|
****************************************************************************
|
|
*/
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/*
|
|
****************************************************************************
|
|
* 4 DEFINES
|
|
****************************************************************************
|
|
*/
|
|
|
|
#define IPMIP_ATTR_HEADER_ACK (1 << 0)
|
|
|
|
#define IPMIP_ATTR_LENGTH(len) ((len) + sizeof(struct Ipmip_attr))
|
|
#define IPMIP_ATTR_DATA(attr) ((void*)(((char*)(attr)) + IPMIP_ATTR_LENGTH(0)))
|
|
|
|
#define IPMIP_ATTR_OK(attr,len) (((signed)(len)) >= ((signed)IPMIP_ATTR_LENGTH(0)) && IPMIP_ATTR_SIZE(attr) >= IPMIP_ATTR_LENGTH(0) && IPMIP_ATTR_SIZE(attr) <= (len))
|
|
|
|
#define IPMIP_ATTR_SIZE(attr) IP_GET_NTOHS(&(attr)->attr_len)
|
|
#define IPMIP_ATTR_TYPE(attr) IP_GET_NTOHS(&(attr)->attr_type)
|
|
#define IPMIP_ATTR_PAYLOAD(attr) (IPMIP_ATTR_SIZE(attr) - IPMIP_ATTR_LENGTH(0))
|
|
#define IPMIP_ATTR_NEXT(attr,attrlen) ((attrlen) -= IPMIP_ATTR_SIZE(attr), (struct Ipmip_attr*)(((char*)(attr)) + IPMIP_ATTR_SIZE(attr)))
|
|
|
|
#define IPMIP_ATTR_HDR_LENGTH(len) ((len) + sizeof(struct Ipmip_attr_header))
|
|
#define IPMIP_ATTR_HDR_DATA(ahdr) ((void*)(((char*)ahdr) + IPMIP_ATTR_HDR_LENGTH(0)))
|
|
#define IPMIP_ATTR_HDR_SIZE(ahdr) IP_GET_NTOHL(&(ahdr)->ah_len)
|
|
#define IPMIP_ATTR_HDR_SYSTEM(ahdr) IP_GET_NTOHL(&(ahdr)->ah_subsystem)
|
|
#define IPMIP_ATTR_HDR_ERROR(ahdr) IP_GET_NTOHL(&(ahdr)->ah_errcode)
|
|
#define IPMIP_ATTR_HDR_TYPE(ahdr) IP_GET_NTOHS(&(ahdr)->ah_type)
|
|
#define IPMIP_ATTR_HDR_FLAGS(ahdr) IP_GET_NTOHS(&(ahdr)->ah_flags)
|
|
#define IPMIP_ATTR_HDR_SEQUENCE(ahdr) IP_GET_32ON8(&(ahdr)->ah_sequence)
|
|
#define IPMIP_ATTR_HDR_PAYLOAD(ahdr) (IPMIP_ATTR_HDR_SIZE(ahdr) - IPMIP_ATTR_HDR_LENGTH(0))
|
|
#define IPMIP_ATTR_HDR_OK(ahdr, len) ((len) >= IPMIP_ATTR_HDR_LENGTH(0) && IPMIP_ATTR_HDR_SIZE(ahdr) >= IPMIP_ATTR_HDR_LENGTH(0) && IPMIP_ATTR_HDR_SIZE(ahdr) <= (len))
|
|
#define IPMIP_ATTR_HDR_NEXT(ahdr, len) ((len) -= IPMIP_ATTR_HDR_SIZE(ahdr), (struct Ipmip_attr_header *) (((char *)(ahdr)) + IPMIP_ATTR_HDR_SIZE(ahdr)))
|
|
#define IPMIP_ATTR_HDR_ACK(ahdr) ((IP_GET_NTOHS(&(ahdr)->ah_flags) & IPMIP_ATTR_HEADER_ACK) != 0)
|
|
|
|
enum
|
|
{
|
|
IPMIP_ATTR_NONE,
|
|
IPMIP_ATTR_MESSAGE,
|
|
IPMIP_ATTR_MAX
|
|
};
|
|
|
|
|
|
/*
|
|
****************************************************************************
|
|
* 5 TYPES
|
|
****************************************************************************
|
|
*/
|
|
struct Ipmip_context;
|
|
struct Ipmip_proc;
|
|
struct Ipmip_cli_message;
|
|
struct Ipmip_buffer;
|
|
struct Ip_in6_addr;
|
|
|
|
|
|
struct Ipmip_attr_header
|
|
{
|
|
Ip_u32 ah_len; /* Length of message including header */
|
|
Ip_u32 ah_sequence; /* Sequence number */
|
|
Ip_u32 ah_subsystem; /* Sending process PID */
|
|
Ip_u32 ah_errcode;
|
|
Ip_u16 ah_type; /* Message content */
|
|
Ip_u16 ah_flags; /* Flags */
|
|
};
|
|
|
|
|
|
struct Ipmip_attr
|
|
{
|
|
Ip_u16 attr_len;
|
|
Ip_u16 attr_type;
|
|
};
|
|
|
|
|
|
typedef struct Ipmip_attr_iter
|
|
{
|
|
struct Ipmip_attr *rta;
|
|
Ip_size_t rta_size;
|
|
} Ipmip_attr_iter_t;
|
|
|
|
|
|
/*
|
|
****************************************************************************
|
|
* 6 FUNCTIONS
|
|
****************************************************************************
|
|
*/
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipmip_attr_command - ipmip_attr_command
|
|
*
|
|
* This function is invoked internally to parse global MIP commands. I.e.
|
|
* commands that are identical between various MIP entities, such as loglevel,
|
|
* history and events.
|
|
*
|
|
* Parameters:
|
|
* \is
|
|
* \i ctx
|
|
* The generic mobility singleton context for IPMIP. 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 ipmip_context_create(). See ipmip_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 request
|
|
* The request to process.
|
|
* \ie
|
|
*
|
|
* RETURNS: 0 on success, < 0 otherwise.
|
|
*
|
|
* ERRNO:
|
|
*
|
|
* NOMANUAL
|
|
*/
|
|
IP_GLOBAL int ipmip_attr_command
|
|
(
|
|
struct Ipmip_context *ctx,
|
|
struct Ipmip_proc *proc,
|
|
struct Ipmip_cli_message *request
|
|
);
|
|
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipmip_attr_put_u64 - ipmip_attr_put_u64
|
|
*
|
|
* Add a u64 value to a MIP message.
|
|
*
|
|
* 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 attrtype
|
|
* Attribute type
|
|
* \i attrval
|
|
* Attribute value
|
|
* \ie
|
|
*
|
|
* RETURNS: The offset
|
|
*
|
|
* ERRNO:
|
|
*
|
|
*/
|
|
IP_GLOBAL Ip_size_t ipmip_attr_put_u64
|
|
(
|
|
struct Ipmip_buffer *buf,
|
|
Ip_u16 attrtype,
|
|
Ip_u64 attrval
|
|
);
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipmip_attr_put_time_t - ipmip_attr_put_time_t
|
|
*
|
|
* Add a time_t value to a message. Will be stored as a 64 bit value,
|
|
* in order to be compatible with 64 bit platforms.
|
|
*
|
|
* 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 attrtype
|
|
* Attribute type
|
|
* \i attrval
|
|
* Attribute value
|
|
* \ie
|
|
*
|
|
* RETURNS: The offset
|
|
*
|
|
* ERRNO:
|
|
*
|
|
*/
|
|
IP_GLOBAL Ip_size_t ipmip_attr_put_time_t
|
|
(
|
|
struct Ipmip_buffer *buf,
|
|
Ip_u16 attrtype,
|
|
Ip_time_t attrval
|
|
);
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipmip_attr_put_u32 - ipmip_attr_put_u32
|
|
*
|
|
* Add a u32 value to a message.
|
|
*
|
|
* 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 attrtype
|
|
* Attribute type
|
|
* \i attrval
|
|
* Attribute value
|
|
* \ie
|
|
*
|
|
* RETURNS: The offset
|
|
*
|
|
* ERRNO:
|
|
*
|
|
*/
|
|
IP_GLOBAL Ip_size_t ipmip_attr_put_u32
|
|
(
|
|
struct Ipmip_buffer *buf,
|
|
Ip_u16 attrtype,
|
|
Ip_u32 attrval
|
|
);
|
|
|
|
#ifdef IPCOM_USE_INET
|
|
/*******************************************************************************
|
|
*
|
|
* ipmip_attr_put_inet - ipmip_attr_put_inet
|
|
*
|
|
* Add a INET address. Will be stored in network byte order in the message.
|
|
*
|
|
* 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 attrtype
|
|
* Attribute type
|
|
* \i attrval
|
|
* Attribute value
|
|
* \ie
|
|
*
|
|
* RETURNS: The offset
|
|
*
|
|
* ERRNO:
|
|
*
|
|
*/
|
|
IP_GLOBAL Ip_size_t ipmip_attr_put_inet
|
|
(
|
|
struct Ipmip_buffer *buf,
|
|
Ip_u16 attrtype,
|
|
Ip_u32 attrval
|
|
);
|
|
#endif
|
|
|
|
|
|
#ifdef IPCOM_USE_INET6
|
|
/*******************************************************************************
|
|
*
|
|
* ipmip_attr_put_inet6 - ipmip_attr_put_inet6
|
|
*
|
|
* Add a INET6 address to a message.
|
|
*
|
|
* 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 attrtype
|
|
* Attribute type
|
|
* \i attrval
|
|
* Attribute value
|
|
* \ie
|
|
*
|
|
* RETURNS: The offset
|
|
*
|
|
* ERRNO:
|
|
*
|
|
*/
|
|
IP_GLOBAL Ip_size_t ipmip_attr_put_inet6
|
|
(
|
|
struct Ipmip_buffer *buf,
|
|
Ip_u16 attrtype,
|
|
const struct Ip_in6_addr *attrval
|
|
);
|
|
#endif
|
|
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipmip_attr_put_strn - ipmip_attr_put_strn
|
|
*
|
|
* Add a size delimited string data value and add a zero termination. This
|
|
* function is typically used when dealing with string data with no or
|
|
* unsecure zero termination. By providing a length parameter, the MIP
|
|
* attriute routine will properly terminate the string after size bytes if
|
|
* no zero termination is located.
|
|
*
|
|
* 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 attrtype
|
|
* Attribute type
|
|
* \i attrval
|
|
* Attribute value
|
|
* \i str
|
|
* string
|
|
* \i size
|
|
* Size of string
|
|
* \ie
|
|
*
|
|
* RETURNS: The offset
|
|
*
|
|
* ERRNO:
|
|
*
|
|
*/
|
|
IP_GLOBAL Ip_size_t ipmip_attr_put_strn
|
|
(
|
|
struct Ipmip_buffer *buf,
|
|
Ip_u16 attrtype,
|
|
const char *str,
|
|
Ip_size_t size
|
|
);
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipmip_attr_put_str - ipmip_attr_put_str
|
|
*
|
|
* Add a string data value to a message. The string must be zero terminated.
|
|
*
|
|
* 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 attrtype
|
|
* Attribute type
|
|
* \i attrval
|
|
* Attribute value
|
|
* \i str
|
|
* string
|
|
* \ie
|
|
*
|
|
* RETURNS: The offset
|
|
*
|
|
* ERRNO:
|
|
*
|
|
*/
|
|
IP_GLOBAL Ip_size_t ipmip_attr_put_str
|
|
(
|
|
struct Ipmip_buffer *buf,
|
|
Ip_u16 attrtype,
|
|
const char *str
|
|
);
|
|
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipmip_attr_put - ipmip_attr_put
|
|
*
|
|
* Add an opaque data value
|
|
*
|
|
* 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 attrtype
|
|
* Attribute type
|
|
* \i attrval
|
|
* Attribute value
|
|
* \i data
|
|
* Data to add
|
|
* \ie
|
|
*
|
|
* RETURNS: The offset
|
|
*
|
|
* ERRNO:
|
|
*
|
|
*/
|
|
IP_GLOBAL Ip_size_t ipmip_attr_put
|
|
(
|
|
struct Ipmip_buffer *buf,
|
|
Ip_u16 attrtype,
|
|
Ip_u32 attrval,
|
|
const void *data
|
|
);
|
|
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipmip_attr_begin - ipmip_attr_begin
|
|
*
|
|
* Start an attribute block. An attribute block is an attributes within attribute
|
|
* construct, mainly used when providing multiple information instances within
|
|
* a single information block. For example, it may be used for returning
|
|
* statistics, where statistics may be a top level attribute and octets in/out
|
|
* and packets in/out could be internal attributes within the statistics block.
|
|
* An attribute block is not completed until ipmip_attr_end is invoked.
|
|
*
|
|
* 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 attrtype
|
|
* Attribute type
|
|
* \ie
|
|
*
|
|
* RETURNS: The offset to the begining of the block.
|
|
*
|
|
* ERRNO:
|
|
*
|
|
*/
|
|
IP_GLOBAL Ip_size_t ipmip_attr_begin
|
|
(
|
|
struct Ipmip_buffer *buf,
|
|
Ip_u16 attrtype
|
|
);
|
|
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipmip_attr_end - ipmip_attr_end
|
|
*
|
|
* End an attribute block. Will close an attribute block started by
|
|
* ipmip_attr_begin.
|
|
*
|
|
* 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 off
|
|
* The offset returned by ipmip_attr_begin
|
|
* \ie
|
|
*
|
|
* RETURNS: The offset
|
|
*
|
|
* ERRNO:
|
|
*
|
|
*/
|
|
IP_GLOBAL void ipmip_attr_end
|
|
(
|
|
struct Ipmip_buffer *buf,
|
|
Ip_size_t off
|
|
);
|
|
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipmip_attr_parse - ipmip_attr_parse
|
|
*
|
|
* Parse an attribute block and store result in array.
|
|
*
|
|
* Parameters:
|
|
* \is
|
|
* \i maxattr
|
|
* Size of attrtable array
|
|
* \i attr
|
|
* First attribute
|
|
* \i attrlen
|
|
* Size of attribute block
|
|
* \i attrtable
|
|
* Attribute array
|
|
* \ie
|
|
*
|
|
* RETURNS: No return value
|
|
*
|
|
* ERRNO:
|
|
*
|
|
*/
|
|
IP_GLOBAL void ipmip_attr_parse
|
|
(
|
|
int maxattr,
|
|
struct Ipmip_attr *attr,
|
|
Ip_size_t attrlen,
|
|
struct Ipmip_attr **attrtable
|
|
);
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipmip_attr_hdr_parse - ipmip_attr_hdr_parse
|
|
*
|
|
* Parse an attribute header block and store result in array. Will in turn
|
|
* invoke ipmip_attr_parse, once the length and start of attribute data
|
|
* has been extraceted from the attribute header.
|
|
*
|
|
* Parameters:
|
|
* \is
|
|
* \i maxattr
|
|
* Size of attrtable array
|
|
* \i attrhdr
|
|
* Attribute header
|
|
* \i attrtable
|
|
* Attribute array
|
|
* \ie
|
|
*
|
|
* RETURNS: No return value
|
|
*
|
|
* ERRNO:
|
|
*
|
|
*/
|
|
IP_GLOBAL void ipmip_attr_hdr_parse
|
|
(
|
|
int maxattr,
|
|
struct Ipmip_attr_header *attrhdr,
|
|
struct Ipmip_attr **attrtable
|
|
);
|
|
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipmip_attr_find - ipmip_attr_find
|
|
*
|
|
* Locate a particular attribute in an attribute block
|
|
*
|
|
* Parameters:
|
|
* \is
|
|
* \i attr
|
|
* First attribute
|
|
* \i attrlen
|
|
* Size of attribute block
|
|
* \i attrtype
|
|
* Attribute we're looking for
|
|
* \ie
|
|
*
|
|
* RETURNS: The attribute if found, or IP_NULL
|
|
*
|
|
* ERRNO:
|
|
*
|
|
*/
|
|
IP_GLOBAL struct Ipmip_attr *ipmip_attr_find
|
|
(
|
|
struct Ipmip_attr *attr,
|
|
Ip_size_t attrlen,
|
|
Ip_u16 attrtype
|
|
);
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipmip_attr_payload_find - ipmip_attr_payload_find
|
|
*
|
|
* Locate a particular attribute in the payload of an attribute. Used to
|
|
* locate attributes within blocks created using ipmip_attr_begin and
|
|
* ipmip_attr_end.
|
|
*
|
|
* Parameters:
|
|
* \is
|
|
* \i attr
|
|
* Attribute
|
|
* \i attrtype
|
|
* Attribute we're looking for
|
|
* \ie
|
|
*
|
|
* RETURNS: The attribute if found, or IP_NULL
|
|
*
|
|
* ERRNO:
|
|
*
|
|
*/
|
|
IP_GLOBAL struct Ipmip_attr *ipmip_attr_payload_find
|
|
(
|
|
struct Ipmip_attr *attr,
|
|
Ip_u16 attrtype
|
|
);
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipmip_attr_payload_find_u32 - ipmip_attr_payload_find_u32
|
|
*
|
|
* Locate a particular attribute in the payload of an attribute and return
|
|
* as a u32 value
|
|
*
|
|
* Parameters:
|
|
* \is
|
|
* \i attr
|
|
* Attribute
|
|
* \i attrtype
|
|
* Attribute we're looking for
|
|
* \ie
|
|
*
|
|
* RETURNS: The u32 value or 0
|
|
*
|
|
* ERRNO:
|
|
*
|
|
*/
|
|
IP_GLOBAL Ip_u32 ipmip_attr_payload_find_u32
|
|
(
|
|
struct Ipmip_attr *attr,
|
|
Ip_u16 attrtype
|
|
);
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipmip_attr_payload_find_time_t - ipmip_attr_payload_find_time_t
|
|
*
|
|
* Locate a particular attribute in the payload of an attribute and return
|
|
* as a time_t value
|
|
*
|
|
* Parameters:
|
|
* \is
|
|
* \i attr
|
|
* Attribute
|
|
* \i attrtype
|
|
* Attribute we're looking for
|
|
* \ie
|
|
*
|
|
* RETURNS: The time_t value or 0
|
|
*
|
|
* ERRNO:
|
|
*
|
|
*/
|
|
IP_GLOBAL Ip_time_t ipmip_attr_payload_find_time_t
|
|
(
|
|
struct Ipmip_attr *attr,
|
|
Ip_u16 attrtype
|
|
);
|
|
|
|
#ifdef IPCOM_USE_INET
|
|
/*******************************************************************************
|
|
*
|
|
* ipmip_attr_payload_find_inet - ipmip_attr_payload_find_inet
|
|
*
|
|
* Locate a particular attribute in the payload of an attribute and return
|
|
* as a inet value
|
|
*
|
|
* Parameters:
|
|
* \is
|
|
* \i attr
|
|
* Attribute
|
|
* \i attrtype
|
|
* Attribute we're looking for
|
|
* \ie
|
|
*
|
|
* RETURNS: The inet value or 0
|
|
*
|
|
* ERRNO:
|
|
*
|
|
*/
|
|
IP_GLOBAL Ip_u32 ipmip_attr_payload_find_inet
|
|
(
|
|
struct Ipmip_attr *attr,
|
|
Ip_u16 attrtype
|
|
);
|
|
#endif
|
|
|
|
#ifdef IPCOM_USE_INET
|
|
/*******************************************************************************
|
|
*
|
|
* ipmip_attr_payload_find_inet6 - ipmip_attr_payload_find_inet6
|
|
*
|
|
* Locate a particular attribute in the payload of an attribute and return
|
|
* as a inet6 address
|
|
*
|
|
* Parameters:
|
|
* \is
|
|
* \i attr
|
|
* Attribute
|
|
* \i attrtype
|
|
* Attribute we're looking for
|
|
* \ie
|
|
*
|
|
* RETURNS: The inet6 address or IP_NULL
|
|
*
|
|
* ERRNO:
|
|
*
|
|
*/
|
|
IP_GLOBAL struct Ip_in6_addr *ipmip_attr_payload_find_inet6
|
|
(
|
|
struct Ipmip_attr *attr,
|
|
Ip_u16 attrtype
|
|
);
|
|
#endif
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipmip_attr_payload_find_data - ipmip_attr_payload_find_data
|
|
*
|
|
* Locate a particular attribute in the payload of an attribute and return
|
|
* as data
|
|
*
|
|
* Parameters:
|
|
* \is
|
|
* \i attr
|
|
* Attribute
|
|
* \i attrtype
|
|
* Attribute we're looking for
|
|
* \ie
|
|
*
|
|
* RETURNS: The data or IP_NULL
|
|
*
|
|
* ERRNO:
|
|
*
|
|
*/
|
|
IP_GLOBAL void *ipmip_attr_payload_find_data
|
|
(
|
|
struct Ipmip_attr *attr,
|
|
Ip_u16 attrtype
|
|
);
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipmip_attr_payload_find_str - ipmip_attr_payload_find_str
|
|
*
|
|
* Locate a particular attribute in the payload of an attribute and return
|
|
* as string
|
|
*
|
|
* Parameters:
|
|
* \is
|
|
* \i attr
|
|
* Attribute
|
|
* \i attrtype
|
|
* Attribute we're looking for
|
|
* \ie
|
|
*
|
|
* RETURNS: The string or IP_NULL
|
|
*
|
|
* ERRNO:
|
|
*
|
|
*/
|
|
IP_GLOBAL char *ipmip_attr_payload_find_str
|
|
(
|
|
struct Ipmip_attr *attr,
|
|
Ip_u16 attrtype
|
|
);
|
|
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipmip_attr_payload_find_u64 - ipmip_attr_payload_find_u64
|
|
*
|
|
* Locate a particular attribute in the payload of an attribute and return
|
|
* as a u64 value
|
|
*
|
|
* Parameters:
|
|
* \is
|
|
* \i attr
|
|
* Attribute
|
|
* \i attrtype
|
|
* Attribute we're looking for
|
|
* \ie
|
|
*
|
|
* RETURNS: The u64 value or 0
|
|
*
|
|
* ERRNO:
|
|
*
|
|
*/
|
|
IP_GLOBAL Ip_u64 ipmip_attr_payload_find_u64
|
|
(
|
|
struct Ipmip_attr *attr,
|
|
Ip_u16 attrtype
|
|
);
|
|
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipmip_attr_hdr_find - ipmip_attr_hdr_find
|
|
*
|
|
* Locate a particular attribute in an attribute header
|
|
*
|
|
* Parameters:
|
|
* \is
|
|
* \i attrhdr
|
|
* Attribute header
|
|
* \i attrtype
|
|
* Attribute we're looking for
|
|
* \ie
|
|
*
|
|
* RETURNS: The attribute if found, or IP_NULL
|
|
*
|
|
* ERRNO:
|
|
*
|
|
*/
|
|
IP_GLOBAL struct Ipmip_attr *ipmip_attr_hdr_find
|
|
(
|
|
struct Ipmip_attr_header *attrhdr,
|
|
Ip_u16 attrtype
|
|
);
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipmip_attr_hdr_find_u32 - ipmip_attr_hdr_find_u32
|
|
*
|
|
* Locate a particular attribute in an attribute header and return as
|
|
* a u32
|
|
*
|
|
* Parameters:
|
|
* \is
|
|
* \i attrhdr
|
|
* Attribute header
|
|
* \i attrtype
|
|
* Attribute we're looking for
|
|
* \ie
|
|
*
|
|
* RETURNS: The u32 value or 0.
|
|
*
|
|
* ERRNO:
|
|
*
|
|
*/
|
|
IP_GLOBAL Ip_u32 ipmip_attr_hdr_find_u32
|
|
(
|
|
struct Ipmip_attr_header *attrhdr,
|
|
Ip_u16 attrtype
|
|
);
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipmip_attr_hdr_find_u64 - ipmip_attr_hdr_find_u64
|
|
*
|
|
* Locate a particular attribute in an attribute header and return as
|
|
* a u64
|
|
*
|
|
* Parameters:
|
|
* \is
|
|
* \i attrhdr
|
|
* Attribute header
|
|
* \i attrtype
|
|
* Attribute we're looking for
|
|
* \ie
|
|
*
|
|
* RETURNS: The u64 value or 0.
|
|
*
|
|
* ERRNO:
|
|
*
|
|
*/
|
|
IP_GLOBAL Ip_u64 ipmip_attr_hdr_find_u64
|
|
(
|
|
struct Ipmip_attr_header *attrhdr,
|
|
Ip_u16 attrtype
|
|
);
|
|
|
|
#ifdef IPCOM_USE_INET
|
|
/*******************************************************************************
|
|
*
|
|
* ipmip_attr_hdr_find_inet - ipmip_attr_hdr_find_inet
|
|
*
|
|
* Locate a particular attribute in an attribute header and return as
|
|
* a inet
|
|
*
|
|
* Parameters:
|
|
* \is
|
|
* \i attrhdr
|
|
* Attribute header
|
|
* \i attrtype
|
|
* Attribute we're looking for
|
|
* \ie
|
|
*
|
|
* RETURNS: The inet value or 0.
|
|
*
|
|
* ERRNO:
|
|
*
|
|
*/
|
|
IP_GLOBAL Ip_u32 ipmip_attr_hdr_find_inet
|
|
(
|
|
struct Ipmip_attr_header *attrhdr,
|
|
Ip_u16 attrtype
|
|
);
|
|
#endif
|
|
|
|
#ifdef IPCOM_USE_INET6
|
|
/*******************************************************************************
|
|
*
|
|
* ipmip_attr_hdr_find_inet6 - ipmip_attr_hdr_find_inet6
|
|
*
|
|
* Locate a particular attribute in an attribute header and return as
|
|
* a inet6 address
|
|
*
|
|
* Parameters:
|
|
* \is
|
|
* \i attrhdr
|
|
* Attribute header
|
|
* \i attrtype
|
|
* Attribute we're looking for
|
|
* \ie
|
|
*
|
|
* RETURNS: The inet6 address or IP_NULL
|
|
*
|
|
* ERRNO:
|
|
*
|
|
*/
|
|
IP_GLOBAL struct Ip_in6_addr *ipmip_attr_hdr_find_inet6
|
|
(
|
|
struct Ipmip_attr_header *attrhdr,
|
|
Ip_u16 attrtype
|
|
);
|
|
#endif
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipmip_attr_hdr_find_str - ipmip_attr_hdr_find_str
|
|
*
|
|
* Locate a particular attribute in an attribute header and return as
|
|
* a string
|
|
*
|
|
* Parameters:
|
|
* \is
|
|
* \i attrhdr
|
|
* Attribute header
|
|
* \i attrtype
|
|
* Attribute we're looking for
|
|
* \ie
|
|
*
|
|
* RETURNS: The string or IP_NULL
|
|
*
|
|
* ERRNO:
|
|
*
|
|
*/
|
|
IP_GLOBAL char *ipmip_attr_hdr_find_str
|
|
(
|
|
struct Ipmip_attr_header *attrhdr,
|
|
Ip_u16 attrtype
|
|
);
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipmip_attr_hdr_find_data - ipmip_attr_hdr_find_data
|
|
*
|
|
* Locate a particular attribute in an attribute header and return as
|
|
* a data
|
|
*
|
|
* Parameters:
|
|
* \is
|
|
* \i attrhdr
|
|
* Attribute header
|
|
* \i attrtype
|
|
* Attribute we're looking for
|
|
* \ie
|
|
*
|
|
* RETURNS: The data or IP_NULL
|
|
*
|
|
* ERRNO:
|
|
*
|
|
*/
|
|
IP_GLOBAL void *ipmip_attr_hdr_find_data
|
|
(
|
|
struct Ipmip_attr_header *attrhdr,
|
|
Ip_u16 attrtype
|
|
);
|
|
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipmip_attr_get_u32 - ipmip_attr_get_u32
|
|
*
|
|
* Convert a particular attribute to an u32 value
|
|
*
|
|
* Parameters:
|
|
* \is
|
|
* \i attr
|
|
* Attribute
|
|
* \ie
|
|
*
|
|
* RETURNS: The u32 or 0 if not available.
|
|
*
|
|
* ERRNO:
|
|
*
|
|
*/
|
|
IP_GLOBAL Ip_u32 ipmip_attr_get_u32
|
|
(
|
|
struct Ipmip_attr *attr
|
|
);
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipmip_attr_get_u64 - ipmip_attr_get_u64
|
|
*
|
|
* Convert a particular attribute to an u64 value
|
|
*
|
|
* Parameters:
|
|
* \is
|
|
* \i attr
|
|
* Attribute
|
|
* \ie
|
|
*
|
|
* RETURNS: The u64 or 0 if not available.
|
|
*
|
|
* ERRNO:
|
|
*
|
|
*/
|
|
IP_GLOBAL Ip_u64 ipmip_attr_get_u64
|
|
(
|
|
struct Ipmip_attr *attr
|
|
);
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipmip_attr_get_time_t - ipmip_attr_get_time_t
|
|
*
|
|
* Convert a particular attribute to an Ip_time_t value
|
|
*
|
|
* Parameters:
|
|
* \is
|
|
* \i attr
|
|
* Attribute
|
|
* \ie
|
|
*
|
|
* RETURNS: The Ip_time_t or 0 if not available.
|
|
*
|
|
* ERRNO:
|
|
*
|
|
*/
|
|
IP_GLOBAL Ip_time_t ipmip_attr_get_time_t
|
|
(
|
|
struct Ipmip_attr *attr
|
|
);
|
|
|
|
#ifdef IPCOM_USE_INET
|
|
/*******************************************************************************
|
|
*
|
|
* ipmip_attr_get_inet - ipmip_attr_get_inet
|
|
*
|
|
* Convert a particular attribute to an INET value
|
|
*
|
|
* Parameters:
|
|
* \is
|
|
* \i attr
|
|
* Attribute
|
|
* \ie
|
|
*
|
|
* RETURNS: The INET or 0 if not available.
|
|
*
|
|
* ERRNO:
|
|
*
|
|
*/
|
|
IP_GLOBAL Ip_u32 ipmip_attr_get_inet
|
|
(
|
|
struct Ipmip_attr *attr
|
|
);
|
|
#endif
|
|
|
|
#ifdef IPCOM_USE_INET6
|
|
/*******************************************************************************
|
|
*
|
|
* ipmip_attr_get_inet6 - ipmip_attr_get_inet6
|
|
*
|
|
* Convert a particular attribute to an INET6 value
|
|
*
|
|
* Parameters:
|
|
* \is
|
|
* \i attr
|
|
* Attribute
|
|
* \ie
|
|
*
|
|
* RETURNS: The INET6 or IP_NULL if not available.
|
|
*
|
|
* ERRNO:
|
|
*
|
|
*/
|
|
IP_GLOBAL struct Ip_in6_addr *ipmip_attr_get_inet6
|
|
(
|
|
struct Ipmip_attr *attr
|
|
);
|
|
#endif
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipmip_attr_get_str - ipmip_attr_get_str
|
|
*
|
|
* Convert a particular attribute to an STR value
|
|
*
|
|
* Parameters:
|
|
* \is
|
|
* \i attr
|
|
* Attribute
|
|
* \ie
|
|
*
|
|
* RETURNS: The STR or IP_NULL if not available.
|
|
*
|
|
* ERRNO:
|
|
*
|
|
*/
|
|
IP_GLOBAL char *ipmip_attr_get_str
|
|
(
|
|
struct Ipmip_attr *attr
|
|
);
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipmip_attr_get_strlen0 - ipmip_attr_get_strlen0
|
|
*
|
|
* Return the length of the string attribute excluding any terminating
|
|
* nulls.
|
|
*
|
|
* Parameters:
|
|
* \is
|
|
* \i attr
|
|
* Attribute
|
|
* \ie
|
|
*
|
|
* RETURNS: The length
|
|
*
|
|
* ERRNO:
|
|
*
|
|
*/
|
|
IP_GLOBAL Ip_size_t ipmip_attr_get_strlen0
|
|
(
|
|
struct Ipmip_attr *attr
|
|
);
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipmip_attr_get_data - ipmip_attr_get_data
|
|
*
|
|
* Convert a particular attribute to a data value
|
|
*
|
|
* Parameters:
|
|
* \is
|
|
* \i attr
|
|
* Attribute
|
|
* \ie
|
|
*
|
|
* RETURNS: The data or IP_NULL if not available.
|
|
*
|
|
* ERRNO:
|
|
*
|
|
*/
|
|
IP_GLOBAL void * ipmip_attr_get_data
|
|
(
|
|
struct Ipmip_attr *attr
|
|
);
|
|
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipmip_attr_hdr_req_create - ipmip_attr_hdr_req_create
|
|
*
|
|
* Create a request header
|
|
*
|
|
* 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 subsystem
|
|
* Subsystem identifier
|
|
* \i sequence
|
|
* Sequence number
|
|
* \i type
|
|
* Type value
|
|
* \ie
|
|
*
|
|
* RETURNS: The offset
|
|
*
|
|
* ERRNO:
|
|
*
|
|
*/
|
|
IP_GLOBAL Ip_size_t ipmip_attr_hdr_req_create
|
|
(
|
|
struct Ipmip_buffer *buf,
|
|
Ip_u32 subsystem,
|
|
Ip_u32 seq,
|
|
Ip_u16 type
|
|
);
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipmip_attr_hdr_ack_create - ipmip_attr_hdr_ack_create
|
|
*
|
|
* Create an ack header
|
|
*
|
|
* 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 subsystem
|
|
* Subsystem identifier
|
|
* \i sequence
|
|
* Sequence number
|
|
* \i type
|
|
* Type value
|
|
* \ie
|
|
*
|
|
* RETURNS: The offset
|
|
*
|
|
* ERRNO:
|
|
*
|
|
*/
|
|
IP_GLOBAL Ip_size_t ipmip_attr_hdr_ack_create
|
|
(
|
|
struct Ipmip_buffer *buf,
|
|
Ip_u32 subsystem,
|
|
Ip_u32 seq,
|
|
Ip_u16 type
|
|
);
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipmip_attr_hdr_ack_create - ipmip_attr_hdr_ack_create
|
|
*
|
|
* Create an ack header
|
|
*
|
|
* 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 hdr
|
|
* Header we're acknowledging
|
|
* \ie
|
|
*
|
|
* RETURNS: The offset
|
|
*
|
|
* ERRNO:
|
|
*
|
|
*/
|
|
IP_GLOBAL Ip_size_t ipmip_attr_hdr_ack
|
|
(
|
|
struct Ipmip_buffer *buf,
|
|
struct Ipmip_attr_header *hdr
|
|
);
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipmip_attr_hdr_err_create - ipmip_attr_hdr_err_create
|
|
*
|
|
* Create an error header
|
|
*
|
|
* 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 subsystem
|
|
* Subsystem identifier
|
|
* \i sequence
|
|
* Sequence number
|
|
* \i type
|
|
* Type value
|
|
* \i errcode
|
|
* Error code
|
|
* \i errmsg
|
|
* Error message
|
|
* \ie
|
|
*
|
|
* RETURNS: The offset
|
|
*
|
|
* ERRNO:
|
|
*
|
|
*/
|
|
IP_GLOBAL Ip_size_t ipmip_attr_hdr_err_create
|
|
(
|
|
struct Ipmip_buffer *buf,
|
|
Ip_u32 subsystem,
|
|
Ip_u32 seq,
|
|
Ip_u16 type,
|
|
Ip_u32 errcode,
|
|
const char *errmsg
|
|
);
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipmip_attr_hdr_err - ipmip_attr_hdr_err
|
|
*
|
|
* Create an error header
|
|
*
|
|
* 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 hdr
|
|
* Header we're replying to
|
|
* \i errcode
|
|
* Error code
|
|
* \i errmsg
|
|
* Error message
|
|
* \ie
|
|
*
|
|
* RETURNS: The offset
|
|
*
|
|
* ERRNO:
|
|
*
|
|
*/
|
|
IP_GLOBAL Ip_size_t ipmip_attr_hdr_err
|
|
(
|
|
struct Ipmip_buffer *buf,
|
|
struct Ipmip_attr_header *hdr,
|
|
Ip_u32 errcode,
|
|
const char *errmsg
|
|
);
|
|
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipmip_attr_hdr_finalize - ipmip_attr_hdr_finalize
|
|
*
|
|
* Finalize an attribute header
|
|
*
|
|
* 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 off
|
|
* Offset
|
|
* \ie
|
|
*
|
|
* RETURNS: No return value
|
|
*
|
|
* ERRNO:
|
|
*
|
|
*/
|
|
IP_GLOBAL void ipmip_attr_hdr_finalize
|
|
(
|
|
struct Ipmip_buffer *buf,
|
|
Ip_size_t off
|
|
);
|
|
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipmip_attr_hdr_iter_init - ipmip_attr_hdr_iter_init
|
|
*
|
|
* Initialize an iterator based on a header structure
|
|
*
|
|
* Parameters:
|
|
* \is
|
|
* \i hdr
|
|
* Header structure
|
|
* \i iter
|
|
* Iterator
|
|
* \ie
|
|
*
|
|
* RETURNS: The iterator
|
|
*
|
|
* ERRNO:
|
|
*
|
|
*/
|
|
IP_GLOBAL Ipmip_attr_iter_t *ipmip_attr_hdr_iter_init
|
|
(
|
|
struct Ipmip_attr_header *hdr,
|
|
Ipmip_attr_iter_t *iter
|
|
);
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipmip_attr_payload_iter_init - ipmip_attr_payload_iter_init
|
|
*
|
|
* Initialize an iterator based on an attribute block
|
|
*
|
|
* Parameters:
|
|
* \is
|
|
* \i rta
|
|
* RTA structure
|
|
* \i iter
|
|
* Iterator
|
|
* \ie
|
|
*
|
|
* RETURNS: The iterator
|
|
*
|
|
* ERRNO:
|
|
*
|
|
*/
|
|
IP_GLOBAL Ipmip_attr_iter_t *ipmip_attr_payload_iter_init
|
|
(
|
|
struct Ipmip_attr *rta,
|
|
Ipmip_attr_iter_t *iter
|
|
);
|
|
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipmip_attr_iter_next - ipmip_attr_iter_next
|
|
*
|
|
* Find next attribute of the specified type; The iter structure
|
|
* contains current position and left remaining size.
|
|
*
|
|
* Parameters:
|
|
* \is
|
|
* \i iter
|
|
* Iterator
|
|
* \i type
|
|
* Type of attribute
|
|
* \ie
|
|
*
|
|
* RETURNS: The next matching attribute or IP_NULL
|
|
*
|
|
* ERRNO:
|
|
*
|
|
*/
|
|
IP_GLOBAL struct Ipmip_attr *ipmip_attr_iter_next
|
|
(
|
|
Ipmip_attr_iter_t *iter,
|
|
Ip_u16 type
|
|
);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|
|
|
|
/*
|
|
****************************************************************************
|
|
* END OF FILE
|
|
****************************************************************************
|
|
*/
|