summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/agentx.c5
-rw-r--r--lib/bfd.c6
-rw-r--r--lib/command.c30
-rw-r--r--lib/command_match.c2
-rw-r--r--lib/filter.c21
-rw-r--r--lib/if.c6
-rw-r--r--lib/if.h11
-rw-r--r--lib/log.c44
-rw-r--r--lib/log.h2
-rw-r--r--lib/plist.c14
-rw-r--r--lib/prefix.c66
-rwxr-xr-xlib/route_types.pl39
-rw-r--r--lib/route_types.txt8
-rw-r--r--lib/routemap.c29
-rw-r--r--lib/smux.c44
-rw-r--r--lib/sockopt.c8
-rw-r--r--lib/sockopt.h7
-rw-r--r--lib/sockunion.c43
-rw-r--r--lib/sockunion.h4
-rw-r--r--lib/table.c2
-rw-r--r--lib/table.h2
-rw-r--r--lib/version.h.in26
-rw-r--r--lib/vrf.c8
-rw-r--r--lib/vty.c186
-rw-r--r--lib/vty.h2
-rw-r--r--lib/zclient.c2
-rw-r--r--lib/zclient.h4
-rw-r--r--lib/zebra.h61
28 files changed, 238 insertions, 444 deletions
diff --git a/lib/agentx.c b/lib/agentx.c
index 5996b34a0f..4175e7ba92 100644
--- a/lib/agentx.c
+++ b/lib/agentx.c
@@ -31,6 +31,7 @@
#include "smux.h"
#include "memory.h"
#include "linklist.h"
+#include "version.h"
static int agentx_enabled = 0;
@@ -175,7 +176,7 @@ DEFUN (agentx_enable,
{
if (!agentx_enabled)
{
- init_snmp("quagga");
+ init_snmp(FRR_SMUX_NAME);
events = list_new();
agentx_events_update ();
agentx_enabled = 1;
@@ -209,7 +210,7 @@ smux_init (struct thread_master *tm)
SNMP_CALLBACK_LOGGING,
agentx_log_callback,
NULL);
- init_agent ("quagga");
+ init_agent (FRR_SMUX_NAME);
install_node (&agentx_node, config_write_agentx);
install_element (CONFIG_NODE, &agentx_enable_cmd);
diff --git a/lib/bfd.c b/lib/bfd.c
index a498daf762..5db08fea60 100644
--- a/lib/bfd.c
+++ b/lib/bfd.c
@@ -179,11 +179,9 @@ bfd_peer_sendmsg (struct zclient *zclient, struct bfd_info *bfd_info,
case AF_INET:
stream_put_in_addr (s, (struct in_addr *)dst_ip);
break;
-#ifdef HAVE_IPV6
case AF_INET6:
stream_put(s, dst_ip, 16);
break;
-#endif
default:
break;
}
@@ -207,11 +205,9 @@ bfd_peer_sendmsg (struct zclient *zclient, struct bfd_info *bfd_info,
case AF_INET:
stream_put_in_addr (s, (struct in_addr *) src_ip);
break;
- #ifdef HAVE_IPV6
case AF_INET6:
stream_put(s, src_ip, 16);
break;
- #endif
default:
break;
}
@@ -221,13 +217,11 @@ bfd_peer_sendmsg (struct zclient *zclient, struct bfd_info *bfd_info,
else
{
stream_putc(s, 0);
-#ifdef HAVE_IPV6
if ((family == AF_INET6) && (src_ip))
{
stream_putw(s, family);
stream_put(s, src_ip, 16);
}
-#endif
if (if_name)
{
len = strlen(if_name);
diff --git a/lib/command.c b/lib/command.c
index ca0d0c001b..6294e994e7 100644
--- a/lib/command.c
+++ b/lib/command.c
@@ -85,12 +85,7 @@ static struct cmd_node config_node =
};
/* Default motd string. */
-static const char *default_motd =
-"\r\n\
-Hello, this is " QUAGGA_PROGNAME " (version " QUAGGA_VERSION ").\r\n\
-" QUAGGA_COPYRIGHT "\r\n\
-" GIT_INFO "\r\n";
-
+static const char *default_motd = FRR_DEFAULT_MOTD;
static const struct facility_map {
int facility;
@@ -159,9 +154,9 @@ level_match(const char *s)
void
print_version (const char *progname)
{
- printf ("%s version %s\n", progname, QUAGGA_VERSION);
- printf ("%s\n", QUAGGA_COPYRIGHT);
- printf ("configured with:\n\t%s\n", QUAGGA_CONFIG_ARGS);
+ printf ("%s version %s\n", progname, FRR_VERSION);
+ printf ("%s\n", FRR_COPYRIGHT);
+ printf ("configured with:\n\t%s\n", FRR_CONFIG_ARGS);
}
@@ -304,6 +299,9 @@ cmd_concat_strvec (vector v)
if (vector_slot (v, i))
strsize += strlen ((char *) vector_slot (v, i)) + 1;
+ if (strsize == 0)
+ return XSTRDUP (MTYPE_TMP, "");
+
char *concatenated = calloc (sizeof (char), strsize);
for (unsigned int i = 0; i < vector_active (v); i++)
{
@@ -1213,11 +1211,12 @@ DEFUN (show_version,
SHOW_STR
"Displays zebra version\n")
{
- vty_out (vty, "Quagga %s (%s).%s", QUAGGA_VERSION, host.name?host.name:"",
- VTY_NEWLINE);
- vty_out (vty, "%s%s%s", QUAGGA_COPYRIGHT, GIT_INFO, VTY_NEWLINE);
+ vty_out (vty, "%s %s (%s).%s", FRR_FULL_NAME, FRR_VERSION,
+ host.name ? host.name : "",
+ VTY_NEWLINE);
+ vty_out (vty, "%s%s%s", FRR_COPYRIGHT, GIT_INFO, VTY_NEWLINE);
vty_out (vty, "configured with:%s %s%s", VTY_NEWLINE,
- QUAGGA_CONFIG_ARGS, VTY_NEWLINE);
+ FRR_CONFIG_ARGS, VTY_NEWLINE);
return CMD_SUCCESS;
}
@@ -2300,7 +2299,7 @@ install_default (enum node_type node)
*
* terminal = 0 -- vtysh / no logging, no config control
* terminal = 1 -- normal daemon
- * terminal = -1 -- watchquagga / no logging, but minimal config control */
+ * terminal = -1 -- watchfrr / no logging, but minimal config control */
void
cmd_init (int terminal)
{
@@ -2404,12 +2403,13 @@ cmd_init (int terminal)
struct cmd_token *
new_cmd_token (enum cmd_token_type type, u_char attr, char *text, char *desc)
{
- struct cmd_token *token = XMALLOC (MTYPE_CMD_TOKENS, sizeof (struct cmd_token));
+ struct cmd_token *token = XCALLOC (MTYPE_CMD_TOKENS, sizeof (struct cmd_token));
token->type = type;
token->attr = attr;
token->text = text;
token->desc = desc;
token->arg = NULL;
+ token->allowrepeat = false;
return token;
}
diff --git a/lib/command_match.c b/lib/command_match.c
index 62905a4f7f..d228563240 100644
--- a/lib/command_match.c
+++ b/lib/command_match.c
@@ -482,7 +482,7 @@ add_nexthops (struct list *list, struct graph_node *node,
child = vector_slot (node->to, i);
size_t j;
struct cmd_token *token = child->data;
- if (!token->allowrepeat)
+ if (!token->allowrepeat && stack)
{
for (j = 0; j < stackpos; j++)
if (child == stack[j])
diff --git a/lib/filter.c b/lib/filter.c
index 072d3ddc2e..cd17a562f0 100644
--- a/lib/filter.c
+++ b/lib/filter.c
@@ -105,7 +105,6 @@ static struct access_master access_master_ipv4 =
NULL,
};
-#ifdef HAVE_IPV6
/* Static structure for IPv6 access_list's master. */
static struct access_master access_master_ipv6 =
{
@@ -114,17 +113,14 @@ static struct access_master access_master_ipv6 =
NULL,
NULL,
};
-#endif /* HAVE_IPV6 */
static struct access_master *
access_master_get (afi_t afi)
{
if (afi == AFI_IP)
return &access_master_ipv4;
-#ifdef HAVE_IPV6
else if (afi == AFI_IP6)
return &access_master_ipv6;
-#endif /* HAVE_IPV6 */
return NULL;
}
@@ -434,9 +430,7 @@ void
access_list_add_hook (void (*func) (struct access_list *access))
{
access_master_ipv4.add_hook = func;
-#ifdef HAVE_IPV6
access_master_ipv6.add_hook = func;
-#endif /* HAVE_IPV6 */
}
/* Delete hook function. */
@@ -444,9 +438,7 @@ void
access_list_delete_hook (void (*func) (struct access_list *access))
{
access_master_ipv4.delete_hook = func;
-#ifdef HAVE_IPV6
access_master_ipv6.delete_hook = func;
-#endif /* HAVE_IPV6 */
}
/* Add new filter to the end of specified access_list. */
@@ -1289,7 +1281,6 @@ filter_set_zebra (struct vty *vty, const char *name_str, const char *type_str,
return CMD_WARNING;
}
}
-#ifdef HAVE_IPV6
else if (afi == AFI_IP6)
{
ret = str2prefix_ipv6 (prefix_str, (struct prefix_ipv6 *) &p);
@@ -1300,7 +1291,6 @@ filter_set_zebra (struct vty *vty, const char *name_str, const char *type_str,
return CMD_WARNING;
}
}
-#endif /* HAVE_IPV6 */
else
return CMD_WARNING;
@@ -1530,7 +1520,6 @@ DEFUN (no_access_list_remark_comment,
}
-#ifdef HAVE_IPV6
DEFUN (ipv6_access_list,
ipv6_access_list_cmd,
"ipv6 access-list WORD <deny|permit> X:X::X:X/M",
@@ -1716,8 +1705,6 @@ DEFUN (no_ipv6_access_list_remark_comment,
{
return no_ipv6_access_list_remark (self, vty, argc, argv);
}
-
-#endif /* HAVE_IPV6 */
void config_write_access_zebra (struct vty *, struct filter *);
void config_write_access_cisco (struct vty *, struct filter *);
@@ -1855,7 +1842,6 @@ DEFUN (show_ip_access_list_name,
return filter_show (vty, argv[idx_acl]->arg, AFI_IP);
}
-#ifdef HAVE_IPV6
DEFUN (show_ipv6_access_list,
show_ipv6_access_list_cmd,
"show ipv6 access-list",
@@ -1877,7 +1863,6 @@ DEFUN (show_ipv6_access_list_name,
int idx_word = 3;
return filter_show (vty, argv[idx_word]->arg, AFI_IP6);
}
-#endif /* HAVE_IPV6 */
void
config_write_access_cisco (struct vty *vty, struct filter *mfilter)
@@ -2109,7 +2094,6 @@ access_list_init_ipv4 (void)
install_element (CONFIG_NODE, &no_access_list_remark_comment_cmd);
}
-#ifdef HAVE_IPV6
static struct cmd_node access_ipv6_node =
{
ACCESS_IPV6_NODE,
@@ -2172,22 +2156,17 @@ access_list_init_ipv6 (void)
install_element (CONFIG_NODE, &no_ipv6_access_list_remark_cmd);
install_element (CONFIG_NODE, &no_ipv6_access_list_remark_comment_cmd);
}
-#endif /* HAVE_IPV6 */
void
access_list_init ()
{
access_list_init_ipv4 ();
-#ifdef HAVE_IPV6
access_list_init_ipv6();
-#endif /* HAVE_IPV6 */
}
void
access_list_reset ()
{
access_list_reset_ipv4 ();
-#ifdef HAVE_IPV6
access_list_reset_ipv6();
-#endif /* HAVE_IPV6 */
}
diff --git a/lib/if.c b/lib/if.c
index fb12f201b2..20f792b8f8 100644
--- a/lib/if.c
+++ b/lib/if.c
@@ -1019,11 +1019,9 @@ connected_same_prefix (struct prefix *p1, struct prefix *p2)
if (p1->family == AF_INET &&
IPV4_ADDR_SAME (&p1->u.prefix4, &p2->u.prefix4))
return 1;
-#ifdef HAVE_IPV6
if (p1->family == AF_INET6 &&
IPV6_ADDR_SAME (&p1->u.prefix6, &p2->u.prefix6))
return 1;
-#endif /* HAVE_IPV6 */
}
return 0;
}
@@ -1302,7 +1300,7 @@ if_link_params_get (struct interface *ifp)
sizeof (struct if_link_params));
if (iflp == NULL) return NULL;
- /* Set TE metric == standard metric */
+ /* Set TE metric equal to standard metric */
iflp->te_metric = ifp->metric;
/* Compute default bandwidth based on interface */
@@ -1316,7 +1314,7 @@ if_link_params_get (struct interface *ifp)
iflp->unrsv_bw[i] = iflp->default_bw;
/* Update Link parameters status */
- iflp->lp_status = LP_TE | LP_MAX_BW | LP_MAX_RSV_BW | LP_UNRSV_BW;
+ iflp->lp_status = LP_TE_METRIC | LP_MAX_BW | LP_MAX_RSV_BW | LP_UNRSV_BW;
/* Finally attach newly created Link Parameters */
ifp->link_params = iflp;
diff --git a/lib/if.h b/lib/if.h
index e8a3b9d7b5..32e5d92a97 100644
--- a/lib/if.h
+++ b/lib/if.h
@@ -146,9 +146,13 @@ struct if_stats
#define MAX_CLASS_TYPE 8
#define MAX_PKT_LOSS 50.331642
-/* Link Parameters Status: 0: unset, 1: set, */
+/*
+ * Link Parameters Status:
+ * equal to 0: unset
+ * different from 0: set
+ */
#define LP_UNSET 0x0000
-#define LP_TE 0x0001
+#define LP_TE_METRIC 0x0001
#define LP_MAX_BW 0x0002
#define LP_MAX_RSV_BW 0x0004
#define LP_UNRSV_BW 0x0008
@@ -161,7 +165,6 @@ struct if_stats
#define LP_RES_BW 0x0400
#define LP_AVA_BW 0x0800
#define LP_USE_BW 0x1000
-#define LP_TE_METRIC 0x2000
#define IS_PARAM_UNSET(lp, st) !(lp->lp_status & st)
#define IS_PARAM_SET(lp, st) (lp->lp_status & st)
@@ -224,7 +227,7 @@ struct interface
uint64_t flags;
/* Interface metric */
- int metric;
+ uint32_t metric;
/* Interface MTU. */
unsigned int mtu; /* IPv4 MTU */
diff --git a/lib/log.c b/lib/log.c
index 67f335c6ae..13592a0240 100644
--- a/lib/log.c
+++ b/lib/log.c
@@ -20,7 +20,7 @@
* 02111-1307, USA.
*/
-#define QUAGGA_DEFINE_DESC_TABLE
+#define FRR_DEFINE_DESC_TABLE
#include <zebra.h>
@@ -59,7 +59,7 @@ const char *zlog_proto_names[] =
"ISIS",
"PIM",
"RFP",
- "WATCHQUAGGA",
+ "WATCHFRR",
NULL,
};
@@ -1062,48 +1062,48 @@ proto_redistnum(int afi, const char *s)
if (afi == AFI_IP)
{
- if (strncmp (s, "k", 1) == 0)
+ if (strmatch (s, "kernel"))
return ZEBRA_ROUTE_KERNEL;
- else if (strncmp (s, "c", 1) == 0)
+ else if (strmatch (s, "connected"))
return ZEBRA_ROUTE_CONNECT;
- else if (strncmp (s, "s", 1) == 0)
+ else if (strmatch (s, "static"))
return ZEBRA_ROUTE_STATIC;
- else if (strncmp (s, "r", 1) == 0)
+ else if (strmatch (s, "rip"))
return ZEBRA_ROUTE_RIP;
- else if (strncmp (s, "o", 1) == 0)
+ else if (strmatch (s, "ospf"))
return ZEBRA_ROUTE_OSPF;
- else if (strncmp (s, "i", 1) == 0)
+ else if (strmatch (s, "isis"))
return ZEBRA_ROUTE_ISIS;
- else if (strncmp (s, "bg", 2) == 0)
+ else if (strmatch (s, "bgp"))
return ZEBRA_ROUTE_BGP;
- else if (strncmp (s, "ta", 2) == 0)
+ else if (strmatch (s, "table"))
return ZEBRA_ROUTE_TABLE;
- else if (strncmp (s, "v", 1) == 0)
+ else if (strmatch (s, "vnc"))
return ZEBRA_ROUTE_VNC;
- else if (strncmp (s, "vd", 1) == 0)
+ else if (strmatch (s, "vnc-direct"))
return ZEBRA_ROUTE_VNC_DIRECT;
}
if (afi == AFI_IP6)
{
- if (strncmp (s, "k", 1) == 0)
+ if (strmatch (s, "kernel"))
return ZEBRA_ROUTE_KERNEL;
- else if (strncmp (s, "c", 1) == 0)
+ else if (strmatch (s, "connected"))
return ZEBRA_ROUTE_CONNECT;
- else if (strncmp (s, "s", 1) == 0)
+ else if (strmatch (s, "static"))
return ZEBRA_ROUTE_STATIC;
- else if (strncmp (s, "r", 1) == 0)
+ else if (strmatch (s, "ripng"))
return ZEBRA_ROUTE_RIPNG;
- else if (strncmp (s, "o", 1) == 0)
+ else if (strmatch (s, "ospf6"))
return ZEBRA_ROUTE_OSPF6;
- else if (strncmp (s, "i", 1) == 0)
+ else if (strmatch (s, "isis"))
return ZEBRA_ROUTE_ISIS;
- else if (strncmp (s, "bg", 2) == 0)
+ else if (strmatch (s, "bgp"))
return ZEBRA_ROUTE_BGP;
- else if (strncmp (s, "ta", 2) == 0)
+ else if (strmatch (s, "table"))
return ZEBRA_ROUTE_TABLE;
- else if (strncmp (s, "v", 1) == 0)
+ else if (strmatch (s, "vnc"))
return ZEBRA_ROUTE_VNC;
- else if (strncmp (s, "vd", 1) == 0)
+ else if (strmatch (s, "vnc-direct"))
return ZEBRA_ROUTE_VNC_DIRECT;
}
return -1;
diff --git a/lib/log.h b/lib/log.h
index b36e5fbc80..3413cae5a9 100644
--- a/lib/log.h
+++ b/lib/log.h
@@ -59,7 +59,7 @@ typedef enum
ZLOG_ISIS,
ZLOG_PIM,
ZLOG_RFP,
- ZLOG_WATCHQUAGGA,
+ ZLOG_WATCHFRR,
} zlog_proto_t;
/* If maxlvl is set to ZLOG_DISABLED, then no messages will be sent
diff --git a/lib/plist.c b/lib/plist.c
index 1f5e595fd8..279c85d6d6 100644
--- a/lib/plist.c
+++ b/lib/plist.c
@@ -103,7 +103,6 @@ static struct prefix_master prefix_master_ipv4 =
PLC_MAXLEVELV4,
};
-#ifdef HAVE_IPV6
/* Static structure of IPv6 prefix-list's master. */
static struct prefix_master prefix_master_ipv6 =
{
@@ -115,7 +114,6 @@ static struct prefix_master prefix_master_ipv6 =
NULL,
PLC_MAXLEVELV6,
};
-#endif /* HAVE_IPV6*/
/* Static structure of BGP ORF prefix_list's master. */
static struct prefix_master prefix_master_orf_v4 =
@@ -408,9 +406,7 @@ void
prefix_list_add_hook (void (*func) (struct prefix_list *plist))
{
prefix_master_ipv4.add_hook = func;
-#ifdef HAVE_IPV6
prefix_master_ipv6.add_hook = func;
-#endif /* HAVE_IPV6 */
}
/* Delete hook function. */
@@ -418,9 +414,7 @@ void
prefix_list_delete_hook (void (*func) (struct prefix_list *plist))
{
prefix_master_ipv4.delete_hook = func;
-#ifdef HAVE_IPV6
prefix_master_ipv6.delete_hook = func;
-#endif /* HAVE_IPVt6 */
}
/* Calculate new sequential number. */
@@ -1102,7 +1096,6 @@ vty_prefix_list_uninstall (struct vty *vty, afi_t afi, const char *name,
return CMD_WARNING;
}
}
-#ifdef HAVE_IPV6
else if (afi == AFI_IP6)
{
if (strncmp ("any", prefix, strlen (prefix)) == 0)
@@ -1120,7 +1113,6 @@ vty_prefix_list_uninstall (struct vty *vty, afi_t afi, const char *name,
return CMD_WARNING;
}
}
-#endif /* HAVE_IPV6 */
/* Lookup prefix entry. */
pentry = prefix_list_entry_lookup(plist, &p, type, seqnum, lenum, genum);
@@ -2128,7 +2120,6 @@ DEFUN (clear_ip_prefix_list_name_prefix,
return vty_clear_prefix_list (vty, AFI_IP, argv[idx_word]->arg, argv[idx_ipv4_prefixlen]->arg);
}
-#ifdef HAVE_IPV6
DEFUN (ipv6_prefix_list,
ipv6_prefix_list_cmd,
"ipv6 prefix-list WORD <deny|permit> <X:X::X:X/M|any>",
@@ -2839,7 +2830,6 @@ DEFUN (clear_ipv6_prefix_list_name_prefix,
int idx_ipv6_prefixlen = 4;
return vty_clear_prefix_list (vty, AFI_IP6, argv[idx_word]->arg, argv[idx_ipv6_prefixlen]->arg);
}
-#endif /* HAVE_IPV6 */
/* Configuration write function. */
static int
@@ -3214,7 +3204,6 @@ prefix_list_init_ipv4 (void)
install_element (ENABLE_NODE, &clear_ip_prefix_list_name_prefix_cmd);
}
-#ifdef HAVE_IPV6
/* Prefix-list node. */
static struct cmd_node prefix_ipv6_node =
{
@@ -3279,15 +3268,12 @@ prefix_list_init_ipv6 (void)
install_element (ENABLE_NODE, &clear_ipv6_prefix_list_name_cmd);
install_element (ENABLE_NODE, &clear_ipv6_prefix_list_name_prefix_cmd);
}
-#endif /* HAVE_IPV6 */
void
prefix_list_init ()
{
prefix_list_init_ipv4 ();
-#ifdef HAVE_IPV6
prefix_list_init_ipv6 ();
-#endif /* HAVE_IPV6 */
}
void
diff --git a/lib/prefix.c b/lib/prefix.c
index 112dae5822..8289593781 100644
--- a/lib/prefix.c
+++ b/lib/prefix.c
@@ -207,10 +207,8 @@ afi2family (afi_t afi)
{
if (afi == AFI_IP)
return AF_INET;
-#ifdef HAVE_IPV6
else if (afi == AFI_IP6)
return AF_INET6;
-#endif /* HAVE_IPV6 */
else if (afi == AFI_ETHER)
return AF_ETHERNET;
return 0;
@@ -221,10 +219,8 @@ family2afi (int family)
{
if (family == AF_INET)
return AFI_IP;
-#ifdef HAVE_IPV6
else if (family == AF_INET6)
return AFI_IP6;
-#endif /* HAVE_IPV6 */
else if (family == AF_ETHERNET)
return AFI_ETHER;
return 0;
@@ -302,10 +298,8 @@ prefix_copy (struct prefix *dest, const struct prefix *src)
if (src->family == AF_INET)
dest->u.prefix4 = src->u.prefix4;
-#ifdef HAVE_IPV6
else if (src->family == AF_INET6)
dest->u.prefix6 = src->u.prefix6;
-#endif /* HAVE_IPV6 */
else if (src->family == AF_UNSPEC)
{
dest->u.lp.id = src->u.lp.id;
@@ -345,11 +339,9 @@ prefix_same (const struct prefix *p1, const struct prefix *p2)
if (p1->family == AF_INET)
if (IPV4_ADDR_SAME (&p1->u.prefix4.s_addr, &p2->u.prefix4.s_addr))
return 1;
-#ifdef HAVE_IPV6
if (p1->family == AF_INET6 )
if (IPV6_ADDR_SAME (&p1->u.prefix6.s6_addr, &p2->u.prefix6.s6_addr))
return 1;
-#endif /* HAVE_IPV6 */
if (p1->family == AF_ETHERNET) {
if (!memcmp(p1->u.prefix_eth.octet, p2->u.prefix_eth.octet, ETHER_ADDR_LEN))
return 1;
@@ -414,10 +406,8 @@ prefix_common_bits (const struct prefix *p1, const struct prefix *p2)
if (p1->family == AF_INET)
length = IPV4_MAX_BYTELEN;
-#ifdef HAVE_IPV6
if (p1->family == AF_INET6)
length = IPV6_MAX_BYTELEN;
-#endif
if (p1->family != p2->family || !length)
return -1;
@@ -441,10 +431,8 @@ prefix_family_str (const struct prefix *p)
{
if (p->family == AF_INET)
return "inet";
-#ifdef HAVE_IPV6
if (p->family == AF_INET6)
return "inet6";
-#endif /* HAVE_IPV6 */
if (p->family == AF_ETHERNET)
return "ether";
return "unspec";
@@ -617,8 +605,6 @@ prefix_ipv4_any (const struct prefix_ipv4 *p)
return (p->prefix.s_addr == 0 && p->prefixlen == 0);
}
-#ifdef HAVE_IPV6
-
/* Allocate a new ip version 6 route */
struct prefix_ipv6 *
prefix_ipv6_new (void)
@@ -665,7 +651,7 @@ str2prefix_ipv6 (const char *str, struct prefix_ipv6 *p)
strncpy (cp, str, pnt - str);
*(cp + (pnt - str)) = '\0';
ret = inet_pton (AF_INET6, cp, &p->prefix);
- free (cp);
+ XFREE (MTYPE_TMP, cp);
if (ret == 0)
return 0;
plen = (u_char) atoi (++pnt);
@@ -749,7 +735,6 @@ str2in6_addr (const char *str, struct in6_addr *addr)
addr->s6_addr[i] = x & 0xff;
}
}
-#endif /* HAVE_IPV6 */
void
apply_mask (struct prefix *p)
@@ -759,11 +744,9 @@ apply_mask (struct prefix *p)
case AF_INET:
apply_mask_ipv4 ((struct prefix_ipv4 *)p);
break;
-#ifdef HAVE_IPV6
case AF_INET6:
apply_mask_ipv6 ((struct prefix_ipv6 *)p);
break;
-#endif /* HAVE_IPV6 */
default:
break;
}
@@ -786,7 +769,6 @@ sockunion2prefix (const union sockunion *dest,
p->prefixlen = ip_masklen (mask->sin.sin_addr);
return (struct prefix *) p;
}
-#ifdef HAVE_IPV6
if (dest->sa.sa_family == AF_INET6)
{
struct prefix_ipv6 *p;
@@ -797,7 +779,6 @@ sockunion2prefix (const union sockunion *dest,
memcpy (&p->prefix, &dest->sin6.sin6_addr, sizeof (struct in6_addr));
return (struct prefix *) p;
}
-#endif /* HAVE_IPV6 */
return NULL;
}
@@ -815,7 +796,6 @@ sockunion2hostprefix (const union sockunion *su, struct prefix *prefix)
p->prefixlen = IPV4_MAX_BITLEN;
return (struct prefix *) p;
}
-#ifdef HAVE_IPV6
if (su->sa.sa_family == AF_INET6)
{
struct prefix_ipv6 *p;
@@ -826,7 +806,6 @@ sockunion2hostprefix (const union sockunion *su, struct prefix *prefix)
memcpy (&p->prefix, &su->sin6.sin6_addr, sizeof (struct in6_addr));
return (struct prefix *) p;
}
-#endif /* HAVE_IPV6 */
return NULL;
}
@@ -838,10 +817,8 @@ prefix2sockunion (const struct prefix *p, union sockunion *su)
su->sa.sa_family = p->family;
if (p->family == AF_INET)
su->sin.sin_addr = p->u.prefix4;
-#ifdef HAVE_IPV6
if (p->family == AF_INET6)
memcpy (&su->sin6.sin6_addr, &p->u.prefix6, sizeof (struct in6_addr));
-#endif /* HAVE_IPV6 */
}
int
@@ -852,11 +829,9 @@ prefix_blen (const struct prefix *p)
case AF_INET:
return IPV4_MAX_BYTELEN;
break;
-#ifdef HAVE_IPV6
case AF_INET6:
return IPV6_MAX_BYTELEN;
break;
-#endif /* HAVE_IPV6 */
case AF_ETHERNET:
return ETHER_ADDR_LEN;
}
@@ -874,12 +849,10 @@ str2prefix (const char *str, struct prefix *p)
if (ret)
return ret;
-#ifdef HAVE_IPV6
/* Next we try to convert string to struct prefix_ipv6. */
ret = str2prefix_ipv6 (str, (struct prefix_ipv6 *) p);
if (ret)
return ret;
-#endif /* HAVE_IPV6 */
/* Next we try to convert string to struct prefix_eth. */
ret = str2prefix_eth (str, (struct prefix_eth *) p);
@@ -893,29 +866,22 @@ const char *
prefix2str (union prefix46constptr pu, char *str, int size)
{
const struct prefix *p = pu.p;
- char buf[PREFIX2STR_BUFFER];
-
- if (p->family == AF_ETHERNET) {
- int i;
- char *s = str;
-
- assert(size > (3*ETHER_ADDR_LEN) + 1 /* slash */ + 3 /* plen */ );
- for (i = 0; i < ETHER_ADDR_LEN; ++i) {
- sprintf(s, "%02x", p->u.prefix_eth.octet[i]);
- if (i < (ETHER_ADDR_LEN - 1)) {
- *(s+2) = ':';
- s += 3;
- } else {
- s += 2;
- }
+
+ if (p->family == AF_ETHERNET)
+ {
+ snprintf(str, size, "%02x:%02x:%02x:%02x:%02x:%02x/%d",
+ p->u.prefix_eth.octet[0], p->u.prefix_eth.octet[1],
+ p->u.prefix_eth.octet[2], p->u.prefix_eth.octet[3],
+ p->u.prefix_eth.octet[4], p->u.prefix_eth.octet[5],
+ p->prefixlen);
+ }
+ else
+ {
+ char buf[PREFIX2STR_BUFFER];
+ inet_ntop(p->family, &p->u.prefix, buf, sizeof(buf));
+ snprintf(str, size, "%s/%d", buf, p->prefixlen);
}
- sprintf(s, "/%d", p->prefixlen);
- return 0;
- }
- snprintf (str, size, "%s/%d",
- inet_ntop (p->family, &p->u.prefix, buf, PREFIX2STR_BUFFER),
- p->prefixlen);
return str;
}
@@ -1042,7 +1008,6 @@ netmask_str2prefix_str (const char *net_str, const char *mask_str,
return 1;
}
-#ifdef HAVE_IPV6
/* Utility function for making IPv6 address string. */
const char *
inet6_ntoa (struct in6_addr addr)
@@ -1052,4 +1017,3 @@ inet6_ntoa (struct in6_addr addr)
inet_ntop (AF_INET6, &addr, buf, INET6_ADDRSTRLEN);
return buf;
}
-#endif /* HAVE_IPV6 */
diff --git a/lib/route_types.pl b/lib/route_types.pl
index d44cb12b23..62c7417b84 100755
--- a/lib/route_types.pl
+++ b/lib/route_types.pl
@@ -56,7 +56,7 @@ while (<STDIN>) {
# else: 7-field line
my @f = split(/,/, $_);
- unless (@f == 7) {
+ unless (@f == 7 || @f == 8) {
die "invalid input on route_types line $.\n";
}
@@ -73,6 +73,7 @@ while (<STDIN>) {
"ipv4" => int($f[4]),
"ipv6" => int($f[5]),
"shorthelp" => $f[6],
+ "restrict2" => $f[7],
};
push @protos, $proto;
$daemons{$f[2]} = {
@@ -86,8 +87,8 @@ printf <<EOF, $ARGV[0];
/* Auto-generated from route_types.txt by %s. */
/* Do not edit! */
-#ifndef _QUAGGA_ROUTE_TYPES_H
-#define _QUAGGA_ROUTE_TYPES_H
+#ifndef _FRR_ROUTE_TYPES_H
+#define _FRR_ROUTE_TYPES_H
/* Zebra route's' types. */
EOF
@@ -137,6 +138,8 @@ sub collect {
my (@names, @help) = ((), ());
for my $p (@protos) {
next if ($protodetail{$p}->{"daemon"} eq $daemon && $daemon ne "zebra");
+ next if ($protodetail{$p}->{"restrict2"} ne "" &&
+ $protodetail{$p}->{"restrict2"} ne $daemon);
next unless (($ipv4 && $protodetail{$p}->{"ipv4"})
|| ($ipv6 && $protodetail{$p}->{"ipv6"}));
push @names, $protodetail{$p}->{"cname"};
@@ -154,38 +157,38 @@ for my $daemon (sort keys %daemons) {
printf "/* %s */\n", $daemon;
if ($daemons{$daemon}->{"ipv4"} && $daemons{$daemon}->{"ipv6"}) {
my ($names, $help) = collect($daemon, 1, 1, 0);
- printf "#define QUAGGA_REDIST_STR_%s \\\n %s\n", uc $daemon, $names;
- printf "#define QUAGGA_REDIST_HELP_STR_%s \\\n%s\n", uc $daemon, $help;
+ printf "#define FRR_REDIST_STR_%s \\\n %s\n", uc $daemon, $names;
+ printf "#define FRR_REDIST_HELP_STR_%s \\\n%s\n", uc $daemon, $help;
($names, $help) = collect($daemon, 1, 0, 0);
- printf "#define QUAGGA_IP_REDIST_STR_%s \\\n %s\n", uc $daemon, $names;
- printf "#define QUAGGA_IP_REDIST_HELP_STR_%s \\\n%s\n", uc $daemon, $help;
+ printf "#define FRR_IP_REDIST_STR_%s \\\n %s\n", uc $daemon, $names;
+ printf "#define FRR_IP_REDIST_HELP_STR_%s \\\n%s\n", uc $daemon, $help;
($names, $help) = collect($daemon, 0, 1, 0);
- printf "#define QUAGGA_IP6_REDIST_STR_%s \\\n %s\n", uc $daemon, $names;
- printf "#define QUAGGA_IP6_REDIST_HELP_STR_%s \\\n%s\n", uc $daemon, $help;
+ printf "#define FRR_IP6_REDIST_STR_%s \\\n %s\n", uc $daemon, $names;
+ printf "#define FRR_IP6_REDIST_HELP_STR_%s \\\n%s\n", uc $daemon, $help;
if ($daemon eq "zebra") {
($names, $help) = collect($daemon, 1, 0, 1);
- printf "#define QUAGGA_IP_PROTOCOL_MAP_STR_%s \\\n %s\n", uc $daemon, $names;
- printf "#define QUAGGA_IP_PROTOCOL_MAP_HELP_STR_%s \\\n%s\n", uc $daemon, $help;
+ printf "#define FRR_IP_PROTOCOL_MAP_STR_%s \\\n %s\n", uc $daemon, $names;
+ printf "#define FRR_IP_PROTOCOL_MAP_HELP_STR_%s \\\n%s\n", uc $daemon, $help;
($names, $help) = collect($daemon, 0, 1, 1);
- printf "#define QUAGGA_IP6_PROTOCOL_MAP_STR_%s \\\n %s\n", uc $daemon, $names;
- printf "#define QUAGGA_IP6_PROTOCOL_MAP_HELP_STR_%s \\\n%s\n", uc $daemon, $help;
+ printf "#define FRR_IP6_PROTOCOL_MAP_STR_%s \\\n %s\n", uc $daemon, $names;
+ printf "#define FRR_IP6_PROTOCOL_MAP_HELP_STR_%s \\\n%s\n", uc $daemon, $help;
}
} else {
my ($names, $help) = collect($daemon,
$daemons{$daemon}->{"ipv4"}, $daemons{$daemon}->{"ipv6"}, 0);
- printf "#define QUAGGA_REDIST_STR_%s \\\n %s\n", uc $daemon, $names;
- printf "#define QUAGGA_REDIST_HELP_STR_%s \\\n%s\n", uc $daemon, $help;
+ printf "#define FRR_REDIST_STR_%s \\\n %s\n", uc $daemon, $names;
+ printf "#define FRR_REDIST_HELP_STR_%s \\\n%s\n", uc $daemon, $help;
}
print "\n";
}
print <<EOF;
-#ifdef QUAGGA_DEFINE_DESC_TABLE
+#ifdef FRR_DEFINE_DESC_TABLE
struct zebra_desc_table
{
@@ -208,8 +211,8 @@ print <<EOF;
};
#undef DESC_ENTRY
-#endif /* QUAGGA_DEFINE_DESC_TABLE */
+#endif /* FRR_DEFINE_DESC_TABLE */
-#endif /* _QUAGGA_ROUTE_TYPES_H */
+#endif /* _FRR_ROUTE_TYPES_H */
EOF
diff --git a/lib/route_types.txt b/lib/route_types.txt
index 56e8c14567..74d4f2a49c 100644
--- a/lib/route_types.txt
+++ b/lib/route_types.txt
@@ -64,9 +64,9 @@ ZEBRA_ROUTE_LDP, ldp, ldpd, 'L', 0, 0, "LDP"
#vnc when sent to zebra
ZEBRA_ROUTE_VNC, vnc, NULL, 'v', 1, 1, "VNC"
# vnc when sent to bgp
-ZEBRA_ROUTE_VNC_DIRECT, vpn, NULL, 'V', 1, 1, "VPN"
-# vnc when sent to bgp (remote next hop?)
-ZEBRA_ROUTE_VNC_DIRECT_RH, vpn-rh, NULL, 'V', 0, 0, "VPN"
+ZEBRA_ROUTE_VNC_DIRECT, vnc-direct,NULL, 'V', 1, 1, "VNC-Direct", bgpd
+# vnc when sent to bgp (resolve NVE mode)
+ZEBRA_ROUTE_VNC_DIRECT_RH, vnc-rn, NULL, 'V', 0, 0, "VNC-RN"
# bgp unicast -> vnc
ZEBRA_ROUTE_BGP_DIRECT, bgp-direct, NULL, 'b', 0, 0, "BGP-Direct"
# bgp unicast -> vnc
@@ -90,4 +90,4 @@ ZEBRA_ROUTE_VNC, "Virtual Network Control (VNC)"
ZEBRA_ROUTE_OLSR, "Optimised Link State Routing (OLSR)"
ZEBRA_ROUTE_TABLE, "Non-main Kernel Routing Table"
ZEBRA_ROUTE_LDP, "Label Distribution Protocol (LDP)"
-ZEBRA_ROUTE_VNC_DIRECT, "VPN routes(VPN)"
+ZEBRA_ROUTE_VNC_DIRECT, "VNC direct (not via zebra) routes"
diff --git a/lib/routemap.c b/lib/routemap.c
index 5f2b2c0dfb..74bae1fd76 100644
--- a/lib/routemap.c
+++ b/lib/routemap.c
@@ -989,9 +989,11 @@ vty_show_route_map_entry (struct vty *vty, struct route_map *map)
/* Print the name of the protocol */
if (zlog_default)
+ {
vty_out (vty, "%s", zlog_proto_names[zlog_default->protocol]);
- if (zlog_default->instance)
- vty_out (vty, " %d", zlog_default->instance);
+ if (zlog_default->instance)
+ vty_out (vty, " %d", zlog_default->instance);
+ }
vty_out (vty, ":%s", VTY_NEWLINE);
for (index = map->head; index; index = index->next)
@@ -2766,17 +2768,16 @@ DEFUN (rmap_call,
struct route_map_index *index = VTY_GET_CONTEXT (route_map_index);
const char *rmap = argv[idx_word]->arg;
- if (index)
+ assert(index);
+
+ if (index->nextrm)
{
- if (index->nextrm)
- {
- route_map_upd8_dependency (RMAP_EVENT_CALL_DELETED,
- index->nextrm,
- index->map->name);
- XFREE (MTYPE_ROUTE_MAP_NAME, index->nextrm);
- }
- index->nextrm = XSTRDUP (MTYPE_ROUTE_MAP_NAME, rmap);
+ route_map_upd8_dependency (RMAP_EVENT_CALL_DELETED,
+ index->nextrm,
+ index->map->name);
+ XFREE (MTYPE_ROUTE_MAP_NAME, index->nextrm);
}
+ index->nextrm = XSTRDUP (MTYPE_ROUTE_MAP_NAME, rmap);
/* Execute event hook. */
route_map_upd8_dependency (RMAP_EVENT_CALL_ADDED,
@@ -2940,9 +2941,13 @@ route_map_finish (void)
}
for (i = 1; i < ROUTE_MAP_DEP_MAX; i++)
- hash_free(route_map_dep_hash[i]);
+ {
+ hash_free(route_map_dep_hash[i]);
+ route_map_dep_hash[i] = NULL;
+ }
hash_free (route_map_master_hash);
+ route_map_master_hash = NULL;
}
/* Initialization of route map vector. */
diff --git a/lib/smux.c b/lib/smux.c
index 82bf64f1c8..3abfadcd28 100644
--- a/lib/smux.c
+++ b/lib/smux.c
@@ -154,16 +154,10 @@ static int
smux_socket (void)
{
int ret;
-#ifdef HAVE_IPV6
struct addrinfo hints, *res0, *res;
int gai;
-#else
- struct sockaddr_in serv;
- struct servent *sp;
-#endif
int sock = 0;
-#ifdef HAVE_IPV6
memset(&hints, 0, sizeof(hints));
hints.ai_family = PF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
@@ -183,9 +177,7 @@ smux_socket (void)
for(res=res0; res; res=res->ai_next)
{
if (res->ai_family != AF_INET
-#ifdef HAVE_IPV6
&& res->ai_family != AF_INET6
-#endif /* HAVE_IPV6 */
)
continue;
@@ -206,40 +198,6 @@ smux_socket (void)
freeaddrinfo(res0);
if (sock < 0)
zlog_warn ("Can't connect to SNMP agent with SMUX");
-#else
- sock = socket (AF_INET, SOCK_STREAM, 0);
- if (sock < 0)
- {
- zlog_warn ("Can't make socket for SNMP");
- return -1;
- }
-
- memset (&serv, 0, sizeof (struct sockaddr_in));
- serv.sin_family = AF_INET;
-#ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
- serv.sin_len = sizeof (struct sockaddr_in);
-#endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */
-
- sp = getservbyname ("smux", "tcp");
- if (sp != NULL)
- serv.sin_port = sp->s_port;
- else
- serv.sin_port = htons (SMUX_PORT_DEFAULT);
-
- serv.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
-
- sockopt_reuseaddr (sock);
- sockopt_reuseport (sock);
-
- ret = connect (sock, (struct sockaddr *) &serv, sizeof (struct sockaddr_in));
- if (ret < 0)
- {
- close (sock);
- smux_sock = -1;
- zlog_warn ("Can't connect to SNMP agent with SMUX");
- return -1;
- }
-#endif
return sock;
}
@@ -922,7 +880,7 @@ smux_open (int sock)
u_char *ptr;
size_t len;
long version;
- const char progname[] = QUAGGA_PROGNAME "-" QUAGGA_VERSION;
+ const char progname[] = FRR_SMUX_NAME "-" FRR_VERSION;
if (debug_smux)
{
diff --git a/lib/sockopt.c b/lib/sockopt.c
index 461e1f7f54..2a9f907cb3 100644
--- a/lib/sockopt.c
+++ b/lib/sockopt.c
@@ -86,7 +86,6 @@ getsockopt_cmsg_data (struct msghdr *msgh, int level, int type)
return NULL;
}
-#ifdef HAVE_IPV6
/* Set IPv6 packet info to the socket. */
int
setsockopt_ipv6_pktinfo (int sock, int val)
@@ -198,7 +197,6 @@ setsockopt_ipv6_tclass(int sock, int tclass)
#endif
return ret;
}
-#endif /* HAVE_IPV6 */
/*
* Process multicast socket options for IPv4 in an OS-dependent manner.
@@ -444,11 +442,9 @@ setsockopt_ifindex (int af, int sock, ifindex_t val)
case AF_INET:
ret = setsockopt_ipv4_ifindex (sock, val);
break;
-#ifdef HAVE_IPV6
case AF_INET6:
ret = setsockopt_ipv6_pktinfo (sock, val);
break;
-#endif
default:
zlog_warn ("setsockopt_ifindex: unknown address family %d", af);
}
@@ -535,11 +531,9 @@ getsockopt_ifindex (int af, struct msghdr *msgh)
case AF_INET:
return (getsockopt_ipv4_ifindex (msgh));
break;
-#ifdef HAVE_IPV6
case AF_INET6:
return (getsockopt_ipv6_ifindex (msgh));
break;
-#endif
default:
zlog_warn ("getsockopt_ifindex: unknown address family %d", af);
return 0;
@@ -646,7 +640,6 @@ sockopt_tcp_signature (int sock, union sockunion *su, const char *password)
return 0;
}
-#ifdef HAVE_IPV6
/* If this does not work, then all users of this sockopt will need to
* differentiate between IPv4 and IPv6, and keep seperate sockets for
* each.
@@ -663,7 +656,6 @@ sockopt_tcp_signature (int sock, union sockunion *su, const char *password)
su2->sin6.sin6_addr.s6_addr32[2] = htonl(0xffff);
memcpy (&su2->sin6.sin6_addr.s6_addr32[3], &su->sin.sin_addr, 4);
}
-#endif
}
memset (&md5sig, 0, sizeof (md5sig));
diff --git a/lib/sockopt.h b/lib/sockopt.h
index b3ab57ab71..1b7be1e49f 100644
--- a/lib/sockopt.h
+++ b/lib/sockopt.h
@@ -28,7 +28,6 @@ extern void setsockopt_so_recvbuf (int sock, int size);
extern void setsockopt_so_sendbuf (const int sock, int size);
extern int getsockopt_so_sendbuf (const int sock);
-#ifdef HAVE_IPV6
extern int setsockopt_ipv6_pktinfo (int, int);
extern int setsockopt_ipv6_checksum (int, int);
extern int setsockopt_ipv6_multicast_hops (int, int);
@@ -36,13 +35,7 @@ extern int setsockopt_ipv6_unicast_hops (int, int);
extern int setsockopt_ipv6_hoplimit (int, int);
extern int setsockopt_ipv6_multicast_loop (int, int);
extern int setsockopt_ipv6_tclass (int, int);
-#endif /* HAVE_IPV6 */
-/*
- * It is OK to reference in6_pktinfo here without a protecting #if
- * because this macro will only be used #if HAVE_IPV6, and in6_pktinfo
- * is not optional for HAVE_IPV6.
- */
#define SOPT_SIZE_CMSG_PKTINFO_IPV6() (sizeof (struct in6_pktinfo));
/*
diff --git a/lib/sockunion.c b/lib/sockunion.c
index f4b6ce12cc..5b508d1bf8 100644
--- a/lib/sockunion.c
+++ b/lib/sockunion.c
@@ -38,11 +38,9 @@ inet_sutop (const union sockunion *su, char *str)
case AF_INET:
inet_ntop (AF_INET, &su->sin.sin_addr, str, INET_ADDRSTRLEN);
break;
-#ifdef HAVE_IPV6
case AF_INET6:
inet_ntop (AF_INET6, &su->sin6.sin6_addr, str, INET6_ADDRSTRLEN);
break;
-#endif /* HAVE_IPV6 */
}
return str;
}
@@ -63,7 +61,6 @@ str2sockunion (const char *str, union sockunion *su)
#endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */
return 0;
}
-#ifdef HAVE_IPV6
ret = inet_pton (AF_INET6, str, &su->sin6.sin6_addr);
if (ret > 0) /* Valid IPv6 address format. */
{
@@ -73,7 +70,6 @@ str2sockunion (const char *str, union sockunion *su)
#endif /* SIN6_LEN */
return 0;
}
-#endif /* HAVE_IPV6 */
return -1;
}
@@ -87,10 +83,8 @@ sockunion2str (const union sockunion *su, char *buf, size_t len)
return buf;
case AF_INET:
return inet_ntop (AF_INET, &su->sin.sin_addr, buf, len);
-#ifdef HAVE_IPV6
case AF_INET6:
return inet_ntop (AF_INET6, &su->sin6.sin6_addr, buf, len);
-#endif /* HAVE_IPV6 */
}
snprintf (buf, len, "(af %d)", sockunion_family(su));
return buf;
@@ -114,7 +108,6 @@ sockunion_normalise_mapped (union sockunion *su)
{
struct sockaddr_in sin;
-#ifdef HAVE_IPV6
if (su->sa.sa_family == AF_INET6
&& IN6_IS_ADDR_V4MAPPED (&su->sin6.sin6_addr))
{
@@ -124,7 +117,6 @@ sockunion_normalise_mapped (union sockunion *su)
memcpy (&sin.sin_addr, ((char *)&su->sin6.sin6_addr) + 12, 4);
memcpy (su, &sin, sizeof (struct sockaddr_in));
}
-#endif /* HAVE_IPV6 */
}
/* return sockunion structure : this function should be revised. */
@@ -190,11 +182,9 @@ sockunion_sizeof (const union sockunion *su)
case AF_INET:
ret = sizeof (struct sockaddr_in);
break;
-#ifdef HAVE_IPV6
case AF_INET6:
ret = sizeof (struct sockaddr_in6);
break;
-#endif /* AF_INET6 */
}
return ret;
}
@@ -218,7 +208,6 @@ sockunion_connect (int fd, const union sockunion *peersu, unsigned short port,
case AF_INET:
su.sin.sin_port = port;
break;
-#ifdef HAVE_IPV6
case AF_INET6:
su.sin6.sin6_port = port;
#ifdef KAME
@@ -229,7 +218,6 @@ sockunion_connect (int fd, const union sockunion *peersu, unsigned short port,
}
#endif /* KAME */
break;
-#endif /* HAVE_IPV6 */
}
/* Make socket non-block. */
@@ -299,7 +287,6 @@ sockunion_bind (int sock, union sockunion *su, unsigned short port,
if (su_addr == NULL)
sockunion2ip (su) = htonl (INADDR_ANY);
}
-#ifdef HAVE_IPV6
else if (su->sa.sa_family == AF_INET6)
{
size = sizeof (struct sockaddr_in6);
@@ -316,8 +303,6 @@ sockunion_bind (int sock, union sockunion *su, unsigned short port,
#endif /* LINUX_IPV6 */
}
}
-#endif /* HAVE_IPV6 */
-
ret = bind (sock, (struct sockaddr *)su, size);
if (ret < 0)
@@ -388,7 +373,6 @@ sockopt_ttl (int family, int sock, int ttl)
return 0;
}
#endif /* IP_TTL */
-#ifdef HAVE_IPV6
if (family == AF_INET6)
{
ret = setsockopt (sock, IPPROTO_IPV6, IPV6_UNICAST_HOPS,
@@ -401,7 +385,6 @@ sockopt_ttl (int family, int sock, int ttl)
}
return 0;
}
-#endif /* HAVE_IPV6 */
return 0;
}
@@ -469,7 +452,6 @@ sockopt_v6only (int family, int sock)
{
int ret, on = 1;
-#ifdef HAVE_IPV6
#ifdef IPV6_V6ONLY
if (family == AF_INET6)
{
@@ -484,7 +466,6 @@ sockopt_v6only (int family, int sock)
return 0;
}
#endif /* IPV6_V6ONLY */
-#endif /* HAVE_IPV6 */
return 0;
}
@@ -503,7 +484,6 @@ sockunion_same (const union sockunion *su1, const union sockunion *su2)
ret = memcmp (&su1->sin.sin_addr, &su2->sin.sin_addr,
sizeof (struct in_addr));
break;
-#ifdef HAVE_IPV6
case AF_INET6:
ret = memcmp (&su1->sin6.sin6_addr, &su2->sin6.sin6_addr,
sizeof (struct in6_addr));
@@ -514,7 +494,6 @@ sockunion_same (const union sockunion *su1, const union sockunion *su2)
ret = (su1->sin6.sin6_scope_id == su2->sin6.sin6_scope_id) ? 0 : 1;
}
break;
-#endif /* HAVE_IPV6 */
}
if (ret == 0)
return 1;
@@ -529,10 +508,8 @@ sockunion_hash (const union sockunion *su)
{
case AF_INET:
return jhash_1word(su->sin.sin_addr.s_addr, 0);
-#ifdef HAVE_IPV6
case AF_INET6:
return jhash2(su->sin6.sin6_addr.s6_addr32, ZEBRA_NUM_OF(su->sin6.sin6_addr.s6_addr32), 0);
-#endif /* HAVE_IPV6 */
}
return 0;
}
@@ -544,10 +521,8 @@ family2addrsize(int family)
{
case AF_INET:
return sizeof(struct in_addr);
-#ifdef HAVE_IPV6
case AF_INET6:
return sizeof(struct in6_addr);
-#endif /* HAVE_IPV6 */
}
return 0;
}
@@ -565,10 +540,8 @@ sockunion_get_addr(const union sockunion *su)
{
case AF_INET:
return (const u_char *) &su->sin.sin_addr.s_addr;
-#ifdef HAVE_IPV6
case AF_INET6:
return (const u_char *) &su->sin6.sin6_addr;
-#endif /* HAVE_IPV6 */
}
return NULL;
}
@@ -585,11 +558,9 @@ sockunion_set(union sockunion *su, int family, const u_char *addr, size_t bytes)
case AF_INET:
memcpy(&su->sin.sin_addr.s_addr, addr, bytes);
break;
-#ifdef HAVE_IPV6
case AF_INET6:
memcpy(&su->sin6.sin6_addr, addr, bytes);
break;
-#endif /* HAVE_IPV6 */
}
}
@@ -603,9 +574,7 @@ sockunion_getsockname (int fd)
{
struct sockaddr sa;
struct sockaddr_in sin;
-#ifdef HAVE_IPV6
struct sockaddr_in6 sin6;
-#endif /* HAVE_IPV6 */
char tmp_buffer[128];
} name;
union sockunion *su;
@@ -627,7 +596,6 @@ sockunion_getsockname (int fd)
memcpy (su, &name, sizeof (struct sockaddr_in));
return su;
}
-#ifdef HAVE_IPV6
if (name.sa.sa_family == AF_INET6)
{
su = XCALLOC (MTYPE_SOCKUNION, sizeof (union sockunion));
@@ -635,7 +603,6 @@ sockunion_getsockname (int fd)
sockunion_normalise_mapped (su);
return su;
}
-#endif /* HAVE_IPV6 */
return NULL;
}
@@ -649,9 +616,7 @@ sockunion_getpeername (int fd)
{
struct sockaddr sa;
struct sockaddr_in sin;
-#ifdef HAVE_IPV6
struct sockaddr_in6 sin6;
-#endif /* HAVE_IPV6 */
char tmp_buffer[128];
} name;
union sockunion *su;
@@ -672,7 +637,6 @@ sockunion_getpeername (int fd)
memcpy (su, &name, sizeof (struct sockaddr_in));
return su;
}
-#ifdef HAVE_IPV6
if (name.sa.sa_family == AF_INET6)
{
su = XCALLOC (MTYPE_SOCKUNION, sizeof (union sockunion));
@@ -680,7 +644,6 @@ sockunion_getpeername (int fd)
sockunion_normalise_mapped (su);
return su;
}
-#endif /* HAVE_IPV6 */
return NULL;
}
@@ -696,7 +659,6 @@ sockunion_print (const union sockunion *su)
case AF_INET:
printf ("%s\n", inet_ntoa (su->sin.sin_addr));
break;
-#ifdef HAVE_IPV6
case AF_INET6:
{
char buf [SU_ADDRSTRLEN];
@@ -705,7 +667,6 @@ sockunion_print (const union sockunion *su)
buf, sizeof (buf)));
}
break;
-#endif /* HAVE_IPV6 */
#ifdef AF_LINK
case AF_LINK:
@@ -723,7 +684,6 @@ sockunion_print (const union sockunion *su)
}
}
-#ifdef HAVE_IPV6
static int
in6addr_cmp (const struct in6_addr *addr1, const struct in6_addr *addr2)
{
@@ -742,7 +702,6 @@ in6addr_cmp (const struct in6_addr *addr1, const struct in6_addr *addr2)
}
return 0;
}
-#endif /* HAVE_IPV6 */
int
sockunion_cmp (const union sockunion *su1, const union sockunion *su2)
@@ -761,10 +720,8 @@ sockunion_cmp (const union sockunion *su1, const union sockunion *su2)
else
return -1;
}
-#ifdef HAVE_IPV6
if (su1->sa.sa_family == AF_INET6)
return in6addr_cmp (&su1->sin6.sin6_addr, &su2->sin6.sin6_addr);
-#endif /* HAVE_IPV6 */
return 0;
}
diff --git a/lib/sockunion.h b/lib/sockunion.h
index 3af3d78059..bed68e1ee1 100644
--- a/lib/sockunion.h
+++ b/lib/sockunion.h
@@ -47,11 +47,7 @@ enum connect_result
};
/* Default address family. */
-#ifdef HAVE_IPV6
#define AF_INET_UNION AF_INET6
-#else
-#define AF_INET_UNION AF_INET
-#endif
/* Sockunion address string length. Same as INET6_ADDRSTRLEN. */
#define SU_ADDRSTRLEN 46
diff --git a/lib/table.c b/lib/table.c
index 5133ef6974..7335b2a817 100644
--- a/lib/table.c
+++ b/lib/table.c
@@ -250,7 +250,6 @@ route_node_match_ipv4 (const struct route_table *table,
return route_node_match (table, (struct prefix *) &p);
}
-#ifdef HAVE_IPV6
struct route_node *
route_node_match_ipv6 (const struct route_table *table,
const struct in6_addr *addr)
@@ -264,7 +263,6 @@ route_node_match_ipv6 (const struct route_table *table,
return route_node_match (table, (struct prefix *) &p);
}
-#endif /* HAVE_IPV6 */
/* Lookup same prefix node. Return NULL when we can't find route. */
struct route_node *
diff --git a/lib/table.h b/lib/table.h
index 78bf5da748..5f3eb8de37 100644
--- a/lib/table.h
+++ b/lib/table.h
@@ -162,10 +162,8 @@ extern struct route_node *route_node_match (const struct route_table *,
const struct prefix *);
extern struct route_node *route_node_match_ipv4 (const struct route_table *,
const struct in_addr *);
-#ifdef HAVE_IPV6
extern struct route_node *route_node_match_ipv6 (const struct route_table *,
const struct in6_addr *);
-#endif /* HAVE_IPV6 */
extern unsigned long route_table_count (const struct route_table *);
diff --git a/lib/version.h.in b/lib/version.h.in
index 1f95f0c5f0..adc8278189 100644
--- a/lib/version.h.in
+++ b/lib/version.h.in
@@ -35,17 +35,21 @@
#define GIT_INFO ""
#endif
-#define QUAGGA_PROGNAME "@PACKAGE_NAME@"
-
-#define QUAGGA_VERSION "@PACKAGE_VERSION@" GIT_SUFFIX
-
-#define ZEBRA_BUG_ADDRESS "@PACKAGE_BUGREPORT@"
-
-#define QUAGGA_URL "http://www.quagga.net"
-
-#define QUAGGA_COPYRIGHT "Copyright 1996-2005 Kunihiro Ishiguro, et al."
-
-#define QUAGGA_CONFIG_ARGS "@CONFIG_ARGS@"
+#define FRR_PAM_NAME "@PACKAGE_NAME@"
+#define FRR_SMUX_NAME "@PACKAGE_NAME@"
+#define FRR_PTM_NAME "@PACKAGE_NAME@"
+
+#define FRR_FULL_NAME "FreeRangeRouting"
+#define FRR_VERSION "@PACKAGE_VERSION@" GIT_SUFFIX
+#define FRR_BUG_ADDRESS "@PACKAGE_BUGREPORT@"
+#define FRR_COPYRIGHT "Copyright 1996-2005 Kunihiro Ishiguro, et al."
+#define FRR_CONFIG_ARGS "@CONFIG_ARGS@"
+
+#define FRR_DEFAULT_MOTD \
+ "\r\n" \
+ "Hello, this is " FRR_FULL_NAME " (version " FRR_VERSION ").\r\n" \
+ FRR_COPYRIGHT "\r\n" \
+ GIT_INFO "\r\n"
pid_t pid_output (const char *);
diff --git a/lib/vrf.c b/lib/vrf.c
index 14501c5265..ce8ffe75d5 100644
--- a/lib/vrf.c
+++ b/lib/vrf.c
@@ -381,7 +381,7 @@ vrf_bitmap_set (vrf_bitmap_t bmap, vrf_id_t vrf_id)
u_char group = VRF_BITMAP_GROUP (vrf_id);
u_char offset = VRF_BITMAP_BIT_OFFSET (vrf_id);
- if (bmap == VRF_BITMAP_NULL)
+ if (bmap == VRF_BITMAP_NULL || vrf_id == VRF_UNKNOWN)
return;
if (bm->groups[group] == NULL)
@@ -399,7 +399,8 @@ vrf_bitmap_unset (vrf_bitmap_t bmap, vrf_id_t vrf_id)
u_char group = VRF_BITMAP_GROUP (vrf_id);
u_char offset = VRF_BITMAP_BIT_OFFSET (vrf_id);
- if (bmap == VRF_BITMAP_NULL || bm->groups[group] == NULL)
+ if (bmap == VRF_BITMAP_NULL || vrf_id == VRF_UNKNOWN ||
+ bm->groups[group] == NULL)
return;
UNSET_FLAG (bm->groups[group][VRF_BITMAP_INDEX_IN_GROUP (offset)],
@@ -413,7 +414,8 @@ vrf_bitmap_check (vrf_bitmap_t bmap, vrf_id_t vrf_id)
u_char group = VRF_BITMAP_GROUP (vrf_id);
u_char offset = VRF_BITMAP_BIT_OFFSET (vrf_id);
- if (bmap == VRF_BITMAP_NULL || bm->groups[group] == NULL)
+ if (bmap == VRF_BITMAP_NULL || vrf_id == VRF_UNKNOWN ||
+ bm->groups[group] == NULL)
return 0;
return CHECK_FLAG (bm->groups[group][VRF_BITMAP_INDEX_IN_GROUP (offset)],
diff --git a/lib/vty.c b/lib/vty.c
index d5ecb1db5b..e47ad1e59a 100644
--- a/lib/vty.c
+++ b/lib/vty.c
@@ -508,18 +508,6 @@ vty_write (struct vty *vty, const char *buf, size_t nbytes)
buffer_put (vty->obuf, buf, nbytes);
}
-/* Ensure length of input buffer. Is buffer is short, double it. */
-static void
-vty_ensure (struct vty *vty, int length)
-{
- if (vty->max <= length)
- {
- vty->max *= 2;
- vty->buf = XREALLOC (MTYPE_VTY, vty->buf, vty->max);
- vty->error_buf = XREALLOC (MTYPE_VTY, vty->error_buf, vty->max);
- }
-}
-
/* Basic function to insert character into vty. */
static void
vty_self_insert (struct vty *vty, char c)
@@ -527,7 +515,9 @@ vty_self_insert (struct vty *vty, char c)
int i;
int length;
- vty_ensure (vty, vty->length + 1);
+ if (vty->length + 1 > VTY_BUFSIZ)
+ return;
+
length = vty->length - vty->cp;
memmove (&vty->buf[vty->cp + 1], &vty->buf[vty->cp], length);
vty->buf[vty->cp] = c;
@@ -544,26 +534,29 @@ vty_self_insert (struct vty *vty, char c)
static void
vty_self_insert_overwrite (struct vty *vty, char c)
{
- vty_ensure (vty, vty->length + 1);
- vty->buf[vty->cp++] = c;
-
- if (vty->cp > vty->length)
- vty->length++;
-
- if ((vty->node == AUTH_NODE) || (vty->node == AUTH_ENABLE_NODE))
- return;
+ if (vty->cp == vty->length)
+ {
+ vty_self_insert (vty, c);
+ return;
+ }
+ vty->buf[vty->cp++] = c;
vty_write (vty, &c, 1);
}
-/* Insert a word into vty interface with overwrite mode. */
+/**
+ * Insert a string into vty->buf at the current cursor position.
+ *
+ * If the resultant string would be larger than VTY_BUFSIZ it is
+ * truncated to fit.
+ */
static void
vty_insert_word_overwrite (struct vty *vty, char *str)
{
- int len = strlen (str);
- vty_write (vty, str, len);
- strcpy (&vty->buf[vty->cp], str);
- vty->cp += len;
+ size_t nwrite = MIN ((int) strlen (str), VTY_BUFSIZ - vty->cp);
+ vty_write (vty, str, nwrite);
+ strncpy (&vty->buf[vty->cp], str, nwrite);
+ vty->cp += nwrite;
vty->length = vty->cp;
}
@@ -1867,7 +1860,6 @@ vty_accept (struct thread *thread)
}
}
-#ifdef HAVE_IPV6
/* VTY's ipv6 accesslist apply. */
if (p.family == AF_INET6 && vty_ipv6_accesslist_name)
{
@@ -1884,7 +1876,6 @@ vty_accept (struct thread *thread)
return 0;
}
}
-#endif /* HAVE_IPV6 */
on = 1;
ret = setsockopt (vty_sock, IPPROTO_TCP, TCP_NODELAY,
@@ -1901,7 +1892,6 @@ vty_accept (struct thread *thread)
return 0;
}
-#ifdef HAVE_IPV6
static void
vty_serv_sock_addrinfo (const char *hostname, unsigned short port)
{
@@ -1932,9 +1922,7 @@ vty_serv_sock_addrinfo (const char *hostname, unsigned short port)
do
{
if (ainfo->ai_family != AF_INET
-#ifdef HAVE_IPV6
&& ainfo->ai_family != AF_INET6
-#endif /* HAVE_IPV6 */
)
continue;
@@ -1967,76 +1955,6 @@ vty_serv_sock_addrinfo (const char *hostname, unsigned short port)
freeaddrinfo (ainfo_save);
}
-#else /* HAVE_IPV6 */
-
-/* Make vty server socket. */
-static void
-vty_serv_sock_family (const char* addr, unsigned short port, int family)
-{
- int ret;
- union sockunion su;
- int accept_sock;
- void* naddr=NULL;
-
- memset (&su, 0, sizeof (union sockunion));
- su.sa.sa_family = family;
- if(addr)
- switch(family)
- {
- case AF_INET:
- naddr=&su.sin.sin_addr;
- break;
-#ifdef HAVE_IPV6
- case AF_INET6:
- naddr=&su.sin6.sin6_addr;
- break;
-#endif
- }
-
- if(naddr)
- switch(inet_pton(family,addr,naddr))
- {
- case -1:
- zlog_err("bad address %s",addr);
- naddr=NULL;
- break;
- case 0:
- zlog_err("error translating address %s: %s",addr,safe_strerror(errno));
- naddr=NULL;
- }
-
- /* Make new socket. */
- accept_sock = sockunion_stream_socket (&su);
- if (accept_sock < 0)
- return;
-
- /* This is server, so reuse address. */
- sockopt_reuseaddr (accept_sock);
- sockopt_reuseport (accept_sock);
- set_cloexec (accept_sock);
-
- /* Bind socket to universal address and given port. */
- ret = sockunion_bind (accept_sock, &su, port, naddr);
- if (ret < 0)
- {
- zlog_warn("can't bind socket");
- close (accept_sock); /* Avoid sd leak. */
- return;
- }
-
- /* Listen socket under queue 3. */
- ret = listen (accept_sock, 3);
- if (ret < 0)
- {
- zlog (NULL, LOG_WARNING, "can't listen socket");
- close (accept_sock); /* Avoid sd leak. */
- return;
- }
-
- /* Add vty server event. */
- vty_event (VTY_SERV, accept_sock, NULL);
-}
-#endif /* HAVE_IPV6 */
#ifdef VTYSH
/* For sockaddr_un. */
@@ -2223,36 +2141,45 @@ vtysh_read (struct thread *thread)
printf ("line: %.*s\n", nbytes, buf);
#endif /* VTYSH_DEBUG */
- for (p = buf; p < buf+nbytes; p++)
+ if (vty->length + nbytes > VTY_BUFSIZ)
+ {
+ /* Clear command line buffer. */
+ vty->cp = vty->length = 0;
+ vty_clear_buf (vty);
+ vty_out (vty, "%% Command is too long.%s", VTY_NEWLINE);
+ }
+ else
{
- vty_ensure(vty, vty->length+1);
- vty->buf[vty->length++] = *p;
- if (*p == '\0')
+ for (p = buf; p < buf+nbytes; p++)
{
- /* Pass this line to parser. */
- ret = vty_execute (vty);
- /* Note that vty_execute clears the command buffer and resets
- vty->length to 0. */
+ vty->buf[vty->length++] = *p;
+ if (*p == '\0')
+ {
+ /* Pass this line to parser. */
+ ret = vty_execute (vty);
+ /* Note that vty_execute clears the command buffer and resets
+ vty->length to 0. */
- /* Return result. */
+ /* Return result. */
#ifdef VTYSH_DEBUG
- printf ("result: %d\n", ret);
- printf ("vtysh node: %d\n", vty->node);
+ printf ("result: %d\n", ret);
+ printf ("vtysh node: %d\n", vty->node);
#endif /* VTYSH_DEBUG */
- /* hack for asynchronous "write integrated"
- * - other commands in "buf" will be ditched
- * - input during pending config-write is "unsupported" */
- if (ret == CMD_SUSPEND)
- break;
+ /* hack for asynchronous "write integrated"
+ * - other commands in "buf" will be ditched
+ * - input during pending config-write is "unsupported" */
+ if (ret == CMD_SUSPEND)
+ break;
- /* warning: watchquagga hardcodes this result write */
- header[3] = ret;
- buffer_put(vty->obuf, header, 4);
+ /* warning: watchquagga hardcodes this result write */
+ header[3] = ret;
+ buffer_put(vty->obuf, header, 4);
- if (!vty->t_write && (vtysh_flush(vty) < 0))
- /* Try to flush results; exit if a write error occurs. */
- return 0;
+ if (!vty->t_write && (vtysh_flush(vty) < 0))
+ /* Try to flush results; exit if a write error occurs. */
+ return 0;
+ }
}
}
@@ -2279,14 +2206,7 @@ vty_serv_sock (const char *addr, unsigned short port, const char *path)
{
/* If port is set to 0, do not listen on TCP/IP at all! */
if (port)
- {
-
-#ifdef HAVE_IPV6
- vty_serv_sock_addrinfo (addr, port);
-#else /* ! HAVE_IPV6 */
- vty_serv_sock_family (addr,port, AF_INET);
-#endif /* HAVE_IPV6 */
- }
+ vty_serv_sock_addrinfo (addr, port);
#ifdef VTYSH
vty_serv_un (path);
@@ -2858,7 +2778,6 @@ DEFUN (no_vty_access_class,
return CMD_SUCCESS;
}
-#ifdef HAVE_IPV6
/* Set vty access class. */
DEFUN (vty_ipv6_access_class,
vty_ipv6_access_class_cmd,
@@ -2902,7 +2821,6 @@ DEFUN (no_vty_ipv6_access_class,
return CMD_SUCCESS;
}
-#endif /* HAVE_IPV6 */
/* vty login. */
DEFUN (vty_login,
@@ -3184,10 +3102,8 @@ vty_init (struct thread_master *master_thread)
install_element (VTY_NODE, &no_vty_access_class_cmd);
install_element (VTY_NODE, &vty_login_cmd);
install_element (VTY_NODE, &no_vty_login_cmd);
-#ifdef HAVE_IPV6
install_element (VTY_NODE, &vty_ipv6_access_class_cmd);
install_element (VTY_NODE, &no_vty_ipv6_access_class_cmd);
-#endif /* HAVE_IPV6 */
}
void
diff --git a/lib/vty.h b/lib/vty.h
index 24bdcd1817..f0b833d4d8 100644
--- a/lib/vty.h
+++ b/lib/vty.h
@@ -26,7 +26,7 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
#include "sockunion.h"
#include "qobj.h"
-#define VTY_BUFSIZ 512
+#define VTY_BUFSIZ 4096
#define VTY_MAXHIST 20
/* VTY struct. */
diff --git a/lib/zclient.c b/lib/zclient.c
index 440de3635f..a4c5fa4afb 100644
--- a/lib/zclient.c
+++ b/lib/zclient.c
@@ -786,7 +786,6 @@ zapi_ipv4_route (u_char cmd, struct zclient *zclient, struct prefix_ipv4 *p,
return zclient_send_message(zclient);
}
-#ifdef HAVE_IPV6
int
zapi_ipv4_route_ipv6_nexthop (u_char cmd, struct zclient *zclient,
struct prefix_ipv4 *p, struct zapi_ipv6 *api)
@@ -918,7 +917,6 @@ zapi_ipv6_route (u_char cmd, struct zclient *zclient, struct prefix_ipv6 *p,
return zclient_send_message(zclient);
}
-#endif /* HAVE_IPV6 */
/*
* send a ZEBRA_REDISTRIBUTE_ADD or ZEBRA_REDISTRIBUTE_DELETE
diff --git a/lib/zclient.h b/lib/zclient.h
index 7ea5bc963a..ccb7b0509d 100644
--- a/lib/zclient.h
+++ b/lib/zclient.h
@@ -123,7 +123,7 @@ struct zserv_header
* always set to 255 in new zserv.
*/
uint8_t version;
-#define ZSERV_VERSION 3
+#define ZSERV_VERSION 4
vrf_id_t vrf_id;
uint16_t command;
};
@@ -214,7 +214,6 @@ extern int zapi_ipv4_route (u_char, struct zclient *, struct prefix_ipv4 *,
extern struct interface *zebra_interface_link_params_read (struct stream *);
extern size_t zebra_interface_link_params_write (struct stream *,
struct interface *);
-#ifdef HAVE_IPV6
/* IPv6 prefix add and delete function prototype. */
struct zapi_ipv6
@@ -249,6 +248,5 @@ extern int zapi_ipv6_route (u_char cmd, struct zclient *zclient,
struct prefix_ipv6 *p, struct zapi_ipv6 *api);
extern int zapi_ipv4_route_ipv6_nexthop (u_char, struct zclient *,
struct prefix_ipv4 *, struct zapi_ipv6 *);
-#endif /* HAVE_IPV6 */
#endif /* _ZEBRA_ZCLIENT_H */
diff --git a/lib/zebra.h b/lib/zebra.h
index f344867697..f89e7f5c3f 100644
--- a/lib/zebra.h
+++ b/lib/zebra.h
@@ -412,7 +412,7 @@ typedef enum {
* the command value in the old zserv header. To allow old and new
* Zserv headers to be distinguished from each other.
*/
-#define ZEBRA_HEADER_MARKER 255
+#define ZEBRA_HEADER_MARKER 254
/* Zebra route's types are defined in route_types.h */
#include "route_types.h"
@@ -472,10 +472,17 @@ typedef enum {
/* Subsequent Address Family Identifier. */
#define SAFI_UNICAST 1
#define SAFI_MULTICAST 2
-#define SAFI_RESERVED_3 3
-#define SAFI_MPLS_VPN 4
-#define SAFI_ENCAP 7 /* per IANA */
-#define SAFI_MAX 8
+#define SAFI_MPLS_VPN 3
+#define SAFI_RESERVED_4 4
+#define SAFI_ENCAP 5
+#define SAFI_RESERVED_5 5
+#define SAFI_MAX 6
+
+#define IANA_SAFI_RESERVED 0
+#define IANA_SAFI_UNICAST 1
+#define IANA_SAFI_MULTICAST 2
+#define IANA_SAFI_ENCAP 7
+#define IANA_SAFI_MPLS_VPN 128
/*
* The above AFI and SAFI definitions are for internal use. The protocol
@@ -527,4 +534,48 @@ typedef uint32_t route_tag_t;
#define ROUTE_TAG_MAX UINT32_MAX
#define ROUTE_TAG_PRI PRIu32
+static inline afi_t afi_iana2int (iana_afi_t afi)
+{
+ if (afi == IANA_AFI_IPV4)
+ return AFI_IP;
+ if (afi == IANA_AFI_IPV6)
+ return AFI_IP6;
+ return AFI_MAX;
+}
+
+static inline iana_afi_t afi_int2iana (afi_t afi)
+{
+ if (afi == AFI_IP)
+ return IANA_AFI_IPV4;
+ if (afi == AFI_IP6)
+ return IANA_AFI_IPV6;
+ return IANA_AFI_RESERVED;
+}
+
+static inline safi_t safi_iana2int (safi_t safi)
+{
+ if (safi == IANA_SAFI_UNICAST)
+ return SAFI_UNICAST;
+ if (safi == IANA_SAFI_MULTICAST)
+ return SAFI_MULTICAST;
+ if (safi == IANA_SAFI_MPLS_VPN)
+ return SAFI_MPLS_VPN;
+ if (safi == IANA_SAFI_ENCAP)
+ return SAFI_ENCAP;
+ return SAFI_MAX;
+}
+
+static inline safi_t safi_int2iana (safi_t safi)
+{
+ if (safi == SAFI_UNICAST)
+ return IANA_SAFI_UNICAST;
+ if (safi == SAFI_MULTICAST)
+ return IANA_SAFI_MULTICAST;
+ if (safi == SAFI_MPLS_VPN)
+ return IANA_SAFI_MPLS_VPN;
+ if (safi == SAFI_ENCAP)
+ return IANA_SAFI_ENCAP;
+ return IANA_SAFI_RESERVED;
+}
+
#endif /* _ZEBRA_H */