summaryrefslogtreecommitdiff
path: root/ospf6d/ospf6_zebra.c
diff options
context:
space:
mode:
Diffstat (limited to 'ospf6d/ospf6_zebra.c')
-rw-r--r--ospf6d/ospf6_zebra.c23
1 files changed, 22 insertions, 1 deletions
diff --git a/ospf6d/ospf6_zebra.c b/ospf6d/ospf6_zebra.c
index 76e7172870..170d545c49 100644
--- a/ospf6d/ospf6_zebra.c
+++ b/ospf6d/ospf6_zebra.c
@@ -130,17 +130,38 @@ void ospf6_zebra_no_redistribute(int type, vrf_id_t vrf_id)
static int ospf6_zebra_if_address_update_add(ZAPI_CALLBACK_ARGS)
{
struct connected *c;
+ struct ospf6_interface *oi;
+ int ipv6_count = 0;
c = zebra_interface_address_read(ZEBRA_INTERFACE_ADDRESS_ADD,
zclient->ibuf, vrf_id);
if (c == NULL)
return 0;
+ oi = (struct ospf6_interface *)c->ifp->info;
+ if (oi == NULL)
+ oi = ospf6_interface_create(c->ifp);
+ assert(oi);
+
if (IS_OSPF6_DEBUG_ZEBRA(RECV))
zlog_debug("Zebra Interface address add: %s %5s %pFX",
c->ifp->name, prefix_family_str(c->address),
c->address);
+ ipv6_count = connected_count_by_family(c->ifp, AF_INET6);
+ if (oi->ifmtu == OSPF6_DEFAULT_MTU && ipv6_count > OSPF6_MAX_IF_ADDRS) {
+ zlog_warn(
+ "Zebra Interface : %s has too many interface addresses %d only support %d, increase MTU",
+ c->ifp->name, ipv6_count, OSPF6_MAX_IF_ADDRS);
+ return 0;
+ } else if (oi->ifmtu >= OSPF6_JUMBO_MTU
+ && ipv6_count > OSPF6_MAX_IF_ADDRS_JUMBO) {
+ zlog_warn(
+ "Zebra Interface : %s has too many interface addresses %d only support %d",
+ c->ifp->name, ipv6_count, OSPF6_MAX_IF_ADDRS_JUMBO);
+ return 0;
+ }
+
if (c->address->family == AF_INET6) {
ospf6_interface_state_update(c->ifp);
ospf6_interface_connected_route_update(c->ifp);
@@ -303,7 +324,7 @@ static void ospf6_zebra_route_update(int type, struct ospf6_route *request,
struct prefix *dest;
if (IS_OSPF6_DEBUG_ZEBRA(SEND))
- zlog_debug("Send %s route: %pFX",
+ zlog_debug("Zebra Send %s route: %pFX",
(type == REM ? "remove" : "add"), &request->prefix);
if (zclient->sock < 0) {