/* ****************************************************************************** * INTERPEAK SOURCE FILE * * Document no: @(#) $Name: VXWORKS_ITER40_2019102207 $ $RCSfile: ipmip6ha_ifevent.c,v $ $Revision: 1.12 $ * $Source: /home/interpeak/CVSRoot/ipmip6ha/src/ipmip6ha_ifevent.c,v $ * $Author: jhorteli $ * $State: Exp $ $Locker: $ * * INTERPEAK_COPYRIGHT_STRING * Design and implementation by Joel Hortelius ****************************************************************************** */ /* **************************************************************************** * 1 DESCRIPTION **************************************************************************** */ /* **************************************************************************** * 2 CONFIGURATION **************************************************************************** */ #include "ipmip6ha_config.h" /* **************************************************************************** * 3 INCLUDE FILES **************************************************************************** */ #define IPCOM_USE_CLIB_PROTO #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "ipmip6ha_h.h" #include "ipmip6ha_if.h" #include "ipmip6ha_attr_h.h" /* **************************************************************************** * 4 DEFINES **************************************************************************** */ /* **************************************************************************** * 5 TYPES **************************************************************************** */ /* **************************************************************************** * 6 EXTERN PROTOTYPES **************************************************************************** */ /* **************************************************************************** * 7 LOCAL PROTOTYPES **************************************************************************** */ IP_STATIC void ipmip6ha_ifevent_router_new(Ipmip6ha_context_t *ctx, Ipmip_proc_t *proc, Ipmip6_if_t *ife, Ipmip6_if_router_t *router); IP_STATIC void ipmip6ha_ifevent_router_expire(Ipmip6_context_t *ctx, Ipmip_proc_t *proc, Ipmip6_if_t *ife, Ipmip6_if_router_t *router); IP_STATIC void ipmip6ha_ifevent_prefix_new(Ipmip6ha_context_t *ctx, Ipmip_proc_t *proc, Ipmip6ha_if_t *ife, Ipmip6_if_prefix_t *prefix); IP_STATIC void ipmip6ha_ifevent_prefix_expire(Ipmip6ha_context_t *ctx, Ipmip_proc_t *proc, Ipmip6ha_if_t *ife, Ipmip6_if_prefix_t *prefix); IP_STATIC void ipmip6ha_ifevent_prefix_advertise(Ipmip6_context_t *ctx, Ipmip_proc_t *proc, Ipmip6_if_t *ife, Ipmip6_if_prefix_t *prefix); IP_STATIC void ipmip6ha_ifevent_prefix_update(Ipmip6ha_context_t *ctx, Ipmip_proc_t *proc, Ipmip6ha_if_t *ife, Ipmip6_if_prefix_t *prefix); /* **************************************************************************** * 8 DATA **************************************************************************** */ Ipmip6_if_event_table_t ipmip6ha_ifevent_table = { (Ipmip6_if_event_t)IP_NULL, (Ipmip6_if_event_t)IP_NULL, (Ipmip6_if_event_t)ipmip6ha_ifevent_router_new, (Ipmip6_if_event_t)ipmip6ha_ifevent_router_expire, (Ipmip6_if_event_t)ipmip6ha_ifevent_prefix_new, (Ipmip6_if_event_t)ipmip6ha_ifevent_prefix_expire, (Ipmip6_if_event_t)ipmip6ha_ifevent_prefix_advertise, (Ipmip6_if_event_t)ipmip6ha_ifevent_prefix_update }; /* **************************************************************************** * 9 STATIC FUNCTIONS **************************************************************************** */ IP_STATIC void ipmip6ha_ifevent_router_new(Ipmip6ha_context_t *ctx, Ipmip_proc_t *proc, Ipmip6_if_t *ife, Ipmip6_if_router_t *router) { IPMIP_UNUSED_PARAMETER(ctx); IPMIP_UNUSED_PARAMETER(proc); IPMIP_UNUSED_PARAMETER(ife); IPMIP_UNUSED_PARAMETER(router); } IP_STATIC void ipmip6ha_ifevent_router_expire(Ipmip6_context_t *ctx, Ipmip_proc_t *proc, Ipmip6_if_t *ife, Ipmip6_if_router_t *router) { IPMIP_UNUSED_PARAMETER(ctx); IPMIP_UNUSED_PARAMETER(proc); IPMIP_UNUSED_PARAMETER(ife); IPMIP_UNUSED_PARAMETER(router); } IP_STATIC void ipmip6ha_ifevent_prefix_new(Ipmip6ha_context_t *ctx, Ipmip_proc_t *proc, Ipmip6ha_if_t *ife, Ipmip6_if_prefix_t *prefix) { if (IP_BIT_ISSET(prefix->flags, IPMIP6_ND_OPT_PI_FLAG_ONLINK)) { Ipmip6ha_if_route_entry_t *se; struct Ip_in6_addr lkey; ipmip6_address_create_prefix(&lkey, &prefix->prefix.prefix, prefix->prefix.len); IPMIP_UNUSED_PARAMETER(ctx); IPMIP_UNUSED_PARAMETER(proc); ipcom_mutex_lock(ctx->prefixes_lock); /* Found, already in the table */ if ((se = (Ipmip6ha_if_route_entry_t *)ipmip_route_lookup_exact(ctx->prefixes, &lkey, prefix->prefix.len)) != IP_NULL) { if (se->ifp != ife) { IPMIP6_EVENT_IF(ERR, proc, ipmip_log_event_add(&ctx->ipmip6.ipmip, proc, "On-link prefix %s/%d seen on both %s and %s -- may cause problems", ipmip_ntop_inet6(proc, &lkey, IP_NULL), se->ifp->ipmip6.iff.ifname, ife->ipmip6.iff.ifname)); /* Switch to last seen */ se->ifp = ife; } se->refcnt++; } else { se = ipcom_calloc(1, sizeof(*se)); if (se != IP_NULL) { ipmip_util_create_mask((Ip_u8 *)&se->mask, prefix->prefix.len); ipmip6_address_create_prefix(&se->subnet, &prefix->prefix.prefix, prefix->prefix.len); se->mask_len = prefix->prefix.len; /* Create the entry */ se->ipmip.hdr.key = &se->subnet; se->ipmip.hdr.mask = &se->mask; /**/ se->refcnt = 1; se->timestamp = prefix->stamp; se->valid = prefix->valid; se->ifp = ife; if (ipmip_route_add(ctx->prefixes, &se->ipmip) != IPCOM_SUCCESS) ipcom_free(se); } } ipcom_mutex_unlock(ctx->prefixes_lock); IPMIP6_EVENT_IF(INFO, proc, ipmip_log_event_add(&ctx->ipmip6.ipmip, proc, "Adding on-link prefix %s/%d@%s to configuration %s", ipmip_ntop_inet6(proc, &lkey, IP_NULL), prefix->prefix.len, ipmip_ntop_inet6(proc, &prefix->router->addr, IP_NULL), ife->ipmip6.iff.ifname)); } } IP_STATIC void ipmip6ha_ifevent_prefix_expire(Ipmip6ha_context_t *ctx, Ipmip_proc_t *proc, Ipmip6ha_if_t *ife, Ipmip6_if_prefix_t *prefix) { Ipmip6ha_if_route_entry_t *se; IPMIP_UNUSED_PARAMETER(ctx); IPMIP_UNUSED_PARAMETER(proc); if (IP_BIT_ISSET(prefix->flags, IPMIP6_ND_OPT_PI_FLAG_ONLINK)) { struct Ip_in6_addr lkey; ipmip6_address_create_prefix(&lkey, &prefix->prefix.prefix, prefix->prefix.len); ipcom_mutex_lock(ctx->prefixes_lock); /* Found, already in the table */ if ((se = (Ipmip6ha_if_route_entry_t *)ipmip_route_lookup_exact(ctx->prefixes, &prefix->prefix.prefix, prefix->prefix.len)) != IP_NULL) { if (--se->refcnt == 0) ipmip_route_delete(ctx->prefixes, &se->ipmip); IPMIP6_EVENT_IF(INFO, proc, ipmip_log_event_add(&ctx->ipmip6.ipmip, proc, "Removing on-link prefix %s/%d@%s from configuration %s", ipmip_ntop_inet6(proc, &lkey, IP_NULL), prefix->prefix.len, ipmip_ntop_inet6(proc, &prefix->router->addr, IP_NULL), ife->ipmip6.iff.ifname)); } ipcom_mutex_unlock(ctx->prefixes_lock); } } IP_STATIC void ipmip6ha_ifevent_prefix_advertise(Ipmip6_context_t *ctx, Ipmip_proc_t *proc, Ipmip6_if_t *ife, Ipmip6_if_prefix_t *prefix) { IPMIP_UNUSED_PARAMETER(ctx); IPMIP_UNUSED_PARAMETER(proc); IPMIP_UNUSED_PARAMETER(ife); IPMIP_UNUSED_PARAMETER(prefix); /* ipmip6m_coa_advertise_prefix(prefix); */ } IP_STATIC void ipmip6ha_ifevent_prefix_update(Ipmip6ha_context_t *ctx, Ipmip_proc_t *proc, Ipmip6ha_if_t *ife, Ipmip6_if_prefix_t *prefix) { Ipmip6ha_if_route_entry_t *se; IPMIP_UNUSED_PARAMETER(ctx); IPMIP_UNUSED_PARAMETER(proc); if (IP_BIT_ISSET(prefix->flags, IPMIP6_ND_OPT_PI_FLAG_ONLINK)) { struct Ip_in6_addr lkey; ipmip6_address_create_prefix(&lkey, &prefix->prefix.prefix, prefix->prefix.len); ipcom_mutex_lock(ctx->prefixes_lock); /* Found, already in the table */ if ((se = (Ipmip6ha_if_route_entry_t *)ipmip_route_lookup_exact(ctx->prefixes, &lkey, prefix->prefix.len)) != IP_NULL) { se->timestamp = prefix->stamp; se->valid = prefix->valid; se->ifp = ife; #if 0 IPMIP6_EVENT_IF(DEBUG2, proc, ipmip_log_event_add(&ctx->ipmip6.ipmip, proc, "Updating on-link prefix %s/%d@%s in configuration %s (%s - %d)", ipmip_ntop_inet6(proc, &lkey, IP_NULL), prefix->prefix.len, ipmip_ntop_inet6(proc, &prefix->router->addr, IP_NULL), ife->ipmip6.iff.ifname, ipmip_ntop_time(proc, se->timestamp))); #endif } else { IPMIP6_EVENT_IF(INFO, proc, ipmip_log_event_add(&ctx->ipmip6.ipmip, proc, "On-link prefix %s/%d@%s not found in configuration %s", ipmip_ntop_inet6(proc, &lkey, IP_NULL), prefix->prefix.len, ipmip_ntop_inet6(proc, &prefix->router->addr, IP_NULL), ife->ipmip6.iff.ifname)); } ipcom_mutex_unlock(ctx->prefixes_lock); } } /* **************************************************************************** * 10 GLOBAL FUNCTIONS **************************************************************************** */ /* **************************************************************************** * 11 PUBLIC FUNCTIONS **************************************************************************** */ /* **************************************************************************** * END OF FILE **************************************************************************** */