Files
m241Neelima/components/ip_net2-6.9/ipmip6pm/src/ipmip6pm_cli.c
T
2026-07-30 11:19:44 +05:30

723 lines
22 KiB
C

/*
******************************************************************************
* INTERPEAK SOURCE FILE
*
* Document no: @(#) $Name: VXWORKS_ITER40_2019102207 $ $RCSfile: ipmip6pm_cli.c,v $ $Revision: 1.11 $
* $Source: /home/interpeak/CVSRoot/ipmip6pm/src/ipmip6pm_cli.c,v $
* $Author: jhorteli $
* $State: Exp $ $Locker: $
*
* INTERPEAK_COPYRIGHT_STRING
* Design and implementation by Joel Hortelius <joel.hortelis@interpeak.se>
******************************************************************************
*/
/*
****************************************************************************
* 1 DESCRIPTION
****************************************************************************
*/
/*
****************************************************************************
* 2 CONFIGURATION
****************************************************************************
*/
#include "ipmip6pm_config.h"
/*
****************************************************************************
* 3 INCLUDE FILES
****************************************************************************
*/
#define IPCOM_USE_CLIB_PROTO
#include <ipcom_clib.h>
#include <ipcom_err.h>
#include <ipcom_inet.h>
#include <ipcom_ipd.h>
#include <ipcom_list.h>
#include <ipcom_hash.h>
#include <ipcom_os.h>
#include <ipcom_sock.h>
#include <ipcom_sock.h>
#include <ipcom_sock2.h>
#include <ipcom_sysctl.h>
#include <ipcom_syslog.h>
#include <ipcom_route.h>
#include <ipmip.h>
#include <private/ipmip_buffer.h>
#include <private/ipmip_util.h>
#include <ipmip6.h>
#include <private/ipmip6_context.h>
#include <private/ipmip6_mh.h>
#include <private/ipmip6_mh_pkt.h>
#include <private/ipmip6_if.h>
#include <private/ipmip6_util.h>
#include <private/ipmip6_address.h>
#include "ipmip6pm.h"
#include "ipmip6pm_attr.h"
#include "ipmip6pm_cli.h"
/*
****************************************************************************
* 4 DEFINES
****************************************************************************
*/
/*
****************************************************************************
* 5 TYPES
****************************************************************************
*/
/*
****************************************************************************
* 6 EXTERN PROTOTYPES
****************************************************************************
*/
/*
****************************************************************************
* 7 LOCAL PROTOTYPES
****************************************************************************
*/
/*
****************************************************************************
* 8 DATA
****************************************************************************
*/
/*
****************************************************************************
* 9 STATIC FUNCTIONS
****************************************************************************
*/
/*
****************************************************************************
* 10 GLOBAL FUNCTIONS
****************************************************************************
*/
/*
****************************************************************************
* 11 PUBLIC FUNCTIONS
****************************************************************************
*/
IP_PUBLIC Ip_bool
ipmip6pm_cli_connect(Ipmip_cli_daemon_t *daemon_info)
{
ipmip_cli_daemon_init(daemon_info, "ipmip6pm", IPCOM_IPD_ID_IPMIP6PM);
return ipmip_cli_daemon_connect(daemon_info);
}
IP_PUBLIC void
ipmip6pm_cli_request_set_nai(Ipmip_cli_daemon_req_t *req,
const char *nai)
{
if (nai)
ipmip_attr_put_str(&req->reqbuf, IPMIP6PM_CLI_ATTR_BC_P_MOBILE_NAI, nai);
}
IP_PUBLIC void
ipmip6pm_cli_request_set_handle(Ipmip_cli_daemon_req_t *req,
Ip_u32 handle)
{
ipmip_attr_put_u32(&req->reqbuf, IPMIP6PM_CLI_ATTR_BC_P_HANDLE, handle);
}
IP_PUBLIC void
ipmip6pm_cli_request_set_ifname(Ipmip_cli_daemon_req_t *req,
const char *ifname)
{
if (ifname)
ipmip_attr_put_str(&req->reqbuf, IPMIP6PM_CLI_ATTR_BC_P_IFNAME, ifname);
}
IP_PUBLIC void
ipmip6pm_cli_request_set_service(Ipmip_cli_daemon_req_t *req,
const char *module,
const char *value)
{
Ip_size_t rta = ipmip_attr_begin(&req->reqbuf, IPMIP6PM_CLI_ATTR_BC_P_SERVICE);
ipmip_attr_put_str(&req->reqbuf, IPMIP6PM_CLI_ATTR_BC_P_SRV_MODULE, module);
ipmip_attr_put_str(&req->reqbuf, IPMIP6PM_CLI_ATTR_BC_P_SRV_VALUE, value);
ipmip_attr_end(&req->reqbuf, rta);
}
IP_PUBLIC void
ipmip6pm_cli_request_set_link(Ipmip_cli_daemon_req_t *req,
const char *module,
const char *value)
{
Ip_size_t rta = ipmip_attr_begin(&req->reqbuf, IPMIP6PM_CLI_ATTR_BC_P_LINK);
ipmip_attr_put_str(&req->reqbuf, IPMIP6PM_CLI_ATTR_BC_P_SRV_MODULE, module);
ipmip_attr_put_str(&req->reqbuf, IPMIP6PM_CLI_ATTR_BC_P_SRV_VALUE, value);
ipmip_attr_end(&req->reqbuf, rta);
}
IP_PUBLIC void
ipmip6pm_cli_request_set_MAG_configuration(Ipmip_cli_daemon_req_t *req,
const char *ifname)
{
if (ifname)
ipmip_attr_put_str(&req->reqbuf, IPMIP6PM_CLI_ATTR_BC_P_COA_IFNAME, ifname);
}
IP_PUBLIC void
ipmip6pm_cli_request_add_prefix(Ipmip_cli_daemon_req_t *req,
struct Ipmip6_address *prefix)
{
if (prefix)
ipmip_attr_put(&req->reqbuf, IPMIP6PM_CLI_ATTR_BC_P_HOME_PREFIX_LIST, sizeof(*prefix), prefix);
}
#ifdef IPMIP_USE_INET
IP_PUBLIC void
ipmip6pm_cli_request_add_home_address_inet(Ipmip_cli_daemon_req_t *req,
struct Ipmip6_inet *prefix)
{
if (prefix)
ipmip_attr_put(&req->reqbuf, IPMIP6PM_CLI_ATTR_BC_P_HOME_ADDRESS_INET, sizeof(*prefix), prefix);
}
#endif
IP_PUBLIC void
ipmip6pm_cli_request_set_homeagent(Ipmip_cli_daemon_req_t *req,
const struct Ip_in6_addr *homeagent)
{
if (homeagent)
ipmip_attr_put_inet6(&req->reqbuf, IPMIP6PM_CLI_ATTR_BC_P_HOME_AGENT, homeagent);
}
#ifdef IPMIP_USE_INET
IP_PUBLIC void
ipmip6pm_cli_request_set_homeagent_inet(Ipmip_cli_daemon_req_t *req,
Ip_u32 homeagent)
{
if (homeagent)
ipmip_attr_put_inet(&req->reqbuf, IPMIP6PM_CLI_ATTR_BC_P_HOME_AGENT_INET, homeagent);
}
#endif
IP_PUBLIC void
ipmip6pm_cli_request_set_link_layer(Ipmip_cli_daemon_req_t *req,
void *lla,
Ip_size_t lla_size)
{
if (lla != IP_NULL && lla_size > 0)
ipmip_attr_put(&req->reqbuf, IPMIP6PM_CLI_ATTR_BC_P_IFIDENT, lla_size, lla);
}
IP_PUBLIC void
ipmip6pm_cli_request_set_gre_downlink(Ipmip_cli_daemon_req_t *req,
Ip_u32 downlink)
{
ipmip_attr_put_u32(&req->reqbuf, IPMIP6PM_CLI_ATTR_BC_P_GRE, downlink);
}
IP_PUBLIC void
ipmip6pm_cli_request_set_tunnel_type(Ipmip_cli_daemon_req_t *req,
Ip_u8 tunnel_type)
{
/**/
if (tunnel_type < IPMIP_TUNNELTYPE_MAX)
ipmip_attr_put_u32(&req->reqbuf, IPMIP6PM_CLI_ATTR_BC_P_TUNNEL_TYPE, tunnel_type);
}
IP_PUBLIC void
ipmip6pm_cli_request_set_transport_mask(Ipmip_cli_daemon_req_t *req,
Ip_u32 mask)
{
if (mask)
ipmip_attr_put_u32(&req->reqbuf, IPMIP6PM_CLI_ATTR_BC_P_TRANSPORT_MASK, mask);
}
IP_PUBLIC void
ipmip6pm_cli_request_set_handoff_indicator(Ipmip_cli_daemon_req_t *req,
Ip_u32 handoff_indicator)
{
ipmip_attr_put_u32(&req->reqbuf, IPMIP6PM_CLI_ATTR_BC_P_HANDOFF_INDICATOR, handoff_indicator);
}
IP_PUBLIC void
ipmip6pm_cli_request_set_access_type(Ipmip_cli_daemon_req_t *req,
Ip_u32 access_type)
{
ipmip_attr_put_u32(&req->reqbuf, IPMIP6PM_CLI_ATTR_BC_P_ACCESS_TYPE, access_type);
}
IP_PUBLIC Ip_u32
ipmip6pm_cli_handle_next(Ipmip_attr_iter_t *iter)
{
/**/
return ipmip_attr_get_u32(ipmip_attr_iter_next(iter, IPMIP6PM_CLI_ATTR_BC_P_HANDLE));
}
IP_PUBLIC Ip_u32
ipmip6pm_cli_handle_get(Ipmip_cli_daemon_req_t *req)
{
/**/
return ipmip_attr_get_u32(ipmip_cli_daemon_find_request(req, IPMIP6PM_CLI_ATTR_BC_P_HANDLE));
}
IP_PUBLIC const char *
ipmip6pm_cli_node_get_ifname(struct Ipmip_attr *node)
{
/**/
return ipmip_attr_payload_find_str(node, IPMIP6PM_CLI_ATTR_BC_P_IFNAME);
}
IP_PUBLIC const char *
ipmip6pm_cli_node_get_tunnel_ifname(struct Ipmip_attr *node)
{
/**/
return ipmip_attr_payload_find_str(node, IPMIP6PM_CLI_ATTR_BC_P_TUNNEL_IFNAME);
}
IP_PUBLIC struct Ip_in6_addr *
ipmip6pm_cli_node_get_home_agent(struct Ipmip_attr *node)
{
/**/
return ipmip_attr_payload_find_inet6(node, IPMIP6PM_CLI_ATTR_BC_P_HOME_AGENT);
}
#ifdef IPMIP_USE_INET
IP_PUBLIC Ip_u32
ipmip6pm_cli_node_get_home_agent_inet(struct Ipmip_attr *node)
{
/**/
return ipmip_attr_payload_find_inet(node, IPMIP6PM_CLI_ATTR_BC_P_HOME_AGENT_INET);
}
#endif
IP_PUBLIC Ip_u8
ipmip6pm_cli_node_get_tunnel_type(struct Ipmip_attr *node)
{
/**/
return ipmip_attr_payload_find_u32(node, IPMIP6PM_CLI_ATTR_BC_P_TUNNEL_TYPE);
}
IP_PUBLIC struct Ipmip_attr *
ipmip6pm_cli_node_get_gre_keys(struct Ipmip_attr *node)
{
return ipmip_attr_payload_find(node, IPMIP6PM_CLI_ATTR_BC_P_GRE);
}
IP_PUBLIC Ip_u32
ipmip6pm_cli_node_get_transport_mask(struct Ipmip_attr *node)
{
return ipmip_attr_payload_find_u32(node, IPMIP6PM_CLI_ATTR_BC_P_TRANSPORT_MASK);
}
IP_PUBLIC const char *
ipmip6pm_cli_node_get_nai(struct Ipmip_attr *node)
{
/**/
return ipmip_attr_payload_find_str(node, IPMIP6PM_CLI_ATTR_BC_P_MOBILE_NAI);
}
IP_PUBLIC struct Ipmip6_mib_mip6MnBLTable *
ipmip6pm_cli_node_get_mip6MnBLTable(struct Ipmip_attr *node)
{
/**/
return (struct Ipmip6_mib_mip6MnBLTable *)ipmip_attr_payload_find_data(node, IPMIP6PM_CLI_ATTR_BC_P_MIB_mip6MnBLTable);
}
IP_PUBLIC struct Ipmip6_mib_mip6NodeTrafficEntry *
ipmip6pm_cli_node_get_mip6NodeTrafficEntry(struct Ipmip_attr *node)
{
/**/
return (struct Ipmip6_mib_mip6NodeTrafficEntry *)ipmip_attr_payload_find_data(node, IPMIP6PM_CLI_ATTR_BC_P_MIB_mip6NodeTrafficEntry);
}
IP_PUBLIC struct Ipmip_lladdr *
ipmip6pm_cli_node_get_iflla(struct Ipmip_attr *node)
{
return (struct Ipmip_lladdr *)ipmip_attr_payload_find_data(node, IPMIP6PM_CLI_ATTR_BC_P_IFLLA);
}
IP_PUBLIC struct Ipmip_lladdr *
ipmip6pm_cli_node_get_MAG_iflla(struct Ipmip_attr *node)
{
return (struct Ipmip_lladdr *)ipmip_attr_payload_find_data(node, IPMIP6PM_CLI_ATTR_BC_P_MAG_Link_Layer);
}
IP_PUBLIC struct Ipmip6_address *
ipmip6pm_cli_node_get_MAG_link_local(struct Ipmip_attr *node)
{
return (struct Ipmip6_address *)ipmip_attr_payload_find_data(node, IPMIP6PM_CLI_ATTR_BC_P_MAG_Link_Local);
}
IP_PUBLIC struct Ipmip6_address *
ipmip6pm_cli_node_get_home_prefix_list(struct Ipmip_attr *node,
Ip_u32 *sz)
{
struct Ipmip_attr *rta = ipmip_attr_payload_find(node, IPMIP6PM_CLI_ATTR_BC_P_HOME_PREFIX_LIST);
if (rta)
{
*sz = IPMIP_ATTR_PAYLOAD(rta) / sizeof(Ipmip6_address_t);
return *sz? (Ipmip6_address_t *)IPMIP_ATTR_DATA(rta) : IP_NULL;
}
return IP_NULL;
}
#ifdef IPMIP_USE_INET
IP_PUBLIC struct Ipmip6_inet *
ipmip6pm_cli_node_get_home_address_inet(struct Ipmip_attr *node)
{
return (struct Ipmip6_inet *)ipmip_attr_payload_find_data(node, IPMIP6PM_CLI_ATTR_BC_P_HOME_ADDRESS_INET);
}
#endif
IP_PUBLIC Ip_time_t
ipmip6pm_cli_node_get_created(struct Ipmip_attr *node)
{
/**/
return ipmip_attr_payload_find_time_t(node, IPMIP6PM_CLI_ATTR_BC_P_CREATED);
}
IP_PUBLIC Ip_u32
ipmip6pm_cli_node_get_access_type(struct Ipmip_attr *node)
{
return ipmip_attr_payload_find_u32(node, IPMIP6PM_CLI_ATTR_BC_P_ACCESS_TYPE);
}
IP_PUBLIC Ip_u32
ipmip6pm_cli_node_get_handoff_indicator(struct Ipmip_attr *node)
{
return ipmip_attr_payload_find_u32(node, IPMIP6PM_CLI_ATTR_BC_P_HANDOFF_INDICATOR);
}
IP_PUBLIC Ip_u32
ipmip6pm_cli_node_get_status(struct Ipmip_attr *node)
{
return ipmip_attr_payload_find_u32(node, IPMIP6PM_CLI_ATTR_BC_P_STATUS);
}
IP_PUBLIC Ip_u32
ipmip6pm_cli_node_get_handle(struct Ipmip_attr *node)
{
return ipmip_attr_payload_find_u32(node, IPMIP6PM_CLI_ATTR_BC_P_HANDLE);
}
IP_PUBLIC int
ipmip6pm_cli_link_list(Ipmip_cli_daemon_t *daemon,
Ipmip_cli_daemon_req_t *req)
{
ipmip_cli_daemon_request_start(req, IPMIP6PM_CLI_BC_P_LIST_LINK);
return ipmip_cli_daemon_request(daemon, req);
}
IP_PUBLIC Ip_bool
ipmip6pm_cli_link_next(Ipmip_attr_iter_t *iter,
char **name,
char **value)
{
/**/
struct Ipmip_attr *srv = ipmip_attr_iter_next(iter, IPMIP6PM_CLI_ATTR_BC_P_LINK);
if (srv)
{
*name = ipmip_attr_payload_find_str(srv, IPMIP6PM_CLI_ATTR_BC_P_SRV_MODULE);
*value = ipmip_attr_payload_find_str(srv, IPMIP6PM_CLI_ATTR_BC_P_SRV_VALUE);
return IP_TRUE;
}
return IP_FALSE;
}
IP_PUBLIC int
ipmip6pm_cli_service_list(Ipmip_cli_daemon_t *daemon,
Ipmip_cli_daemon_req_t *req)
{
ipmip_cli_daemon_request_start(req, IPMIP6PM_CLI_BC_P_LIST_SERVICE);
return ipmip_cli_daemon_request(daemon, req);
}
IP_PUBLIC Ip_bool
ipmip6pm_cli_service_next(Ipmip_attr_iter_t *iter,
char **name,
char **value)
{
/**/
struct Ipmip_attr *srv = ipmip_attr_iter_next(iter, IPMIP6PM_CLI_ATTR_BC_P_SERVICE);
if (srv)
{
*name = ipmip_attr_payload_find_str(srv, IPMIP6PM_CLI_ATTR_BC_P_SRV_MODULE);
*value = ipmip_attr_payload_find_str(srv, IPMIP6PM_CLI_ATTR_BC_P_SRV_VALUE);
return IP_TRUE;
}
return IP_FALSE;
}
IP_PUBLIC int
ipmip6pm_cli_node_list(Ipmip_cli_daemon_t *daemon,
Ipmip_cli_daemon_req_t *req,
const char *nai,
const char *ifname)
{
ipmip_cli_daemon_request_start(req, IPMIP6PM_CLI_BC_P_LIST);
ipmip6pm_cli_request_set_ifname(req, ifname);
ipmip6pm_cli_request_set_nai(req, nai);
return ipmip_cli_daemon_request(daemon, req);
}
IP_PUBLIC struct Ipmip_attr *
ipmip6pm_cli_node_get(Ipmip_cli_daemon_t *daemon,
Ipmip_cli_daemon_req_t *req,
Ip_u32 handle)
{
ipmip_cli_daemon_request_start(req, IPMIP6PM_CLI_BC_P_GET);
ipmip6pm_cli_request_set_handle(req, handle);
if (ipmip_cli_daemon_request(daemon, req) == IPCOM_SUCCESS)
return ipmip_cli_daemon_find_request(req, IPMIP6PM_CLI_ATTR_BC_P);
return IP_NULL;
}
IP_PUBLIC void
ipmip6pm_cli_node_delete(Ipmip_cli_daemon_t *daemon,
Ip_u32 handle)
{
Ipmip_cli_daemon_req_t req;
ipmip_cli_daemon_request_init(&req);
ipmip_cli_daemon_request_start(&req, IPMIP6PM_CLI_BC_P_DELETE);
ipmip6pm_cli_request_set_handle(&req, handle);
ipmip_cli_daemon_request(daemon, &req);
ipmip_cli_daemon_request_release(&req);
}
IP_PUBLIC void
ipmip6pm_cli_node_deregister(Ipmip_cli_daemon_t *daemon,
Ip_u32 handle,
Ip_bool ack)
{
Ipmip_cli_daemon_req_t req;
ipmip_cli_daemon_request_init(&req);
ipmip_cli_daemon_request_start(&req, ack? IPMIP6PM_CLI_BC_P_DEREGISTER : IPMIP6PM_CLI_BC_P_DEREGISTER_DELETE);
ipmip6pm_cli_request_set_handle(&req, handle);
ipmip_cli_daemon_request(daemon, &req);
ipmip_cli_daemon_request_release(&req);
}
IP_PUBLIC void
ipmip6pm_cli_handoff_request_init(Ipmip_cli_daemon_req_t *req,
const char *nai,
const char *ifname)
{
ipmip_cli_daemon_request_start(req, IPMIP6PM_CLI_BC_P_CREATE);
ipmip6pm_cli_request_set_nai(req, nai);
ipmip6pm_cli_request_set_ifname(req, ifname);
}
IP_PUBLIC void
ipmip6pm_cli_multicast_status(Ipmip_cli_daemon_t *daemon,
Ip_bool enable)
{
if (enable)
ipmip_cli_multicast_add(daemon, IPMIP6PM_CLI_BC_P_STATUS);
else
ipmip_cli_multicast_del(daemon, IPMIP6PM_CLI_BC_P_STATUS);
}
IP_PUBLIC Ip_u32
ipmip6pm_cli_node_retrieve_status(Ipmip_cli_daemon_t *daemon,
Ip_u32 handle)
{
Ipmip_cli_daemon_req_t req;
struct Ipmip_attr *node;
Ip_u32 status = IPMIP6PM_CLI_ATTR_BC_P_STATUS_DELETED;
ipmip_cli_daemon_request_init(&req);
node = ipmip6pm_cli_node_get(daemon, &req, handle);
if (node)
status = ipmip6pm_cli_node_get_status(node);
ipmip_cli_daemon_request_release(&req);
return status;
}
IP_PUBLIC Ip_bool
ipmip6pm_cli_node_wait_status(Ipmip_cli_daemon_t *daemon,
Ip_u32 handle,
Ip_u32 status,
struct Ip_timeval *tv)
{
struct Ipmip_attr *node;
Ip_u32 tmp;
/* Do initial status check */
tmp = ipmip6pm_cli_node_retrieve_status(daemon, handle);
if (tmp == status)
return IP_TRUE;
if (tmp == IPMIP6PM_CLI_ATTR_BC_P_STATUS_DELETED)
return IP_FALSE;
/* Wait for it to be reported */
while (ipmip_cli_daemon_recvmsg(daemon, tv) == 0)
{
struct Ipmip_attr_header *hdr = (struct Ipmip_attr_header *)IPMIP_BUFFER_DATA(&daemon->message);
if (IPMIP_ATTR_HDR_SEQUENCE(hdr) == 0 && IPMIP_ATTR_HDR_SYSTEM(hdr) == 0 && IPMIP_ATTR_HDR_TYPE(hdr) == IPMIP6PM_CLI_BC_P_STATUS)
{
node = ipmip_attr_hdr_find(hdr, IPMIP6PM_CLI_ATTR_BC_P);
if (node)
{
if (ipmip6pm_cli_node_get_handle(node) == handle)
{
tmp = ipmip6pm_cli_node_get_status(node);
if (tmp == status)
return IP_TRUE;
/* Final state? */
if (tmp == IPMIP6PM_CLI_ATTR_BC_P_STATUS_DELETED)
return IP_FALSE;
}
}
}
}
return IP_FALSE;
}
IP_PUBLIC int
ipmip6pm_cli_lma_list(Ipmip_cli_daemon_t *daemon,
Ipmip_cli_daemon_req_t *req)
{
ipmip_cli_daemon_request_start(req, IPMIP6PM_CLI_BC_P_GET_LMA);
return ipmip_cli_daemon_request(daemon, req);
}
IP_PUBLIC struct Ipmip_attr*
ipmip6pm_cli_lma_next(Ipmip_attr_iter_t *iter)
{
/**/
return ipmip_attr_iter_next(iter, IPMIP6PM_CLI_ATTR_LMA);
}
IP_PUBLIC struct Ip_in6_addr *
ipmip6pm_cli_lma_get_addr_v6(struct Ipmip_attr *lma)
{
/**/
return ipmip_attr_payload_find_inet6(lma, IPMIP6PM_CLI_ATTR_BC_P_HOME_AGENT);
}
#ifdef IPMIP_USE_INET
IP_PUBLIC Ip_u32
ipmip6pm_cli_lma_get_addr_v4(struct Ipmip_attr *lma)
{
/**/
return ipmip_attr_payload_find_inet(lma, IPMIP6PM_CLI_ATTR_BC_P_HOME_AGENT_INET);
}
#endif
IP_PUBLIC const char *
ipmip6pm_cli_lma_get_ifname(struct Ipmip_attr *lma)
{
/**/
return ipmip_attr_payload_find_str(lma, IPMIP6PM_CLI_ATTR_BC_P_IFNAME);
}
IP_PUBLIC void
ipmip6pm_cli_request_set_revoke_reason(Ipmip_cli_daemon_req_t *req,
Ip_u8 reason)
{
ipmip_attr_put_u32(&req->reqbuf, IPMIP6PM_CLI_ATTR_BC_P_REVOKE_REASON, reason);
}
IP_PUBLIC void
ipmip6pm_cli_lma_revoke(Ipmip_cli_daemon_t *daemon,
const char *ifname,
const struct Ip_in6_addr *lma,
Ip_u8 reason)
{
Ipmip_cli_daemon_req_t req;
ipmip_cli_daemon_request_init(&req);
ipmip_cli_daemon_request_start(&req, IPMIP6PM_CLI_BC_P_REVOKE_LMA);
ipmip6pm_cli_request_set_homeagent(&req, lma);
ipmip6pm_cli_request_set_revoke_reason(&req, reason);
ipmip6pm_cli_request_set_ifname(&req, ifname);
ipmip_cli_daemon_request(daemon, &req);
ipmip_cli_daemon_request_release(&req);
}
IP_PUBLIC void
ipmip6pm_cli_node_revoke(Ipmip_cli_daemon_t *daemon,
Ip_u32 handle,
Ip_u32 reason)
{
Ipmip_cli_daemon_req_t req;
ipmip_cli_daemon_request_init(&req);
ipmip_cli_daemon_request_start(&req, IPMIP6PM_CLI_BC_P_REVOKE);
ipmip6pm_cli_request_set_handle(&req, handle);
ipmip6pm_cli_request_set_revoke_reason(&req, reason);
ipmip_cli_daemon_request(daemon, &req);
ipmip_cli_daemon_request_release(&req);
}
#ifdef IPMIP_USE_INET
IP_PUBLIC void
ipmip6pm_cli_node_revoke_inet(Ipmip_cli_daemon_t *daemon,
Ip_u32 handle,
Ip_u32 reason)
{
Ipmip_cli_daemon_req_t req;
ipmip_cli_daemon_request_init(&req);
ipmip_cli_daemon_request_start(&req, IPMIP6PM_CLI_BC_P_REVOKE_INET);
ipmip6pm_cli_request_set_handle(&req, handle);
ipmip6pm_cli_request_set_revoke_reason(&req, reason);
ipmip_cli_daemon_request(daemon, &req);
ipmip_cli_daemon_request_release(&req);
}
#endif
/*
****************************************************************************
* END OF FILE
****************************************************************************
*/