summaryrefslogtreecommitdiff
path: root/zebra/rtadv.c
diff options
context:
space:
mode:
Diffstat (limited to 'zebra/rtadv.c')
-rw-r--r--zebra/rtadv.c38
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)