static int if_join_all_router(int, struct interface *);
static int if_leave_all_router(int, struct interface *);
+static int rtadv_get_socket(struct zebra_vrf *zvrf)
+{
+ if (zvrf->rtadv.sock > 0)
+ return zvrf->rtadv.sock;
+ return zrouter.rtadv_sock;
+}
+
static int rtadv_increment_received(struct zebra_vrf *zvrf, ifindex_t *ifindex)
{
int ret = -1;
"Fast RA Rexmit on interface %s",
ifp->name);
- rtadv_send_packet(zvrf->rtadv.sock,
+ rtadv_send_packet(rtadv_get_socket(zvrf),
ifp);
} else {
zif->rtadv.AdvIntervalTimer -= period;
zif->rtadv
.MaxRtrAdvInterval;
rtadv_send_packet(
- zvrf->rtadv.sock,
- ifp);
+ rtadv_get_socket(zvrf),
+ ifp);
}
}
}
struct zebra_vrf *zvrf = vrf_info_lookup(ifp->vrf_id);
assert(zvrf);
- rtadv_send_packet(zvrf->rtadv.sock, ifp);
+ rtadv_send_packet(rtadv_get_socket(zvrf), ifp);
}
/*
zif->rtadv.AdvIntervalTimer = 0;
zvrf->rtadv.adv_if_count--;
- if_leave_all_router(zvrf->rtadv.sock, ifp);
+ if_leave_all_router(rtadv_get_socket(zvrf), ifp);
if (zvrf->rtadv.adv_if_count == 0)
rtadv_event(zvrf, RTADV_STOP, 0);
RTADV_NUM_FAST_REXMITS;
}
- if_join_all_router(zvrf->rtadv.sock, ifp);
+ if_join_all_router(rtadv_get_socket(zvrf), ifp);
if (zvrf->rtadv.adv_if_count == 1)
rtadv_event(zvrf, RTADV_START,
- zvrf->rtadv.sock);
+ rtadv_get_socket(zvrf));
}
}
}
void rtadv_init(struct zebra_vrf *zvrf)
{
- zvrf->rtadv.sock = rtadv_make_socket(zvrf->zns->ns_id);
+ if (vrf_is_backend_netns()) {
+ zvrf->rtadv.sock = rtadv_make_socket(zvrf->zns->ns_id);
+ zrouter.rtadv_sock = -1;
+ } else if (!zrouter.rtadv_sock) {
+ zvrf->rtadv.sock = -1;
+ if (!zrouter.rtadv_sock)
+ zrouter.rtadv_sock = rtadv_make_socket(zvrf->zns->ns_id);
+ }
}
void rtadv_terminate(struct zebra_vrf *zvrf)
if (zvrf->rtadv.sock >= 0) {
close(zvrf->rtadv.sock);
zvrf->rtadv.sock = -1;
+ } else if (zrouter.rtadv_sock >= 0) {
+ close(zrouter.rtadv_sock);
+ zrouter.rtadv_sock = -1;
}
-
zvrf->rtadv.adv_if_count = 0;
zvrf->rtadv.adv_msec_if_count = 0;
}