diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/agentx.c | 5 | ||||
| -rw-r--r-- | lib/bfd.c | 6 | ||||
| -rw-r--r-- | lib/command.c | 30 | ||||
| -rw-r--r-- | lib/command_match.c | 2 | ||||
| -rw-r--r-- | lib/filter.c | 21 | ||||
| -rw-r--r-- | lib/if.c | 6 | ||||
| -rw-r--r-- | lib/if.h | 11 | ||||
| -rw-r--r-- | lib/log.c | 44 | ||||
| -rw-r--r-- | lib/log.h | 2 | ||||
| -rw-r--r-- | lib/plist.c | 14 | ||||
| -rw-r--r-- | lib/prefix.c | 66 | ||||
| -rwxr-xr-x | lib/route_types.pl | 39 | ||||
| -rw-r--r-- | lib/route_types.txt | 8 | ||||
| -rw-r--r-- | lib/routemap.c | 29 | ||||
| -rw-r--r-- | lib/smux.c | 44 | ||||
| -rw-r--r-- | lib/sockopt.c | 8 | ||||
| -rw-r--r-- | lib/sockopt.h | 7 | ||||
| -rw-r--r-- | lib/sockunion.c | 43 | ||||
| -rw-r--r-- | lib/sockunion.h | 4 | ||||
| -rw-r--r-- | lib/table.c | 2 | ||||
| -rw-r--r-- | lib/table.h | 2 | ||||
| -rw-r--r-- | lib/version.h.in | 26 | ||||
| -rw-r--r-- | lib/vrf.c | 8 | ||||
| -rw-r--r-- | lib/vty.c | 186 | ||||
| -rw-r--r-- | lib/vty.h | 2 | ||||
| -rw-r--r-- | lib/zclient.c | 2 | ||||
| -rw-r--r-- | lib/zclient.h | 4 | ||||
| -rw-r--r-- | lib/zebra.h | 61 |
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); @@ -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 */ } @@ -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; @@ -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 */ @@ -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; @@ -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 *); @@ -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)], @@ -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 @@ -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 */ |
