diff options
Diffstat (limited to 'zebra/rtadv.c')
| -rw-r--r-- | zebra/rtadv.c | 38 |
1 files changed, 30 insertions, 8 deletions
diff --git a/zebra/rtadv.c b/zebra/rtadv.c index d0b821bfd2..d62ed3a5e4 100644 --- a/zebra/rtadv.c +++ b/zebra/rtadv.c @@ -45,6 +45,8 @@ #include "zebra/zebra_vrf.h" extern struct zebra_privs_t zserv_privs; +/* currently undefined in icmp6.h */ +bool AdvGoAwayFlag; #if defined(HAVE_RTADV) @@ -95,7 +97,7 @@ static int rtadv_increment_received(struct zebra_ns *zns, ifindex_t *ifindex) return ret; } -static int rtadv_recv_packet(struct zebra_ns *zns, int sock, u_char *buf, +static int rtadv_recv_packet(struct zebra_ns *zns, int sock, uint8_t *buf, int buflen, struct sockaddr_in6 *from, ifindex_t *ifindex, int *hoplimit) { @@ -164,10 +166,10 @@ static void rtadv_send_packet(int sock, struct interface *ifp) int len = 0; struct zebra_if *zif; struct rtadv_prefix *rprefix; - u_char all_nodes_addr[] = {0xff, 0x02, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1}; + uint8_t all_nodes_addr[] = {0xff, 0x02, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1}; struct listnode *node; - u_int16_t pkt_RouterLifetime; + uint16_t pkt_RouterLifetime; /* * Allocate control message bufffer. This is dynamic because @@ -224,6 +226,9 @@ static void rtadv_send_packet(int sock, struct interface *ifp) rtadv->nd_ra_flags_reserved |= ND_RA_FLAG_OTHER; if (zif->rtadv.AdvHomeAgentFlag) rtadv->nd_ra_flags_reserved |= ND_RA_FLAG_HOME_AGENT; + if (AdvGoAwayFlag) + rtadv->nd_ra_flags_reserved |= ND_RA_FLAG_V4_GOAWAY; + /* Note that according to Neighbor Discovery (RFC 4861 [18]), * AdvDefaultLifetime is by default based on the value of * MaxRtrAdvInterval. AdvDefaultLifetime is used in the Router Lifetime @@ -315,7 +320,7 @@ static void rtadv_send_packet(int sock, struct interface *ifp) #ifdef DEBUG { - u_char buf[INET6_ADDRSTRLEN]; + uint8_t buf[INET6_ADDRSTRLEN]; zlog_debug("DEBUG %s", inet_ntop(AF_INET6, &pinfo->nd_opt_pi_prefix, @@ -452,7 +457,7 @@ static void rtadv_process_solicit(struct interface *ifp) rtadv_send_packet(zns->rtadv.sock, ifp); } -static void rtadv_process_advert(u_char *msg, unsigned int len, +static void rtadv_process_advert(uint8_t *msg, unsigned int len, struct interface *ifp, struct sockaddr_in6 *addr) { @@ -526,7 +531,7 @@ static void rtadv_process_advert(u_char *msg, unsigned int len, } -static void rtadv_process_packet(u_char *buf, unsigned int len, +static void rtadv_process_packet(uint8_t *buf, unsigned int len, ifindex_t ifindex, int hoplimit, struct sockaddr_in6 *from, struct zebra_ns *zns) @@ -596,7 +601,7 @@ static int rtadv_read(struct thread *thread) { int sock; int len; - u_char buf[RTADV_MSG_SIZE]; + uint8_t buf[RTADV_MSG_SIZE]; struct sockaddr_in6 from; ifindex_t ifindex = 0; int hoplimit = -1; @@ -1495,6 +1500,19 @@ DEFUN (no_ipv6_nd_mtu, return CMD_SUCCESS; } +DEFUN (ipv6_nd_v4_goaway, + ipv6_nd_v4_goaway_cmd, + "[no] ipv6 nd v4 goaway", + NO_STR + "Interface IPv6 config commands\n" + "Neighbor discovery\n" + "v4 RA flags\n" + "Set V4 GoAway Flag\n") +{ + AdvGoAwayFlag = !strmatch(argv[0]->text, "no"); + return CMD_SUCCESS; +} + /* Dump interface ND information to vty. */ static int nd_dump_vty(struct vty *vty, struct interface *ifp) { @@ -1626,6 +1644,9 @@ static int rtadv_config_write(struct vty *vty, struct interface *ifp) if (zif->rtadv.AdvLinkMTU) vty_out(vty, " ipv6 nd mtu %d\n", zif->rtadv.AdvLinkMTU); + if (AdvGoAwayFlag) + vty_out(vty, " ipv6 nd v4 goaway\n"); + for (ALL_LIST_ELEMENTS_RO(zif->rtadv.AdvPrefixList, node, rprefix)) { vty_out(vty, " ipv6 nd prefix %s", prefix2str(&rprefix->prefix, buf, sizeof(buf))); @@ -1744,6 +1765,7 @@ void rtadv_cmd_init(void) install_element(INTERFACE_NODE, &no_ipv6_nd_router_preference_cmd); install_element(INTERFACE_NODE, &ipv6_nd_mtu_cmd); install_element(INTERFACE_NODE, &no_ipv6_nd_mtu_cmd); + install_element(INTERFACE_NODE, &ipv6_nd_v4_goaway_cmd); } static int if_join_all_router(int sock, struct interface *ifp) |
