if (extra->vnc_subtlvs)
MIX(encap_hash_key_make (extra->vnc_subtlvs));
#endif
-#ifdef HAVE_IPV6
MIX(extra->mp_nexthop_len);
key = jhash(extra->mp_nexthop_global.s6_addr, IPV6_MAX_BYTELEN, key);
key = jhash(extra->mp_nexthop_local.s6_addr, IPV6_MAX_BYTELEN, key);
-#endif /* HAVE_IPV6 */
}
return key;
&& ae1->aggregator_addr.s_addr == ae2->aggregator_addr.s_addr
&& ae1->weight == ae2->weight
&& ae1->tag == ae2->tag
-#ifdef HAVE_IPV6
&& ae1->mp_nexthop_len == ae2->mp_nexthop_len
&& IPV6_ADDR_SAME (&ae1->mp_nexthop_global, &ae2->mp_nexthop_global)
&& IPV6_ADDR_SAME (&ae1->mp_nexthop_local, &ae2->mp_nexthop_local)
-#endif /* HAVE_IPV6 */
&& IPV4_ADDR_SAME (&ae1->mp_nexthop_global_in, &ae2->mp_nexthop_global_in)
&& ae1->ecommunity == ae2->ecommunity
&& ae1->cluster == ae2->cluster
attr->extra->weight = BGP_ATTR_DEFAULT_WEIGHT;
attr->extra->tag = 0;
attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_NEXT_HOP);
-#ifdef HAVE_IPV6
attr->extra->mp_nexthop_len = IPV6_MAX_BYTELEN;
-#endif
return attr;
}
}
attre.weight = BGP_ATTR_DEFAULT_WEIGHT;
-#ifdef HAVE_IPV6
attre.mp_nexthop_len = IPV6_MAX_BYTELEN;
-#endif
if (! as_set || atomic_aggregate)
attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_ATOMIC_AGGREGATE);
attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_AGGREGATOR);
stream_getl (s); /* RD low */
stream_get (&attre->mp_nexthop_global_in, s, IPV4_MAX_BYTELEN);
break;
-#ifdef HAVE_IPV6
case BGP_ATTR_NHLEN_IPV6_GLOBAL:
case BGP_ATTR_NHLEN_VPNV6_GLOBAL:
if (attre->mp_nexthop_len == BGP_ATTR_NHLEN_VPNV6_GLOBAL)
attre->mp_nexthop_len = IPV6_MAX_BYTELEN;
}
break;
-#endif /* HAVE_IPV6 */
default:
zlog_info ("%s: (%s) Wrong multiprotocol next hop length: %d",
__func__, peer->host, attre->mp_nexthop_len);
break;
}
break;
-#ifdef HAVE_IPV6
case AFI_IP6:
switch (safi)
{
break;
}
break;
-#endif /*HAVE_IPV6*/
default:
break;
}
/* Nexthop attribute. */
/* If it's an IPv6 prefix, don't dump the IPv4 nexthop to save space */
- if(prefix != NULL
-#ifdef HAVE_IPV6
- && prefix->family != AF_INET6
-#endif /* HAVE_IPV6 */
- )
+ if(prefix != NULL && prefix->family != AF_INET6)
{
stream_putc (s, BGP_ATTR_FLAG_TRANS);
stream_putc (s, BGP_ATTR_NEXT_HOP);
stream_put (s, attr->community->val, attr->community->size * 4);
}
-#ifdef HAVE_IPV6
/* Add a MP_NLRI attribute to dump the IPv6 next hop */
if (prefix != NULL && prefix->family == AF_INET6 && attr->extra &&
(attr->extra->mp_nexthop_len == BGP_ATTR_NHLEN_IPV6_GLOBAL ||
/* Set MP attribute length. */
stream_putc_at (s, sizep, (stream_get_endp (s) - sizep) - 1);
}
-#endif /* HAVE_IPV6 */
/* Return total size of attribute. */
len = stream_get_endp (s) - cp - 2;
if (dp.u.prefix4.s_addr != peer->su.sin.sin_addr.s_addr)
continue;
}
-#ifdef HAVE_IPV6
else if ((dp.family == AF_INET6) &&
(peer->su.sa.sa_family == AF_INET6))
{
sizeof (struct in6_addr)))
continue;
}
-#endif
else
continue;
if (sp.u.prefix4.s_addr != peer->su_local->sin.sin_addr.s_addr)
continue;
}
-#ifdef HAVE_IPV6
else if ((sp.family == AF_INET6) &&
(peer->su_local->sa.sa_family == AF_INET6))
{
sizeof (struct in6_addr)))
continue;
}
-#endif
else
continue;
snprintf (buf + strlen (buf), size - strlen (buf), ", origin %s",
bgp_origin_str[attr->origin]);
-#ifdef HAVE_IPV6
if (attr->extra)
{
char addrbuf[BUFSIZ];
inet_ntop (AF_INET6, &attr->extra->mp_nexthop_local,
addrbuf, BUFSIZ));
}
-#endif /* HAVE_IPV6 */
if (CHECK_FLAG (attr->flag, ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF)))
snprintf (buf + strlen (buf), size - strlen (buf), ", localpref %u",
{
return bgp_show_encap (vty, AFI_IP, NULL, bgp_show_type_normal, NULL, 0);
}
-#ifdef HAVE_IPV6
+
DEFUN (show_bgp_ipv6_encap,
show_bgp_ipv6_encap_cmd,
"show [ip] bgp ipv6 encap",
{
return bgp_show_encap (vty, AFI_IP6, NULL, bgp_show_type_normal, NULL, 0);
}
-#endif
DEFUN (show_bgp_ipv4_encap_rd,
show_bgp_ipv4_encap_rd_cmd,
}
return bgp_show_encap (vty, AFI_IP, &prd, bgp_show_type_normal, NULL, 0);
}
-#ifdef HAVE_IPV6
+
DEFUN (show_bgp_ipv6_encap_rd,
show_bgp_ipv6_encap_rd_cmd,
"show [ip] bgp ipv6 encap rd ASN:nn_or_IP-address:nn",
}
return bgp_show_encap (vty, AFI_IP6, &prd, bgp_show_type_normal, NULL, 0);
}
-#endif
DEFUN (show_bgp_ipv4_encap_tags,
show_bgp_ipv4_encap_tags_cmd,
{
return bgp_show_encap (vty, AFI_IP, NULL, bgp_show_type_normal, NULL, 1);
}
-#ifdef HAVE_IPV6
+
DEFUN (show_bgp_ipv6_encap_tags,
show_bgp_ipv6_encap_tags_cmd,
"show [ip] bgp ipv6 encap tags",
{
return bgp_show_encap (vty, AFI_IP6, NULL, bgp_show_type_normal, NULL, 1);
}
-#endif
DEFUN (show_bgp_ipv4_encap_rd_tags,
show_bgp_ipv4_encap_rd_tags_cmd,
}
return bgp_show_encap (vty, AFI_IP, &prd, bgp_show_type_normal, NULL, 1);
}
-#ifdef HAVE_IPV6
+
DEFUN (show_bgp_ipv6_encap_rd_tags,
show_bgp_ipv6_encap_rd_tags_cmd,
"show [ip] bgp ipv6 encap rd ASN:nn_or_IP-address:nn tags",
}
return bgp_show_encap (vty, AFI_IP6, &prd, bgp_show_type_normal, NULL, 1);
}
-#endif
DEFUN (show_bgp_ipv4_encap_neighbor_routes,
show_bgp_ipv4_encap_neighbor_routes_cmd,
return bgp_show_encap (vty, AFI_IP, NULL, bgp_show_type_neighbor, &su, 0);
}
-#ifdef HAVE_IPV6
+
DEFUN (show_bgp_ipv6_encap_neighbor_routes,
show_bgp_ipv6_encap_neighbor_routes_cmd,
"show [ip] bgp ipv6 encap neighbors A.B.C.D routes",
return bgp_show_encap (vty, AFI_IP6, NULL, bgp_show_type_neighbor, &su, 0);
}
-#endif
DEFUN (show_bgp_ipv4_encap_rd_neighbor_routes,
show_bgp_ipv4_encap_rd_neighbor_routes_cmd,
return bgp_show_encap (vty, AFI_IP, &prd, bgp_show_type_neighbor, &su, 0);
}
-#ifdef HAVE_IPV6
+
DEFUN (show_bgp_ipv6_encap_rd_neighbor_routes,
show_bgp_ipv6_encap_rd_neighbor_routes_cmd,
"show [ip] bgp ipv6 encap rd ASN:nn_or_IP-address:nn neighbors <A.B.C.D|X:X::X:X> routes",
return bgp_show_encap (vty, AFI_IP6, &prd, bgp_show_type_neighbor, &su, 0);
}
-#endif
DEFUN (show_bgp_ipv4_encap_neighbor_advertised_routes,
show_bgp_ipv4_encap_neighbor_advertised_routes_cmd,
return show_adj_route_encap (vty, peer, NULL);
}
-#ifdef HAVE_IPV6
+
DEFUN (show_bgp_ipv6_encap_neighbor_advertised_routes,
show_bgp_ipv6_encap_neighbor_advertised_routes_cmd,
"show [ip] bgp ipv6 encap neighbors A.B.C.D advertised-routes",
return show_adj_route_encap (vty, peer, NULL);
}
-#endif
DEFUN (show_bgp_ipv4_encap_rd_neighbor_advertised_routes,
show_bgp_ipv4_encap_rd_neighbor_advertised_routes_cmd,
return show_adj_route_encap (vty, peer, &prd);
}
-#ifdef HAVE_IPV6
+
DEFUN (show_bgp_ipv6_encap_rd_neighbor_advertised_routes,
show_bgp_ipv6_encap_rd_neighbor_advertised_routes_cmd,
"show [ip] bgp ipv6 encap rd ASN:nn_or_IP-address:nn neighbors <A.B.C.D|X:X::X:X> advertised-routes",
return show_adj_route_encap (vty, peer, &prd);
}
-#endif
void
bgp_encap_init (void)
install_element (VIEW_NODE, &show_bgp_ipv4_encap_neighbor_advertised_routes_cmd);
install_element (VIEW_NODE, &show_bgp_ipv4_encap_rd_neighbor_advertised_routes_cmd);
-#ifdef HAVE_IPV6
install_element (VIEW_NODE, &show_bgp_ipv6_encap_cmd);
install_element (VIEW_NODE, &show_bgp_ipv6_encap_rd_cmd);
install_element (VIEW_NODE, &show_bgp_ipv6_encap_tags_cmd);
install_element (VIEW_NODE, &show_bgp_ipv6_encap_rd_neighbor_routes_cmd);
install_element (VIEW_NODE, &show_bgp_ipv6_encap_neighbor_advertised_routes_cmd);
install_element (VIEW_NODE, &show_bgp_ipv6_encap_rd_neighbor_advertised_routes_cmd);
-#endif
}
compare = IPV4_ADDR_CMP (&ae1->mp_nexthop_global_in,
&ae2->mp_nexthop_global_in);
break;
-#ifdef HAVE_IPV6
case BGP_ATTR_NHLEN_IPV6_GLOBAL:
compare = IPV6_ADDR_CMP (&ae1->mp_nexthop_global,
&ae2->mp_nexthop_global);
compare = IPV6_ADDR_CMP (&ae1->mp_nexthop_local,
&ae2->mp_nexthop_local);
break;
-#endif /* HAVE_IPV6 */
}
}
-#ifdef HAVE_IPV6
/* This can happen if one IPv6 peer sends you global and link-local
* nexthops but another IPv6 peer only sends you global
*/
compare = 1;
}
}
-#endif /* HAVE_IPV6 */
}
return compare;
/* Zap multipath attr nexthop so we set nexthop to self */
attr.nexthop.s_addr = 0;
-#ifdef HAVE_IPV6
if (attr.extra)
memset (&attr.extra->mp_nexthop_global, 0, sizeof (struct in6_addr));
-#endif /* HAVE_IPV6 */
/* TODO: should we set ATOMIC_AGGREGATE and AGGREGATOR? */
}
zlog_err ("%s: could not raise privs", __func__);
if (sockunion_family (&peer->su) == AF_INET)
setsockopt_ipv4_tos (peer->fd, IPTOS_PREC_INTERNETCONTROL);
-# ifdef HAVE_IPV6
else if (sockunion_family (&peer->su) == AF_INET6)
setsockopt_ipv6_tclass (peer->fd, IPTOS_PREC_INTERNETCONTROL);
-# endif
if (bgpd_privs.change (ZPRIVS_LOWER))
zlog_err ("%s: could not lower privs", __func__);
#endif
return connect_error;
}
-#ifdef HAVE_IPV6
if (peer->conf_if || peer->ifname)
ifindex = ifname2ifindex (peer->conf_if ? peer->conf_if : peer->ifname);
-#endif /* HAVE_IPV6 */
if (bgp_debug_neighbor_events(peer))
zlog_debug ("%s [Event] Connect start to %s fd %d",
#ifdef IPTOS_PREC_INTERNETCONTROL
if (sa->sa_family == AF_INET)
setsockopt_ipv4_tos (sock, IPTOS_PREC_INTERNETCONTROL);
-# ifdef HAVE_IPV6
else if (sa->sa_family == AF_INET6)
setsockopt_ipv6_tclass (sock, IPTOS_PREC_INTERNETCONTROL);
-# endif
#endif
sockopt_v6only (sa->sa_family, sock);
}
/* IPv6 supported version of BGP server socket setup. */
-#ifdef HAVE_IPV6
int
bgp_socket (unsigned short port, const char *address)
{
return 0;
}
-#else
-/* Traditional IPv4 only version. */
-int
-bgp_socket (unsigned short port, const char *address)
-{
- int sock;
- int socklen;
- struct sockaddr_in sin;
- int ret;
-
- sock = socket (AF_INET, SOCK_STREAM, 0);
- if (sock < 0)
- {
- zlog_err ("socket: %s", safe_strerror (errno));
- return sock;
- }
-
- /* if we intend to implement ttl-security, this socket needs ttl=255 */
- sockopt_ttl (AF_INET, sock, MAXTTL);
-
- memset (&sin, 0, sizeof (struct sockaddr_in));
- sin.sin_family = AF_INET;
- sin.sin_port = htons (port);
- socklen = sizeof (struct sockaddr_in);
-
- if (address && ((ret = inet_aton(address, &sin.sin_addr)) < 1))
- {
- zlog_err("bgp_socket: could not parse ip address %s: %s",
- address, safe_strerror (errno));
- return ret;
- }
-#ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
- sin.sin_len = socklen;
-#endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */
-
- ret = bgp_listener (sock, (struct sockaddr *) &sin, socklen);
- if (ret < 0)
- {
- close (sock);
- return ret;
- }
- return sock;
-}
-#endif /* HAVE_IPV6 */
void
bgp_close (void)
}
}
}
-#ifdef HAVE_IPV6
else if (addr->family == AF_INET6)
{
apply_mask_ipv6 ((struct prefix_ipv6 *) &p);
rn->info = bc;
}
}
-#endif /* HAVE_IPV6 */
}
void
bgp_unlock_node (rn);
bgp_unlock_node (rn);
}
-#ifdef HAVE_IPV6
else if (addr->family == AF_INET6)
{
apply_mask_ipv6 ((struct prefix_ipv6 *) &p);
bgp_unlock_node (rn);
bgp_unlock_node (rn);
}
-#endif /* HAVE_IPV6 */
}
int
p->prefixlen = IPV4_MAX_BITLEN;
}
break;
-#ifdef HAVE_IPV6
case AFI_IP6:
/* We don't register link local NH */
if (ri->attr->extra->mp_nexthop_len != BGP_ATTR_NHLEN_IPV6_GLOBAL
p->prefixlen = IPV6_MAX_BITLEN;
}
break;
-#endif
default:
if (BGP_DEBUG(nht, NHT))
{
case AF_INET:
stream_put_in_addr (s, &p->u.prefix4);
break;
-#ifdef HAVE_IPV6
case AF_INET6:
stream_put(s, &(p->u.prefix6), 16);
break;
-#endif
default:
break;
}
{
if (family == AF_INET)
attr->nexthop.s_addr = 0;
-#ifdef HAVE_IPV6
if (family == AF_INET6)
memset (&attr->extra->mp_nexthop_global, 0, IPV6_MAX_BYTELEN);
-#endif
}
int
{
if (p->family == AF_INET && p->u.prefix4.s_addr == INADDR_ANY)
return 0;
-#ifdef HAVE_IPV6
else if (p->family == AF_INET6 && p->prefixlen == 0)
return 0;
-#endif /* HAVE_IPV6 */
}
/* Transparency check. */
if (reflect)
SET_FLAG(attr->rmap_change_flags, BATTR_REFLECTED);
-#ifdef HAVE_IPV6
#define NEXTHOP_IS_V6 (\
(safi != SAFI_ENCAP && \
(p->family == AF_INET6 || peer_cap_enhe(peer))) || \
PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED)))
memset (&attr->extra->mp_nexthop_local, 0, IPV6_MAX_BYTELEN);
}
-#endif /* HAVE_IPV6 */
bgp_peer_remove_private_as(bgp, afi, safi, peer, attr);
bgp_peer_as_override(bgp, afi, safi, peer, attr);
IPV4_CLASS_DE (ntohl (attre->mp_nexthop_global_in.s_addr)));
break;
-#ifdef HAVE_IPV6
case BGP_ATTR_NHLEN_IPV6_GLOBAL:
case BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL:
ret = (IN6_IS_ADDR_UNSPECIFIED(&attre->mp_nexthop_global) ||
IN6_IS_ADDR_LOOPBACK(&attre->mp_nexthop_global) ||
IN6_IS_ADDR_MULTICAST(&attre->mp_nexthop_global));
break;
-#endif /* HAVE_IPV6 */
default:
ret = 1;
}
}
-#ifdef HAVE_IPV6
/* Check address. */
if (afi == AFI_IP6 && safi == SAFI_UNICAST)
{
continue;
}
}
-#endif /* HAVE_IPV6 */
/* Normal process. */
if (attr)
vty_out (vty, "%% Malformed prefix%s", VTY_NEWLINE);
return CMD_WARNING;
}
-#ifdef HAVE_IPV6
if (afi == AFI_IP6 && IN6_IS_ADDR_LINKLOCAL (&p.u.prefix6))
{
vty_out (vty, "%% Malformed prefix (link-local address)%s",
VTY_NEWLINE);
return CMD_WARNING;
}
-#endif /* HAVE_IPV6 */
apply_mask (&p);
vty_out (vty, "%% Malformed prefix%s", VTY_NEWLINE);
return CMD_WARNING;
}
-#ifdef HAVE_IPV6
if (afi == AFI_IP6 && IN6_IS_ADDR_LINKLOCAL (&p.u.prefix6))
{
vty_out (vty, "%% Malformed prefix (link-local address)%s",
VTY_NEWLINE);
return CMD_WARNING;
}
-#endif /* HAVE_IPV6 */
apply_mask (&p);
attr.nexthop = *nexthop;
attr.nh_ifindex = ifindex;
-#ifdef HAVE_IPV6
if (nexthop6)
{
struct attr_extra *extra = bgp_attr_extra_get(&attr);
extra->mp_nexthop_global = *nexthop6;
extra->mp_nexthop_len = BGP_ATTR_NHLEN_IPV6_GLOBAL;
}
-#endif
attr.med = metric;
attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC);
vty_out (vty, "%s", inet_ntop(af,
&attr->extra->mp_nexthop_global_in, buf, BUFSIZ));
break;
-#if HAVE_IPV6
case AF_INET6:
vty_out (vty, "%s", inet_ntop(af,
&attr->extra->mp_nexthop_global, buf, BUFSIZ));
break;
-#endif
default:
vty_out(vty, "?");
break;
else
json_object_string_add(json_net, "nextHop", inet_ntoa (attr->nexthop));
}
-#ifdef HAVE_IPV6
else if (p->family == AF_INET6 || BGP_ATTR_NEXTHOP_AFI_IP6(attr))
{
char buf[BUFSIZ];
json_object_string_add(json_net, "netHopGloabal", inet_ntop (AF_INET6, &attr->extra->mp_nexthop_global,
buf, BUFSIZ));
}
-#endif /* HAVE_IPV6 */
if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC))
json_object_int_add(json_net, "metric", attr->med);
else
vty_out (vty, "%-16s", inet_ntoa (attr->nexthop));
}
-#ifdef HAVE_IPV6
else if (p->family == AF_INET6 || BGP_ATTR_NEXTHOP_AFI_IP6(attr))
{
int len;
else
vty_out (vty, "%*s", len, " ");
}
-#endif /* HAVE_IPV6 */
if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC))
vty_out (vty, "%10u", attr->med);
else
vty_out (vty, "%-16s", inet_ntoa (attr->nexthop));
}
}
-#ifdef HAVE_IPV6
else if (p->family == AF_INET6 || BGP_ATTR_NEXTHOP_AFI_IP6(attr))
{
assert (attr->extra);
}
}
-#endif /* HAVE_IPV6 */
}
label = decode_label (binfo->extra->tag);
install_element (ENABLE_NODE, &show_ip_bgp_instance_neighbor_prefix_counts_cmd);
install_element (ENABLE_NODE, &show_ip_bgp_ipv4_neighbor_prefix_counts_cmd);
install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_neighbor_prefix_counts_cmd);
-#ifdef HAVE_IPV6
install_element (ENABLE_NODE, &show_bgp_ipv6_neighbor_prefix_counts_cmd);
install_element (ENABLE_NODE, &show_bgp_instance_ipv6_neighbor_prefix_counts_cmd);
/* Statistics */
install_element (ENABLE_NODE, &show_bgp_statistics_cmd);
install_element (ENABLE_NODE, &show_bgp_statistics_view_cmd);
-#endif /* HAVE_IPV6 */
install_element (BGP_NODE, &bgp_distance_cmd);
install_element (BGP_NODE, &no_bgp_distance_cmd);
};
-#ifdef HAVE_IPV6
/* `match ipv6 address IP_ACCESS_LIST' */
static route_map_result_t
route_set_ipv6_nexthop_peer_free
};
-#endif /* HAVE_IPV6 */
-
/* `set vpnv4 nexthop A.B.C.D' */
static route_map_result_t
return ret;
}
-#ifdef HAVE_IPV6
DEFUN (match_ipv6_next_hop,
match_ipv6_next_hop_cmd,
"match ipv6 next-hop X:X::X:X",
return generic_set_delete (vty, VTY_GET_CONTEXT(route_map_index),
"ipv6 next-hop global", argv[idx_ipv6]->arg);
}
-#endif /* HAVE_IPV6 */
DEFUN (set_vpnv4_nexthop,
set_vpnv4_nexthop_cmd,
install_element (RMAP_NODE, &set_originator_id_cmd);
install_element (RMAP_NODE, &no_set_originator_id_cmd);
-#ifdef HAVE_IPV6
route_map_install_match (&route_match_ipv6_address_cmd);
route_map_install_match (&route_match_ipv6_next_hop_cmd);
route_map_install_match (&route_match_ipv6_address_prefix_list_cmd);
install_element (RMAP_NODE, &no_set_ipv6_nexthop_prefer_global_cmd);
install_element (RMAP_NODE, &set_ipv6_nexthop_peer_cmd);
install_element (RMAP_NODE, &no_set_ipv6_nexthop_peer_cmd);
-#endif /* HAVE_IPV6 */
}
void
addr));
}
-#ifdef HAVE_IPV6
-
/*
* bgp_node_match_ipv6
*/
addr));
}
-#endif /* HAVE_IPV6 */
-
static inline unsigned long
bgp_table_count (const struct bgp_table *const table)
{
if (afi == AFI_IP)
str2prefix ("0.0.0.0/0", &p);
-#ifdef HAVE_IPV6
else if (afi == AFI_IP6)
{
struct attr_extra *ae = attr.extra;
&& !IN6_IS_ADDR_UNSPECIFIED (&peer->nexthop.v6_local))
ae->mp_nexthop_len = BGP_ATTR_NHLEN_IPV6_GLOBAL_AND_LL;
}
-#endif /* HAVE_IPV6 */
if (peer->default_rmap[afi][safi].name)
{
*/
if (afi == AFI_IP)
str2prefix ("0.0.0.0/0", &p);
-#ifdef HAVE_IPV6
else
str2prefix ("::/0", &p);
-#endif /* HAVE_IPV6 */
rn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, &p, NULL);
bgp_adj_out_unset_subgroup (rn, subgrp, 0, BGP_ADDPATH_TX_ID_FOR_DEFAULT_ORIGINATE);
if (afi == AFI_IP)
str2prefix ("0.0.0.0/0", &p);
-#ifdef HAVE_IPV6
else
str2prefix ("::/0", &p);
-#endif /* HAVE_IPV6 */
/* Logging the attribute. */
if (bgp_debug_update(NULL, &p, subgrp->update_group, 0))
if (afi == AFI_IP)
str2prefix ("0.0.0.0/0", &p);
-#ifdef HAVE_IPV6
else
str2prefix ("::/0", &p);
-#endif /* HAVE_IPV6 */
if (bgp_debug_update(NULL, &p, subgrp->update_group, 0))
{
if (!strcmp(afi_str, "ipv4")) {
afi = AFI_IP;
}
-#ifdef HAVE_IPV6
else if (!strcmp(afi_str, "ipv6")) {
afi = AFI_IP6;
}
-#endif /* HAVE_IPV6 */
return afi;
}
if (su->sa.sa_family == AF_INET)
ifp = if_lookup_by_ipv4_exact (&su->sin.sin_addr, bgp->vrf_id);
-#ifdef HAVE_IPV6
else if (su->sa.sa_family == AF_INET6)
ifp = if_lookup_by_ipv6_exact (&su->sin6.sin6_addr,
su->sin6.sin6_scope_id, bgp->vrf_id);
-#endif /* HAVE IPV6 */
if (ifp)
return 1;
|| p->afc_recv[AFI_IP][SAFI_UNICAST]
|| p->afc_adv[AFI_IP][SAFI_MULTICAST]
|| p->afc_recv[AFI_IP][SAFI_MULTICAST]
-#ifdef HAVE_IPV6
|| p->afc_adv[AFI_IP6][SAFI_UNICAST]
|| p->afc_recv[AFI_IP6][SAFI_UNICAST]
|| p->afc_adv[AFI_IP6][SAFI_MULTICAST]
|| p->afc_recv[AFI_IP6][SAFI_MPLS_VPN]
|| p->afc_adv[AFI_IP6][SAFI_ENCAP]
|| p->afc_recv[AFI_IP6][SAFI_ENCAP]
-#endif /* HAVE_IPV6 */
|| p->afc_adv[AFI_IP][SAFI_ENCAP]
|| p->afc_recv[AFI_IP][SAFI_ENCAP]
|| p->afc_adv[AFI_IP][SAFI_MPLS_VPN]
if (use_json)
{
json_object_string_add(json_neigh, "nexthop", inet_ntop (AF_INET, &p->nexthop.v4, buf1, BUFSIZ));
-#ifdef HAVE_IPV6
json_object_string_add(json_neigh, "nexthopGlobal", inet_ntop (AF_INET6, &p->nexthop.v6_global, buf1, BUFSIZ));
json_object_string_add(json_neigh, "nexthopLocal", inet_ntop (AF_INET6, &p->nexthop.v6_local, buf1, BUFSIZ));
if (p->shared_network)
json_object_string_add(json_neigh, "bgpConnection", "sharedNetwork");
else
json_object_string_add(json_neigh, "bgpConnection", "nonSharedNetwork");
-#endif /* HAVE_IPV6 */
}
else
{
vty_out (vty, "Nexthop: %s%s",
inet_ntop (AF_INET, &p->nexthop.v4, buf1, BUFSIZ),
VTY_NEWLINE);
-#ifdef HAVE_IPV6
vty_out (vty, "Nexthop global: %s%s",
inet_ntop (AF_INET6, &p->nexthop.v6_global, buf1, BUFSIZ),
VTY_NEWLINE);
vty_out (vty, "BGP connection: %s%s",
p->shared_network ? "shared network" : "non shared network",
VTY_NEWLINE);
-#endif /* HAVE_IPV6 */
}
}
return bgp_redistribute_unset (bgp, AFI_IP, type, 0);
}
-#ifdef HAVE_IPV6
DEFUN (bgp_redistribute_ipv6,
bgp_redistribute_ipv6_cmd,
"redistribute <kernel|connected|static|ripng|ospf6|isis|table>",
return bgp_redistribute_unset (bgp, AFI_IP6, type, 0);
}
-#endif /* HAVE_IPV6 */
int
bgp_config_write_redistribute (struct vty *vty, struct bgp *bgp, afi_t afi,
/* address-family commands. */
install_element (BGP_NODE, &address_family_ipv4_cmd);
install_element (BGP_NODE, &address_family_ipv4_safi_cmd);
-#ifdef HAVE_IPV6
install_element (BGP_NODE, &address_family_ipv6_cmd);
install_element (BGP_NODE, &address_family_ipv6_safi_cmd);
-#endif /* HAVE_IPV6 */
install_element (BGP_NODE, &address_family_vpnv4_cmd);
install_element (BGP_NODE, &address_family_vpnv6_cmd);
install_element (BGP_NODE, &address_family_encap_cmd);
-#ifdef HAVE_IPV6
install_element (BGP_NODE, &address_family_encapv6_cmd);
-#endif
/* "exit-address-family" command. */
install_element (BGP_IPV4_NODE, &exit_address_family_cmd);
install_element (BGP_IPV4_NODE, &bgp_redistribute_ipv4_ospf_metric_cmd);
install_element (BGP_IPV4_NODE, &bgp_redistribute_ipv4_ospf_rmap_metric_cmd);
install_element (BGP_IPV4_NODE, &bgp_redistribute_ipv4_ospf_metric_rmap_cmd);
-#ifdef HAVE_IPV6
install_element (BGP_IPV6_NODE, &bgp_redistribute_ipv6_cmd);
install_element (BGP_IPV6_NODE, &no_bgp_redistribute_ipv6_cmd);
install_element (BGP_IPV6_NODE, &bgp_redistribute_ipv6_rmap_cmd);
install_element (BGP_IPV6_NODE, &bgp_redistribute_ipv6_metric_cmd);
install_element (BGP_IPV6_NODE, &bgp_redistribute_ipv6_rmap_metric_cmd);
install_element (BGP_IPV6_NODE, &bgp_redistribute_ipv6_metric_rmap_cmd);
-#endif /* HAVE_IPV6 */
/* ttl_security commands */
install_element (BGP_NODE, &neighbor_ttl_security_cmd);
return 0;
}
-#ifdef HAVE_IPV6
/* Zebra route add and delete treatment. */
static int
zebra_read_ipv6 (int command, struct zclient *zclient, zebra_size_t length,
return 0;
}
-#endif /* HAVE_IPV6 */
struct interface *
if_lookup_by_ipv4 (struct in_addr *addr, vrf_id_t vrf_id)
return NULL;
}
-#ifdef HAVE_IPV6
struct interface *
if_lookup_by_ipv6 (struct in6_addr *addr, ifindex_t ifindex, vrf_id_t vrf_id)
{
}
return 0;
}
-#endif /* HAVE_IPV6 */
static int
if_get_ipv4_address (struct interface *ifp, struct in_addr *addr)
else
ifp = if_lookup_by_ipv4_exact (&local->sin.sin_addr, peer->bgp->vrf_id);
}
-#ifdef HAVE_IPV6
if (local->sa.sa_family == AF_INET6)
{
if (IN6_IS_ADDR_LINKLOCAL (&local->sin6.sin6_addr))
local->sin6.sin6_scope_id,
peer->bgp->vrf_id);
}
-#endif /* HAVE_IPV6 */
if (!ifp)
return -1;
/* IPv4 connection, fetch and store IPv6 local address(es) if any. */
if (local->sa.sa_family == AF_INET)
{
-#ifdef HAVE_IPV6
/* IPv6 nexthop*/
ret = if_get_ipv6_global (ifp, &nexthop->v6_global);
peer->shared_network = 1;
else
peer->shared_network = 0;
-#endif /* HAVE_IPV6 */
}
-#ifdef HAVE_IPV6
/* IPv6 connection, fetch and store IPv4 local address if any. */
if (local->sa.sa_family == AF_INET6)
{
SET_IN6_LINKLOCAL_IFINDEX (nexthop->v6_local, 0);
}
#endif /* KAME */
-#endif /* HAVE_IPV6 */
/* If we have identified the local interface, there is no error for now. */
return 0;
zapi_ipv4_route (valid_nh_count ? ZEBRA_IPV4_ROUTE_ADD: ZEBRA_IPV4_ROUTE_DELETE,
zclient, (struct prefix_ipv4 *) p, &api);
}
-#ifdef HAVE_IPV6
/* We have to think about a IPv6 link-local address curse. */
if (p->family == AF_INET6 ||
zclient, (struct prefix_ipv6 *) p, &api);
}
}
-#endif /* HAVE_IPV6 */
}
/* Announce all routes of a table to zebra */
zapi_ipv4_route (ZEBRA_IPV4_ROUTE_DELETE, zclient,
(struct prefix_ipv4 *) p, &api);
}
-#ifdef HAVE_IPV6
/* We have to think about a IPv6 link-local address curse. */
if (p->family == AF_INET6)
{
zapi_ipv6_route (ZEBRA_IPV6_ROUTE_DELETE, zclient,
(struct prefix_ipv6 *) p, &api);
}
-#endif /* HAVE_IPV6 */
}
+
struct bgp_redist *
bgp_redist_lookup (struct bgp *bgp, afi_t afi, u_char type, u_short instance)
{
extern struct interface *if_lookup_by_ipv4 (struct in_addr *, vrf_id_t);
extern struct interface *if_lookup_by_ipv4_exact (struct in_addr *, vrf_id_t);
-#ifdef HAVE_IPV6
extern struct interface *if_lookup_by_ipv6 (struct in6_addr *, ifindex_t, vrf_id_t);
extern struct interface *if_lookup_by_ipv6_exact (struct in6_addr *, ifindex_t, vrf_id_t);
-#endif /* HAVE_IPV6 */
extern int bgp_zebra_num_connects(void);
{
struct interface *ifp;
struct in_addr v4;
-#ifdef HAVE_IPV6
struct in6_addr v6_global;
struct in6_addr v6_local;
-#endif /* HAVE_IPV6 */
};
/* BGP addpath values */
AC_MSG_ERROR([Failed to detect IPv6 stack])
fi
-dnl this is unconditial, for compatibility
-AC_DEFINE(HAVE_IPV6,1,IPv6)
-
dnl ------------------
dnl IPv6 header checks
dnl ------------------
list_delete (adj->area_addrs);
if (adj->ipv4_addrs)
list_delete (adj->ipv4_addrs);
-#ifdef HAVE_IPV6
if (adj->ipv6_addrs)
list_delete (adj->ipv6_addrs);
-#endif
XFREE (MTYPE_ISIS_ADJACENCY, adj);
return;
struct isis_dynhn *dyn;
struct listnode *node;
struct in_addr *ipv4_addr;
-#ifdef HAVE_IPV6
struct in6_addr *ipv6_addr;
u_char ip6[INET6_ADDRSTRLEN];
-#endif /* HAVE_IPV6 */
if (!adj)
return;
zlog_debug ("%s", inet_ntoa (*ipv4_addr));
}
-#ifdef HAVE_IPV6
if (adj->ipv6_addrs && listcount (adj->ipv6_addrs) > 0)
{
zlog_debug ("IPv6 Address(es):");
zlog_debug ("%s", ip6);
}
}
-#endif /* HAVE_IPV6 */
zlog_debug ("Speaks: %s", nlpid2string (&adj->nlpids));
return;
void
isis_adj_print_vty (struct isis_adjacency *adj, struct vty *vty, char detail)
{
-#ifdef HAVE_IPV6
struct in6_addr *ipv6_addr;
u_char ip6[INET6_ADDRSTRLEN];
-#endif /* HAVE_IPV6 */
struct in_addr *ip_addr;
time_t now;
struct isis_dynhn *dyn;
for (ALL_LIST_ELEMENTS_RO (adj->ipv4_addrs, node, ip_addr))
vty_out (vty, " %s%s", inet_ntoa (*ip_addr), VTY_NEWLINE);
}
-#ifdef HAVE_IPV6
if (adj->ipv6_addrs && listcount (adj->ipv6_addrs) > 0)
{
vty_out (vty, " IPv6 Address(es):%s", VTY_NEWLINE);
vty_out (vty, " %s%s", ip6, VTY_NEWLINE);
}
}
-#endif /* HAVE_IPV6 */
vty_out (vty, "%s", VTY_NEWLINE);
}
return;
struct nlpids nlpids; /* protocols spoken ... */
struct list *ipv4_addrs;
struct in_addr router_address;
-#ifdef HAVE_IPV6
struct list *ipv6_addrs;
struct in6_addr router_address6;
-#endif /* HAVE_IPV6 */
u_char prio[ISIS_LEVELS]; /* priorityOfNeighbour for DIS */
int circuit_t; /* from hello PDU hdr */
int level; /* level (1 or 2) */
struct prefix_ipv4 *ipv4, *ip = NULL;
struct listnode *node;
char buf[PREFIX2STR_BUFFER];
-#ifdef HAVE_IPV6
struct prefix_ipv6 *ipv6, *ip6 = NULL;
int found = 0;
-#endif /* HAVE_IPV6 */
if (connected->address->family == AF_INET)
{
prefix_ipv4_free (ipv4);
}
-#ifdef HAVE_IPV6
if (connected->address->family == AF_INET6)
{
ipv6 = prefix_ipv6_new ();
prefix_ipv6_free (ipv6);
}
-#endif /* HAVE_IPV6 */
return;
}
}
circuit->ip_addrs = list_new ();
-#ifdef HAVE_IPV6
circuit->ipv6_link = list_new ();
circuit->ipv6_non_link = list_new ();
-#endif /* HAVE_IPV6 */
for (ALL_LIST_ELEMENTS (ifp->connected, node, nnode, conn))
isis_circuit_add_addr (circuit, conn);
circuit->ip_addrs = NULL;
}
-#ifdef HAVE_IPV6
if (circuit->ipv6_link)
{
assert (listcount(circuit->ipv6_link) == 0);
list_delete (circuit->ipv6_non_link);
circuit->ipv6_non_link = NULL;
}
-#endif /* HAVE_IPV6 */
circuit->circ_type = CIRCUIT_T_UNKNOWN;
circuit->circuit_id = 0;
circuit->nlpids.nlpids[0] = NLPID_IP;
circuit->nlpids.count++;
}
-#ifdef HAVE_IPV6
if (circuit->ipv6_router)
{
circuit->nlpids.nlpids[circuit->nlpids.count] = NLPID_IPV6;
circuit->nlpids.count++;
}
-#endif /* HAVE_IPV6 */
return;
}
vty_out (vty, " isis network point-to-point%s", VTY_NEWLINE);
write++;
}
-#ifdef HAVE_IPV6
if (circuit->ipv6_router)
{
vty_out (vty, " ipv6 router isis %s%s", area->area_tag,
VTY_NEWLINE);
write++;
}
-#endif /* HAVE_IPV6 */
/* ISIS - circuit type */
if (circuit->is_type == IS_LEVEL_1)
int ip_router; /* Route IP ? */
int is_passive; /* Is Passive ? */
struct list *ip_addrs; /* our IP addresses */
-#ifdef HAVE_IPV6
int ipv6_router; /* Route IPv6 ? */
struct list *ipv6_link; /* our link local IPv6 addresses */
struct list *ipv6_non_link; /* our non-link local IPv6 addresses */
-#endif /* HAVE_IPV6 */
u_int16_t upadjcount[2];
#define ISIS_CIRCUIT_FLAPPED_AFTER_SPF 0x01
u_char flags;
}
isis_spf_schedule (lsp->area, lsp->level);
-#ifdef HAVE_IPV6
isis_spf_schedule6 (lsp->area, lsp->level);
-#endif
if (lsp->pdu)
stream_free (lsp->pdu);
ntohs (lsp->lsp_header->pdu_len) - 12, 12);
isis_spf_schedule (lsp->area, lsp->level);
-#ifdef HAVE_IPV6
isis_spf_schedule6 (lsp->area, lsp->level);
-#endif
return;
}
expected |= TLVFLAG_IPV4_ADDR;
expected |= TLVFLAG_IPV4_INT_REACHABILITY;
expected |= TLVFLAG_IPV4_EXT_REACHABILITY;
-#ifdef HAVE_IPV6
expected |= TLVFLAG_IPV6_ADDR;
expected |= TLVFLAG_IPV6_REACHABILITY;
-#endif /* HAVE_IPV6 */
retval = parse_tlvs (area->area_tag, STREAM_DATA (lsp->pdu) +
ISIS_FIXED_HDR_LEN + ISIS_LSP_HDR_LEN,
if (lsp->lsp_header->seq_num != 0)
{
isis_spf_schedule (lsp->area, lsp->level);
-#ifdef HAVE_IPV6
isis_spf_schedule6 (lsp->area, lsp->level);
-#endif
}
}
struct ipv4_reachability *ipv4_reach;
struct in_addr *ipv4_addr;
struct te_ipv4_reachability *te_ipv4_reach;
-#ifdef HAVE_IPV6
struct ipv6_reachability *ipv6_reach;
struct in6_addr in6;
u_char buff[BUFSIZ];
-#endif
u_char LSPid[255];
u_char hostname[255];
u_char ipv4_reach_prefix[20];
}
/* IPv6 tlv */
-#ifdef HAVE_IPV6
if (lsp->tlv_data.ipv6_reachs)
for (ALL_LIST_ELEMENTS_RO (lsp->tlv_data.ipv6_reachs, lnode, ipv6_reach))
{
ntohl (ipv6_reach->metric),
buff, ipv6_reach->prefix_len, VTY_NEWLINE);
}
-#endif
/* TE IS neighbor tlv */
if (lsp->tlv_data.te_is_neighs)
struct ipv4_reachability *ipreach;
struct te_ipv4_reachability *te_ipreach;
struct isis_adjacency *nei;
-#ifdef HAVE_IPV6
struct prefix_ipv6 *ipv6, ip6prefix;
struct ipv6_reachability *ip6reach;
-#endif /* HAVE_IPV6 */
struct tlvs tlv_data;
struct isis_lsp *lsp0 = lsp;
struct in_addr *routerid;
tlv_add_area_addrs (lsp->tlv_data.area_addrs, lsp->pdu);
/* Protocols Supported */
- if (area->ip_circuits > 0
-#ifdef HAVE_IPV6
- || area->ipv6_circuits > 0
-#endif /* HAVE_IPV6 */
- )
+ if (area->ip_circuits > 0 || area->ipv6_circuits > 0)
{
lsp->tlv_data.nlpids = XCALLOC (MTYPE_ISIS_TLV, sizeof (struct nlpids));
lsp->tlv_data.nlpids->count = 0;
lsp->tlv_data.nlpids->count++;
lsp->tlv_data.nlpids->nlpids[0] = NLPID_IP;
}
-#ifdef HAVE_IPV6
if (area->ipv6_circuits > 0)
{
lsp_debug("ISIS (%s): Found IPv6 circuit, adding IPv6 to NLPIDs", area->area_tag);
lsp->tlv_data.nlpids->nlpids[lsp->tlv_data.nlpids->count - 1] =
NLPID_IPV6;
}
-#endif /* HAVE_IPV6 */
tlv_add_nlpid (lsp->tlv_data.nlpids, lsp->pdu);
}
}
}
-#ifdef HAVE_IPV6
/*
* Add IPv6 reachability of this circuit
*/
listnode_add (tlv_data.ipv6_reachs, ip6reach);
}
}
-#endif /* HAVE_IPV6 */
switch (circuit->circ_type)
{
lsp0, area, level);
}
-#ifdef HAVE_IPV6
while (tlv_data.ipv6_reachs && listcount (tlv_data.ipv6_reachs))
{
if (lsp->tlv_data.ipv6_reachs == NULL)
lsp = lsp_next_frag (LSP_FRAGMENT (lsp->lsp_header->lsp_id) + 1,
lsp0, area, level);
}
-#endif /* HAVE_IPV6 */
while (tlv_data.is_neighs && listcount (tlv_data.is_neighs))
{
}
}
-#ifdef HAVE_IPV6
static void
tlvs_to_adj_ipv6_addrs (struct tlvs *tlvs, struct isis_adjacency *adj)
{
}
}
-#endif /* HAVE_IPV6 */
/*
* RECEIVE SIDE
zlog_warn ("ISIS-Adj: IPv4 addresses present but no overlap "
"in P2P IIH from %s\n", circuit->interface->name);
}
-#ifndef HAVE_IPV6
- else /* !(found & TLVFLAG_IPV4_ADDR) */
- zlog_warn ("ISIS-Adj: no IPv4 in P2P IIH from %s "
- "(this isisd has no IPv6)\n", circuit->interface->name);
-
-#else
if (found & TLVFLAG_IPV6_ADDR)
{
/* TBA: check that we have a linklocal ourselves? */
if (!(found & (TLVFLAG_IPV4_ADDR | TLVFLAG_IPV6_ADDR)))
zlog_warn ("ISIS-Adj: neither IPv4 nor IPv6 addr in P2P IIH from %s\n",
circuit->interface->name);
-#endif
if (!v6_usable && !v4_usable)
{
set_circuitparams_rmt_ipaddr (circuit->mtc, *ip_addr);
}
-#ifdef HAVE_IPV6
if (found & TLVFLAG_IPV6_ADDR)
tlvs_to_adj_ipv6_addrs (&tlvs, adj);
-#endif /* HAVE_IPV6 */
/* lets take care of the expiry */
THREAD_TIMER_OFF (adj->t_expire);
zlog_warn ("ISIS-Adj: IPv4 addresses present but no overlap "
"in LAN IIH from %s\n", circuit->interface->name);
}
-#ifndef HAVE_IPV6
- else /* !(found & TLVFLAG_IPV4_ADDR) */
- zlog_warn ("ISIS-Adj: no IPv4 in LAN IIH from %s "
- "(this isisd has no IPv6)\n", circuit->interface->name);
-
-#else
if (found & TLVFLAG_IPV6_ADDR)
{
/* TBA: check that we have a linklocal ourselves? */
if (!(found & (TLVFLAG_IPV4_ADDR | TLVFLAG_IPV6_ADDR)))
zlog_warn ("ISIS-Adj: neither IPv4 nor IPv6 addr in LAN IIH from %s\n",
circuit->interface->name);
-#endif
if (!v6_usable && !v4_usable)
{
if (found & TLVFLAG_IPV4_ADDR)
tlvs_to_adj_ipv4_addrs (&tlvs, adj);
-#ifdef HAVE_IPV6
if (found & TLVFLAG_IPV6_ADDR)
tlvs_to_adj_ipv6_addrs (&tlvs, adj);
-#endif /* HAVE_IPV6 */
adj->circuit_t = hdr.circuit_t;
if (tlv_add_ip_addrs (circuit->ip_addrs, circuit->snd_stream))
return ISIS_WARNING;
-#ifdef HAVE_IPV6
/* IPv6 Interface Address TLV */
if (circuit->ipv6_router && circuit->ipv6_link &&
listcount (circuit->ipv6_link) > 0)
if (tlv_add_ipv6_addrs (circuit->ipv6_link, circuit->snd_stream))
return ISIS_WARNING;
-#endif /* HAVE_IPV6 */
if (circuit->pad_hellos)
if (tlv_add_padding (circuit->snd_stream))
}
#endif /* EXTREME_DEBUG */
-#ifdef HAVE_IPV6
static struct isis_nexthop6 *
isis_nexthop6_new (struct in6_addr *ip6, ifindex_t ifindex)
{
nexthop6_print (nh6);
}
#endif /* EXTREME_DEBUG */
-#endif /* HAVE_IPV6 */
static void
adjinfo2nexthop (struct list *nexthops, struct isis_adjacency *adj)
}
}
-#ifdef HAVE_IPV6
static void
adjinfo2nexthop6 (struct list *nexthops6, struct isis_adjacency *adj)
{
}
}
}
-#endif /* HAVE_IPV6 */
static struct isis_route_info *
isis_route_info_new (struct prefix *prefix, uint32_t cost, uint32_t depth,
adjinfo2nexthop (rinfo->nexthops, adj);
}
}
-#ifdef HAVE_IPV6
if (prefix->family == AF_INET6)
{
rinfo->nexthops6 = list_new ();
}
}
-#endif /* HAVE_IPV6 */
-
rinfo->cost = cost;
rinfo->depth = depth;
list_delete (route_info->nexthops);
}
-#ifdef HAVE_IPV6
if (route_info->nexthops6)
{
route_info->nexthops6->del = (void (*)(void *)) isis_nexthop6_delete;
list_delete (route_info->nexthops6);
}
-#endif /* HAVE_IPV6 */
XFREE (MTYPE_ISIS_ROUTE_INFO, route_info);
}
{
struct listnode *node;
struct isis_nexthop *nexthop;
-#ifdef HAVE_IPV6
struct isis_nexthop6 *nexthop6;
-#endif /* HAVE_IPV6 */
if (!CHECK_FLAG (old->flag, ISIS_ROUTE_FLAG_ZEBRA_SYNCED))
return 0;
== 0)
return 0;
}
-#ifdef HAVE_IPV6
else if (family == AF_INET6)
{
for (ALL_LIST_ELEMENTS_RO (new->nexthops6, node, nexthop6))
nexthop6->ifindex) == 0)
return 0;
}
-#endif /* HAVE_IPV6 */
return 1;
}
if (family == AF_INET)
route_node = route_node_get (area->route_table[level - 1], prefix);
-#ifdef HAVE_IPV6
else if (family == AF_INET6)
route_node = route_node_get (area->route_table6[level - 1], prefix);
-#endif /* HAVE_IPV6 */
else
{
isis_route_info_delete (rinfo_new);
drnode->info = NULL;
}
-#ifdef HAVE_IPV6
if (rnode->p.family == AF_INET6)
{
drnode = route_node_get (area->route_table6[0], &rnode->p);
if (drnode->info == rnode->info)
drnode->info = NULL;
}
-#endif
isis_route_delete (&rnode->p, table);
}
if (family == AF_INET)
table = area->route_table[0];
-#ifdef HAVE_IPV6
else if (family == AF_INET6)
table = area->route_table6[0];
-#endif
for (rnode = route_top (table); rnode; rnode = route_next (rnode))
{
if (family == AF_INET)
table = area->route_table[1];
-#ifdef HAVE_IPV6
else if (family == AF_INET6)
table = area->route_table6[1];
-#endif
for (rnode = route_top (table); rnode; rnode = route_next (rnode))
{
else
isis_route_validate_merge (area, AF_INET);
-#ifdef HAVE_IPV6
if (area->is_type == IS_LEVEL_1)
isis_route_validate_table (area, area->route_table6[0]);
else if (area->is_type == IS_LEVEL_2)
isis_route_validate_table (area, area->route_table6[1]);
else
isis_route_validate_merge (area, AF_INET6);
-#endif
if (!area->circuit_list) {
return;
#ifndef _ZEBRA_ISIS_ROUTE_H
#define _ZEBRA_ISIS_ROUTE_H
-#ifdef HAVE_IPV6
struct isis_nexthop6
{
ifindex_t ifindex;
struct in6_addr router_address6;
unsigned int lock;
};
-#endif /* HAVE_IPV6 */
struct isis_nexthop
{
u_int32_t cost;
u_int32_t depth;
struct list *nexthops;
-#ifdef HAVE_IPV6
struct list *nexthops6;
-#endif /* HAVE_IPV6 */
};
struct isis_route_info *isis_route_create (struct prefix *prefix,
case VTYPE_IPREACH_TE:
return "IP TE";
break;
-#ifdef HAVE_IPV6
case VTYPE_IP6REACH_INTERNAL:
return "IP6 internal";
break;
case VTYPE_IP6REACH_EXTERNAL:
return "IP6 external";
break;
-#endif /* HAVE_IPV6 */
default:
return "UNKNOWN";
}
case VTYPE_IPREACH_INTERNAL:
case VTYPE_IPREACH_EXTERNAL:
case VTYPE_IPREACH_TE:
-#ifdef HAVE_IPV6
case VTYPE_IP6REACH_INTERNAL:
case VTYPE_IP6REACH_EXTERNAL:
-#endif /* HAVE_IPV6 */
prefix2str ((struct prefix *) &vertex->N.prefix, buff, size);
break;
default:
case VTYPE_IPREACH_INTERNAL:
case VTYPE_IPREACH_EXTERNAL:
case VTYPE_IPREACH_TE:
-#ifdef HAVE_IPV6
case VTYPE_IP6REACH_INTERNAL:
case VTYPE_IP6REACH_EXTERNAL:
-#endif /* HAVE_IPV6 */
memcpy (&vertex->N.prefix, (struct prefix *) id,
sizeof (struct prefix));
break;
{
if (area->spftree[0] == NULL)
area->spftree[0] = isis_spftree_new (area);
-#ifdef HAVE_IPV6
if (area->spftree6[0] == NULL)
area->spftree6[0] = isis_spftree_new (area);
-#endif
}
if (area->is_type & IS_LEVEL_2)
{
if (area->spftree[1] == NULL)
area->spftree[1] = isis_spftree_new (area);
-#ifdef HAVE_IPV6
if (area->spftree6[1] == NULL)
area->spftree6[1] = isis_spftree_new (area);
-#endif
}
return;
isis_spftree_del (area->spftree[0]);
area->spftree[0] = NULL;
}
-#ifdef HAVE_IPV6
if (area->spftree6[0])
{
isis_spftree_del (area->spftree6[0]);
area->spftree6[0] = NULL;
}
-#endif
}
if (area->is_type & IS_LEVEL_2)
isis_spftree_del (area->spftree[1]);
area->spftree[1] = NULL;
}
-#ifdef HAVE_IPV6
if (area->spftree6[1] != NULL)
{
isis_spftree_del (area->spftree6[1]);
area->spftree6[1] = NULL;
}
-#endif
}
return;
{
if (area->spftree[0] != NULL)
isis_spftree_adj_del (area->spftree[0], adj);
-#ifdef HAVE_IPV6
if (area->spftree6[0] != NULL)
isis_spftree_adj_del (area->spftree6[0], adj);
-#endif
}
if (area->is_type & IS_LEVEL_2)
{
if (area->spftree[1] != NULL)
isis_spftree_adj_del (area->spftree[1], adj);
-#ifdef HAVE_IPV6
if (area->spftree6[1] != NULL)
isis_spftree_adj_del (area->spftree6[1], adj);
-#endif
}
return;
case VTYPE_IPREACH_INTERNAL:
case VTYPE_IPREACH_EXTERNAL:
case VTYPE_IPREACH_TE:
-#ifdef HAVE_IPV6
case VTYPE_IP6REACH_INTERNAL:
case VTYPE_IP6REACH_EXTERNAL:
-#endif /* HAVE_IPV6 */
p1 = (struct prefix *) id;
p2 = (struct prefix *) &vertex->N.id;
if (p1->family == p2->family && p1->prefixlen == p2->prefixlen &&
struct te_ipv4_reachability *te_ipv4_reach;
enum vertextype vtype;
struct prefix prefix;
-#ifdef HAVE_IPV6
struct ipv6_reachability *ip6reach;
-#endif /* HAVE_IPV6 */
static const u_char null_sysid[ISIS_SYS_ID_LEN];
if (!speaks (lsp->tlv_data.nlpids, family))
family, parent);
}
}
-#ifdef HAVE_IPV6
if (family == AF_INET6 && lsp->tlv_data.ipv6_reachs)
{
prefix.family = AF_INET6;
family, parent);
}
}
-#endif /* HAVE_IPV6 */
if (fragnode == NULL)
fragnode = listhead (lsp->lspu.frags);
int retval = ISIS_OK;
u_char lsp_id[ISIS_SYS_ID_LEN + 2];
static u_char null_lsp_id[ISIS_SYS_ID_LEN + 2];
-#ifdef HAVE_IPV6
struct prefix_ipv6 *ipv6;
-#endif /* HAVE_IPV6 */
for (ALL_LIST_ELEMENTS_RO (spftree->area->circuit_list, cnode, circuit))
{
continue;
if (family == AF_INET && !circuit->ip_router)
continue;
-#ifdef HAVE_IPV6
if (family == AF_INET6 && !circuit->ipv6_router)
continue;
-#endif /* HAVE_IPV6 */
/*
* Add IP(v6) addresses of this circuit
*/
NULL, 0, family, parent);
}
}
-#ifdef HAVE_IPV6
if (family == AF_INET6)
{
prefix.family = AF_INET6;
&prefix, NULL, 0, family, parent);
}
}
-#endif /* HAVE_IPV6 */
if (circuit->circ_type == CIRCUIT_T_BROADCAST)
{
/*
if (family == AF_INET)
spftree = area->spftree[level - 1];
-#ifdef HAVE_IPV6
else if (family == AF_INET6)
spftree = area->spftree6[level - 1];
-#endif
assert (spftree);
assert (sysid);
/* Make all routes in current route table inactive. */
if (family == AF_INET)
table = area->route_table[level - 1];
-#ifdef HAVE_IPV6
else if (family == AF_INET6)
table = area->route_table6[level - 1];
-#endif
isis_route_invalidate_table (area, table);
return ISIS_OK;
}
-#ifdef HAVE_IPV6
static int
isis_run_spf6_l1 (struct thread *thread)
{
return retval;
}
-#endif
static void
isis_print_paths (struct vty *vty, struct list *paths, u_char *root_sysid)
isis_print_paths (vty, area->spftree[level]->paths, isis->sysid);
vty_out (vty, "%s", VTY_NEWLINE);
}
-#ifdef HAVE_IPV6
if (area->ipv6_circuits > 0 && area->spftree6[level]
&& area->spftree6[level]->paths->count > 0)
{
isis_print_paths (vty, area->spftree6[level]->paths, isis->sysid);
vty_out (vty, "%s", VTY_NEWLINE);
}
-#endif /* HAVE_IPV6 */
}
vty_out (vty, "%s", VTY_NEWLINE);
isis_print_paths (vty, area->spftree[0]->paths, isis->sysid);
vty_out (vty, "%s", VTY_NEWLINE);
}
-#ifdef HAVE_IPV6
if (area->ipv6_circuits > 0 && area->spftree6[0]
&& area->spftree6[0]->paths->count > 0)
{
isis_print_paths (vty, area->spftree6[0]->paths, isis->sysid);
vty_out (vty, "%s", VTY_NEWLINE);
}
-#endif /* HAVE_IPV6 */
vty_out (vty, "%s", VTY_NEWLINE);
}
isis_print_paths (vty, area->spftree[1]->paths, isis->sysid);
vty_out (vty, "%s", VTY_NEWLINE);
}
-#ifdef HAVE_IPV6
if (area->ipv6_circuits > 0 && area->spftree6[1]
&& area->spftree6[1]->paths->count > 0)
{
isis_print_paths (vty, area->spftree6[1]->paths, isis->sysid);
vty_out (vty, "%s", VTY_NEWLINE);
}
-#endif /* HAVE_IPV6 */
vty_out (vty, "%s", VTY_NEWLINE);
}
VTYPE_ES,
VTYPE_IPREACH_INTERNAL,
VTYPE_IPREACH_EXTERNAL,
- VTYPE_IPREACH_TE
-#ifdef HAVE_IPV6
- ,
+ VTYPE_IPREACH_TE,
VTYPE_IP6REACH_INTERNAL,
VTYPE_IP6REACH_EXTERNAL
-#endif /* HAVE_IPV6 */
};
/*
struct isis_adjacency *adj);
int isis_spf_schedule (struct isis_area *area, int level);
void isis_spf_cmds_init (void);
-#ifdef HAVE_IPV6
int isis_spf_schedule6 (struct isis_area *area, int level);
-#endif
#endif /* _ZEBRA_ISIS_SPF_H */
list_delete (tlvs->ipv4_ext_reachs);
if (tlvs->te_ipv4_reachs)
list_delete (tlvs->te_ipv4_reachs);
-#ifdef HAVE_IPV6
if (tlvs->ipv6_addrs)
list_delete (tlvs->ipv6_addrs);
if (tlvs->ipv6_reachs)
list_delete (tlvs->ipv6_reachs);
-#endif /* HAVE_IPV6 */
memset (tlvs, 0, sizeof (struct tlvs));
struct in_addr *ipv4_addr;
struct ipv4_reachability *ipv4_reach;
struct te_ipv4_reachability *te_ipv4_reach;
-#ifdef HAVE_IPV6
struct in6_addr *ipv6_addr;
struct ipv6_reachability *ipv6_reach;
int prefix_octets;
-#endif /* HAVE_IPV6 */
int value_len, retval = ISIS_OK;
u_char *start = stream, *pnt = stream, *endpnt;
pnt = endpnt;
break;
-#ifdef HAVE_IPV6
case IPV6_ADDR:
/* +-------+-------+-------+-------+-------+-------+-------+-------+
* + IP version 6 address + 16
pnt = endpnt;
break;
-#endif /* HAVE_IPV6 */
case WAY3_HELLO:
/* +---------------------------------------------------------------+
return add_tlv (TE_IPV4_REACHABILITY, pos - value, value, stream);
}
-#ifdef HAVE_IPV6
int
tlv_add_ipv6_addrs (struct list *ipv6_addrs, struct stream *stream)
{
return add_tlv (IPV6_REACHABILITY, pos - value, value, stream);
}
-#endif /* HAVE_IPV6 */
int
tlv_add_padding (struct stream *stream)
u_char *value;
};
-#ifdef HAVE_IPV6
struct ipv6_reachability
{
u_int32_t metric;
#define DISTRIBUTION_EXTERNAL 0x40
#define CTRL_INFO_SUBTLVS 0x20
-#endif /* HAVE_IPV6 */
/*
* Pointer to each tlv type, filled by parse_tlvs()
struct list *ipv4_int_reachs;
struct list *ipv4_ext_reachs;
struct list *te_ipv4_reachs;
-#ifdef HAVE_IPV6
struct list *ipv6_addrs;
struct list *ipv6_reachs;
-#endif
struct isis_passwd auth_info;
};
int tlv_add_ipv4_int_reachs (struct list *ipv4_reachs, struct stream *stream);
int tlv_add_ipv4_ext_reachs (struct list *ipv4_reachs, struct stream *stream);
int tlv_add_te_ipv4_reachs (struct list *te_ipv4_reachs, struct stream *stream);
-#ifdef HAVE_IPV6
int tlv_add_ipv6_addrs (struct list *ipv6_addrs, struct stream *stream);
int tlv_add_ipv6_reachs (struct list *ipv6_reachs, struct stream *stream);
-#endif /* HAVE_IPV6 */
int tlv_add_padding (struct stream *stream);
#ifdef EXTREME_DEBUG
if (p->family == AF_INET)
zlog_debug ("connected IP address %s", buf);
-#ifdef HAVE_IPV6
if (p->family == AF_INET6)
zlog_debug ("connected IPv6 address %s", buf);
-#endif /* HAVE_IPV6 */
#endif /* EXTREME_DEBUG */
if (if_is_operative (c->ifp))
isis_circuit_add_addr (circuit_scan_by_ifp (c->ifp), c);
if (p->family == AF_INET)
zlog_debug ("disconnected IP address %s", buf);
-#ifdef HAVE_IPV6
if (p->family == AF_INET6)
zlog_debug ("disconnected IPv6 address %s", buf);
-#endif /* HAVE_IPV6 */
#endif /* EXTREME_DEBUG */
if (if_is_operative (ifp))
return;
}
-#ifdef HAVE_IPV6
static void
isis_zebra_route_add_ipv6 (struct prefix *prefix,
struct isis_route_info *route_info)
XFREE (MTYPE_ISIS_TMP, ifindex_list);
}
-#endif /* HAVE_IPV6 */
-
void
isis_zebra_route_update (struct prefix *prefix,
struct isis_route_info *route_info)
{
if (prefix->family == AF_INET)
isis_zebra_route_add_ipv4 (prefix, route_info);
-#ifdef HAVE_IPV6
else if (prefix->family == AF_INET6)
isis_zebra_route_add_ipv6 (prefix, route_info);
-#endif /* HAVE_IPV6 */
}
else
{
if (prefix->family == AF_INET)
isis_zebra_route_del_ipv4 (prefix, route_info);
-#ifdef HAVE_IPV6
else if (prefix->family == AF_INET6)
isis_zebra_route_del_ipv6 (prefix, route_info);
-#endif /* HAVE_IPV6 */
}
return;
}
zclient->interface_link_params = isis_zebra_link_params;
zclient->redistribute_route_ipv4_add = isis_zebra_read_ipv4;
zclient->redistribute_route_ipv4_del = isis_zebra_read_ipv4;
-#ifdef HAVE_IPV6
zclient->redistribute_route_ipv6_add = isis_zebra_read_ipv6;
zclient->redistribute_route_ipv6_del = isis_zebra_read_ipv6;
-#endif /* HAVE_IPV6 */
return;
}
isis->init_circ_list = list_new ();
isis->uptime = time (NULL);
isis->nexthops = list_new ();
-#ifdef HAVE_IPV6
isis->nexthops6 = list_new ();
-#endif /* HAVE_IPV6 */
dyn_cache_init ();
/*
* uncomment the next line for full debugs
{
area->lspdb[0] = lsp_db_init ();
area->route_table[0] = route_table_init ();
-#ifdef HAVE_IPV6
area->route_table6[0] = route_table_init ();
-#endif /* HAVE_IPV6 */
}
if (area->is_type & IS_LEVEL_2)
{
area->lspdb[1] = lsp_db_init ();
area->route_table[1] = route_table_init ();
-#ifdef HAVE_IPV6
area->route_table6[1] = route_table_init ();
-#endif /* HAVE_IPV6 */
}
spftree_area_init (area);
for (ALL_LIST_ELEMENTS (area->circuit_list, node, nnode, circuit))
{
circuit->ip_router = 0;
-#ifdef HAVE_IPV6
circuit->ipv6_router = 0;
-#endif
isis_csm_state_change (ISIS_DISABLE, circuit, area);
}
list_delete (area->circuit_list);
route_table_finish (area->route_table[1]);
area->route_table[1] = NULL;
}
-#ifdef HAVE_IPV6
if (area->route_table6[0])
{
route_table_finish (area->route_table6[0]);
route_table_finish (area->route_table6[1]);
area->route_table6[1] = NULL;
}
-#endif /* HAVE_IPV6 */
isis_redist_area_finish(area);
vty_out (vty, " run count : %d%s",
spftree->runcount, VTY_NEWLINE);
-#ifdef HAVE_IPV6
spftree = area->spftree6[level - 1];
if (spftree->pending)
vty_out (vty, " IPv6 SPF: (pending)%s", VTY_NEWLINE);
vty_out (vty, " run count : %d%s",
spftree->runcount, VTY_NEWLINE);
-#endif
}
}
vty_out (vty, "%s", VTY_NEWLINE);
isis_spftree_del (area->spftree[level - 1]);
area->spftree[level - 1] = NULL;
}
-#ifdef HAVE_IPV6
if (area->spftree6[level - 1])
{
isis_spftree_del (area->spftree6[level - 1]);
area->spftree6[level - 1] = NULL;
}
-#endif
if (area->route_table[level - 1])
{
route_table_finish (area->route_table[level - 1]);
area->route_table[level - 1] = NULL;
}
-#ifdef HAVE_IPV6
if (area->route_table6[level - 1])
{
route_table_finish (area->route_table6[level - 1]);
area->route_table6[level - 1] = NULL;
}
-#endif /* HAVE_IPV6 */
sched_debug("ISIS (%s): Resigned from L%d - canceling LSP regeneration timer.",
area->area_tag, level);
area->lspdb[1] = lsp_db_init ();
if (area->route_table[1] == NULL)
area->route_table[1] = route_table_init ();
-#ifdef HAVE_IPV6
if (area->route_table6[1] == NULL)
area->route_table6[1] = route_table_init ();
-#endif /* HAVE_IPV6 */
break;
case IS_LEVEL_1_AND_2:
area->lspdb[0] = lsp_db_init ();
if (area->route_table[0] == NULL)
area->route_table[0] = route_table_init ();
-#ifdef HAVE_IPV6
if (area->route_table6[0] == NULL)
area->route_table6[0] = route_table_init ();
-#endif /* HAVE_IPV6 */
break;
default:
struct list *area_list; /* list of IS-IS areas */
struct list *init_circ_list;
struct list *nexthops; /* IPv4 next hops from this IS */
-#ifdef HAVE_IPV6
struct list *nexthops6; /* IPv6 next hops from this IS */
-#endif /* HAVE_IPV6 */
u_char max_area_addrs; /* maximumAreaAdresses */
struct area_addr *man_area_addrs; /* manualAreaAddresses */
u_int32_t debugs; /* bitmap for debug */
dict_t *lspdb[ISIS_LEVELS]; /* link-state dbs */
struct isis_spftree *spftree[ISIS_LEVELS]; /* The v4 SPTs */
struct route_table *route_table[ISIS_LEVELS]; /* IPv4 routes */
-#ifdef HAVE_IPV6
struct isis_spftree *spftree6[ISIS_LEVELS]; /* The v6 SPTs */
struct route_table *route_table6[ISIS_LEVELS]; /* IPv6 routes */
-#endif
#define DEFAULT_LSP_MTU 1497
unsigned int lsp_mtu; /* Size of LSPs to generate */
struct list *circuit_list; /* IS-IS circuits */
int ip_circuits;
/* logging adjacency changes? */
u_char log_adj_changes;
-#ifdef HAVE_IPV6
int ipv6_circuits;
-#endif /* HAVE_IPV6 */
/* Counters */
u_int32_t circuit_state_changes;
struct isis_redist redist_settings[REDIST_PROTOCOL_COUNT]
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;
}
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;
}
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);
NULL,
};
-#ifdef HAVE_IPV6
/* Static structure for IPv6 access_list's master. */
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;
}
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. */
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. */
return CMD_WARNING;
}
}
-#ifdef HAVE_IPV6
else if (afi == AFI_IP6)
{
ret = str2prefix_ipv6 (prefix_str, (struct prefix_ipv6 *) &p);
return CMD_WARNING;
}
}
-#endif /* HAVE_IPV6 */
else
return CMD_WARNING;
}
-#ifdef HAVE_IPV6
DEFUN (ipv6_access_list,
ipv6_access_list_cmd,
"ipv6 access-list WORD <deny|permit> X:X::X:X/M",
{
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 *);
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",
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)
install_element (CONFIG_NODE, &no_access_list_remark_comment_cmd);
}
-#ifdef HAVE_IPV6
static struct cmd_node access_ipv6_node =
{
ACCESS_IPV6_NODE,
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 */
}
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;
}
PLC_MAXLEVELV4,
};
-#ifdef HAVE_IPV6
/* Static structure of IPv6 prefix-list's master. */
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 =
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. */
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. */
return CMD_WARNING;
}
}
-#ifdef HAVE_IPV6
else if (afi == AFI_IP6)
{
if (strncmp ("any", prefix, strlen (prefix)) == 0)
return CMD_WARNING;
}
}
-#endif /* HAVE_IPV6 */
/* Lookup prefix entry. */
pentry = prefix_list_entry_lookup(plist, &p, type, seqnum, lenum, genum);
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>",
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
install_element (ENABLE_NODE, &clear_ip_prefix_list_name_prefix_cmd);
}
-#ifdef HAVE_IPV6
/* Prefix-list node. */
static struct cmd_node prefix_ipv6_node =
{
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
{
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;
{
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;
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;
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;
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;
{
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";
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)
addr->s6_addr[i] = x & 0xff;
}
}
-#endif /* HAVE_IPV6 */
void
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;
}
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;
memcpy (&p->prefix, &dest->sin6.sin6_addr, sizeof (struct in6_addr));
return (struct prefix *) p;
}
-#endif /* HAVE_IPV6 */
return NULL;
}
p->prefixlen = IPV4_MAX_BITLEN;
return (struct prefix *) p;
}
-#ifdef HAVE_IPV6
if (su->sa.sa_family == AF_INET6)
{
struct prefix_ipv6 *p;
memcpy (&p->prefix, &su->sin6.sin6_addr, sizeof (struct in6_addr));
return (struct prefix *) p;
}
-#endif /* HAVE_IPV6 */
return NULL;
}
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
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;
}
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);
return 1;
}
-#ifdef HAVE_IPV6
/* Utility function for making IPv6 address string. */
const char *
inet6_ntoa (struct in6_addr addr)
inet_ntop (AF_INET6, &addr, buf, INET6_ADDRSTRLEN);
return buf;
}
-#endif /* HAVE_IPV6 */
{
u_char prefix;
struct in_addr prefix4;
-#ifdef HAVE_IPV6
struct in6_addr prefix6;
-#endif /* HAVE_IPV6 */
struct
{
struct in_addr id;
};
/* IPv6 prefix structure. */
-#ifdef HAVE_IPV6
struct prefix_ipv6
{
u_char family;
u_char prefixlen;
struct in6_addr prefix __attribute__ ((aligned (8)));
};
-#endif /* HAVE_IPV6 */
struct prefix_ls
{
extern int netmask_str2prefix_str (const char *, const char *, char *);
-#ifdef HAVE_IPV6
extern struct prefix_ipv6 *prefix_ipv6_new (void);
extern void prefix_ipv6_free (struct prefix_ipv6 *);
extern int str2prefix_ipv6 (const char *, struct prefix_ipv6 *);
return 0;
}
-#endif /* HAVE_IPV6 */
-
extern int all_digit (const char *);
/* NOTE: This routine expects the address argument in network byte order. */
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;
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;
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;
}
return NULL;
}
-#ifdef HAVE_IPV6
/* Set IPv6 packet info to the socket. */
int
setsockopt_ipv6_pktinfo (int sock, int val)
#endif
return ret;
}
-#endif /* HAVE_IPV6 */
/*
* Process multicast socket options for IPv4 in an OS-dependent manner.
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);
}
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;
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.
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));
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);
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));
/*
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;
}
#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. */
{
#endif /* SIN6_LEN */
return 0;
}
-#endif /* HAVE_IPV6 */
return -1;
}
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;
{
struct sockaddr_in sin;
-#ifdef HAVE_IPV6
if (su->sa.sa_family == AF_INET6
&& IN6_IS_ADDR_V4MAPPED (&su->sin6.sin6_addr))
{
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. */
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;
}
case AF_INET:
su.sin.sin_port = port;
break;
-#ifdef HAVE_IPV6
case AF_INET6:
su.sin6.sin6_port = port;
#ifdef KAME
}
#endif /* KAME */
break;
-#endif /* HAVE_IPV6 */
}
/* Make socket non-block. */
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);
#endif /* LINUX_IPV6 */
}
}
-#endif /* HAVE_IPV6 */
-
ret = bind (sock, (struct sockaddr *)su, size);
if (ret < 0)
return 0;
}
#endif /* IP_TTL */
-#ifdef HAVE_IPV6
if (family == AF_INET6)
{
ret = setsockopt (sock, IPPROTO_IPV6, IPV6_UNICAST_HOPS,
}
return 0;
}
-#endif /* HAVE_IPV6 */
return 0;
}
{
int ret, on = 1;
-#ifdef HAVE_IPV6
#ifdef IPV6_V6ONLY
if (family == AF_INET6)
{
return 0;
}
#endif /* IPV6_V6ONLY */
-#endif /* HAVE_IPV6 */
return 0;
}
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));
ret = (su1->sin6.sin6_scope_id == su2->sin6.sin6_scope_id) ? 0 : 1;
}
break;
-#endif /* HAVE_IPV6 */
}
if (ret == 0)
return 1;
{
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;
}
{
case AF_INET:
return sizeof(struct in_addr);
-#ifdef HAVE_IPV6
case AF_INET6:
return sizeof(struct in6_addr);
-#endif /* HAVE_IPV6 */
}
return 0;
}
{
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;
}
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 */
}
}
{
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;
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));
sockunion_normalise_mapped (su);
return su;
}
-#endif /* HAVE_IPV6 */
return NULL;
}
{
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;
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));
sockunion_normalise_mapped (su);
return su;
}
-#endif /* HAVE_IPV6 */
return NULL;
}
case AF_INET:
printf ("%s\n", inet_ntoa (su->sin.sin_addr));
break;
-#ifdef HAVE_IPV6
case AF_INET6:
{
char buf [SU_ADDRSTRLEN];
buf, sizeof (buf)));
}
break;
-#endif /* HAVE_IPV6 */
#ifdef AF_LINK
case AF_LINK:
}
}
-#ifdef HAVE_IPV6
static int
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)
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;
}
};
/* 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
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)
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 *
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 *);
}
}
-#ifdef HAVE_IPV6
/* VTY's ipv6 accesslist apply. */
if (p.family == AF_INET6 && vty_ipv6_accesslist_name)
{
return 0;
}
}
-#endif /* HAVE_IPV6 */
on = 1;
ret = setsockopt (vty_sock, IPPROTO_TCP, TCP_NODELAY,
return 0;
}
-#ifdef HAVE_IPV6
static void
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;
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. */
{
/* 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);
return CMD_SUCCESS;
}
-#ifdef HAVE_IPV6
/* Set vty access class. */
DEFUN (vty_ipv6_access_class,
vty_ipv6_access_class_cmd,
return CMD_SUCCESS;
}
-#endif /* HAVE_IPV6 */
/* vty login. */
DEFUN (vty_login,
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
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)
return zclient_send_message(zclient);
}
-#endif /* HAVE_IPV6 */
/*
* send a ZEBRA_REDISTRIBUTE_ADD or ZEBRA_REDISTRIBUTE_DELETE
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
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 */
foreach (@ARGV) {
$file = $_;
- open (FH, "@CPP@ -DHAVE_CONFIG_H -DVTYSH_EXTRACT_PL -DHAVE_IPV6 -I@top_builddir@ -I@srcdir@/ -I@srcdir@/.. -I@top_srcdir@/lib -I@top_builddir@/lib -I@top_srcdir@/bgpd -I@top_srcdir@/@LIBRFP@ -I@top_srcdir@/bgpd/rfapi @CPPFLAGS@ $file |");
+ open (FH, "@CPP@ -DHAVE_CONFIG_H -DVTYSH_EXTRACT_PL -I@top_builddir@ -I@srcdir@/ -I@srcdir@/.. -I@top_srcdir@/lib -I@top_builddir@/lib -I@top_srcdir@/bgpd -I@top_srcdir@/@LIBRFP@ -I@top_srcdir@/bgpd/rfapi @CPPFLAGS@ $file |");
local $/; undef $/;
$line = <FH>;
close (FH);
}
}
-#ifdef HAVE_IPV6
/* IPv6 route add and delete test. */
void
zebra_test_v6 (int sock)
sleep (5);
/* zebra_ipv6_delete (sock, ZEBRA_ROUTE_STATIC, 0, &p, &nexthop, 1); */
}
-#endif /* HAVE_IPV6 */
/* Print out usage and exit. */
void
if (ifc->address->family == AF_INET)
connected_down_ipv4 (ifc->ifp, ifc);
-#ifdef HAVE_IPV6
else
connected_down_ipv6 (ifc->ifp, ifc);
-#endif
UNSET_FLAG (ifc->conf, ZEBRA_IFC_REAL);
}
{
if (ifc->address->family == AF_INET)
connected_up_ipv4 (ifp, ifc);
-#ifdef HAVE_IPV6
else
connected_up_ipv6 (ifp, ifc);
-#endif
}
}
extern void connected_up_ipv4 (struct interface *, struct connected *);
extern void connected_down_ipv4 (struct interface *, struct connected *);
-#ifdef HAVE_IPV6
extern void
connected_add_ipv6 (struct interface *ifp, int flags, struct in6_addr *address,
u_char prefixlen, struct in6_addr *broad,
extern void connected_up_ipv6 (struct interface *, struct connected *);
extern void connected_down_ipv6 (struct interface *ifp, struct connected *);
-#endif /* HAVE_IPV6 */
-
extern int connected_is_unnumbered (struct interface *);
#endif /*_ZEBRA_CONNECTED_H */
connected_add_ipv4 (ifp, flags, &addr->sin_addr,
prefixlen, dest_pnt, NULL);
}
-#ifdef HAVE_IPV6
if (ifap->ifa_addr->sa_family == AF_INET6)
{
struct sockaddr_in6 *addr;
connected_add_ipv6 (ifp, flags, &addr->sin6_addr, prefixlen,
dest_pnt, NULL);
}
-#endif /* HAVE_IPV6 */
}
freeifaddrs (ifapfree);
if_getaddrs ();
-#if defined(HAVE_IPV6) && defined(HAVE_PROC_NET_IF_INET6)
+#if defined(HAVE_PROC_NET_IF_INET6)
/* Linux provides interface's IPv6 address via
/proc/net/if_inet6. */
ifaddr_proc_ipv6 ();
-#endif /* HAVE_IPV6 && HAVE_PROC_NET_IF_INET6 */
+#endif /* HAVE_PROC_NET_IF_INET6 */
}
if (lifreq->lifr_addr.ss_family == AF_INET6)
{
-#ifdef HAVE_IPV6
ifp->flags |= IFF_IPV6;
-#else
- lifreq++;
- continue;
-#endif /* HAVE_IPV6 */
}
if_add_update (ifp);
dest_pnt = (char *) &SIN (&dest)->sin_addr;
}
}
-#ifdef HAVE_IPV6
else if (af == AF_INET6)
{
if (if_ioctl_ipv6 (SIOCGLIFSUBNET, (caddr_t) & lifreq) < 0)
prefixlen = lifreq.lifr_addrlen;
}
}
-#endif /* HAVE_IPV6 */
/* Set address to the interface. */
if (af == AF_INET)
connected_add_ipv4 (ifp, flags, &SIN (addr)->sin_addr, prefixlen,
(struct in_addr *) dest_pnt, label);
-#ifdef HAVE_IPV6
else if (af == AF_INET6)
connected_add_ipv6 (ifp, flags, &SIN6 (addr)->sin6_addr, prefixlen,
(struct in6_addr *) dest_pnt, label);
-#endif /* HAVE_IPV6 */
return 0;
}
struct connected *
if_lookup_linklocal (struct interface *ifp)
{
-#ifdef HAVE_IPV6
struct listnode *node;
struct connected *ifc;
(IN6_IS_ADDR_LINKLOCAL (&ifc->address->u.prefix6)))
return ifc;
}
-#endif /* HAVE_IPV6 */
return NULL;
}
if (ret < 0)
return ret;
-#ifdef HAVE_IPV6
/* Get IPv6 address of the interfaces. */
ret = netlink_request (AF_INET6, RTM_GETADDR, &zns->netlink_cmd);
if (ret < 0)
ret = netlink_parse_info (netlink_interface_addr, &zns->netlink_cmd, zns, 0);
if (ret < 0)
return ret;
-#endif /* HAVE_IPV6 */
return 0;
}
ifa = NLMSG_DATA (h);
if (ifa->ifa_family != AF_INET
-#ifdef HAVE_IPV6
- && ifa->ifa_family != AF_INET6
-#endif /* HAVE_IPV6 */
- )
+ && ifa->ifa_family != AF_INET6)
return 0;
if (h->nlmsg_type != RTM_NEWADDR && h->nlmsg_type != RTM_DELADDR)
(struct in_addr *) addr, ifa->ifa_prefixlen,
(struct in_addr *) broad);
}
-#ifdef HAVE_IPV6
if (ifa->ifa_family == AF_INET6)
{
if (h->nlmsg_type == RTM_NEWADDR)
(struct in6_addr *) addr, ifa->ifa_prefixlen,
(struct in6_addr *) broad);
}
-#endif /* HAVE_IPV6 */
return 0;
}
* from the kernel has been received.
* It will also be added to the interface's subnet list then. */
}
-#ifdef HAVE_IPV6
if (p->family == AF_INET6)
{
if (! if_is_up (ifp))
/* The address will be advertised to zebra clients when the notification
* from the kernel has been received. */
}
-#endif /* HAVE_IPV6 */
}
}
}
vty_out (vty, " index %d metric %d mtu %d ",
ifp->ifindex, ifp->metric, ifp->mtu);
-#ifdef HAVE_IPV6
if (ifp->mtu6 != ifp->mtu)
vty_out (vty, "mtu6 %d ", ifp->mtu6);
-#endif
vty_out (vty, "%s flags: %s%s", VTY_NEWLINE,
if_flag_dump (ifp->flags), VTY_NEWLINE);
}
#endif /* HAVE_NETLINK */
-#ifdef HAVE_IPV6
static int
ipv6_address_install (struct vty *vty, struct interface *ifp,
const char *addr_str, const char *peer_str,
VTY_DECLVAR_CONTEXT (interface, ifp);
return ipv6_address_uninstall (vty, ifp, argv[idx_ipv6_prefixlen]->arg, NULL, NULL, 0);
}
-#endif /* HAVE_IPV6 */
static int
link_params_config_write (struct vty *vty, struct interface *ifp)
install_element (INTERFACE_NODE, &no_bandwidth_if_cmd);
install_element (INTERFACE_NODE, &ip_address_cmd);
install_element (INTERFACE_NODE, &no_ip_address_cmd);
-#ifdef HAVE_IPV6
install_element (INTERFACE_NODE, &ipv6_address_cmd);
install_element (INTERFACE_NODE, &no_ipv6_address_cmd);
-#endif /* HAVE_IPV6 */
#ifdef HAVE_NETLINK
install_element (INTERFACE_NODE, &ip_address_label_cmd);
install_element (INTERFACE_NODE, &no_ip_address_label_cmd);
return 0;
}
-#ifdef HAVE_IPV6
static int
if_ioctl_ipv6 (u_long request, caddr_t buffer)
{
}
return 0;
}
-#endif /* HAVE_IPV6 */
/*
* get interface metric
return 0;
}
-#ifdef HAVE_IPV6
-
#ifdef LINUX_IPV6
#ifndef _LINUX_IN6_H
/* linux/include/net/ipv6.h */
#endif /* HAVE_STRUCT_IN6_ALIASREQ */
#endif /* LINUX_IPV6 */
-
-#endif /* HAVE_IPV6 */
extern void if_get_metric (struct interface *);
extern void if_get_mtu (struct interface *);
-#ifdef HAVE_IPV6
extern int if_prefix_add_ipv6 (struct interface *, struct connected *);
extern int if_prefix_delete_ipv6 (struct interface *, struct connected *);
-#endif /* HAVE_IPV6 */
#ifdef SOLARIS_IPV6
extern int if_ioctl_ipv6(u_long, caddr_t);
int
if_ioctl_ipv6 (u_long request, caddr_t buffer)
{
-#ifdef HAVE_IPV6
int sock;
int ret;
int err;
errno = err;
return ret;
}
-#endif /* HAVE_IPV6 */
return 0;
}
}
}
-#ifdef HAVE_IPV6
if (ifp->flags & IFF_IPV6)
{
memset(&lifreq, 0, sizeof(lifreq));
changed = 1;
}
}
-#endif /* HAVE_IPV6 */
if (changed)
zebra_interface_up_update(ifp);
return ret;
}
-#ifdef HAVE_IPV6
-
/* Interface's address add/delete functions. */
int
if_prefix_add_ipv6 (struct interface *ifp, struct connected *ifc)
return 0;
}
-
-#endif /* HAVE_IPV6 */
extern int ipforward_on (void);
extern int ipforward_off (void);
-#ifdef HAVE_IPV6
extern int ipforward_ipv6 (void);
extern int ipforward_ipv6_on (void);
extern int ipforward_ipv6_off (void);
-#endif /* HAVE_IPV6 */
#endif /* _ZEBRA_IPFORWARD_H */
return ipforward ();
}
-#ifdef HAVE_IPV6
char proc_ipv6_forwarding[] = "/proc/sys/net/ipv6/conf/all/forwarding";
FILE *fp;
if ( zserv_privs.change(ZPRIVS_RAISE) )
- zlog_err ("Can't raise privileges, %s", safe_strerror (errno));
+ zlog_err ("Can't raise privileges, %s", safe_strerror (errno));
fp = fopen (proc_ipv6_forwarding, "w");
return ipforward_ipv6 ();
}
+
int
ipforward_ipv6_off (void)
{
FILE *fp;
if ( zserv_privs.change(ZPRIVS_RAISE) )
- zlog_err ("Can't raise privileges, %s", safe_strerror (errno));
+ zlog_err ("Can't raise privileges, %s", safe_strerror (errno));
fp = fopen (proc_ipv6_forwarding, "w");
return ipforward_ipv6 ();
}
-#endif /* HAVE_IPV6 */
(void) solaris_nd_set("ip_forwarding", 0);
return ipforward();
}
-#ifdef HAVE_IPV6
int ipforward_ipv6(void)
{
return solaris_nd_get("ip6_forwarding");
(void) solaris_nd_set("ip6_forwarding", 0);
return ipforward_ipv6();
}
-#endif /* HAVE_IPV6 */
return ipforwarding;
}
-#ifdef HAVE_IPV6
-
/* IPv6 forwarding control MIB. */
int mib_ipv6[MIB_SIZ] =
{
zlog (NULL, LOG_ERR, "Can't lower privileges");
return ip6forwarding;
}
-#endif /* HAVE_IPV6 */
*/
#if defined(HAVE_STRUCT_SOCKADDR_SA_LEN)
#define SAROUNDUP(X) ROUNDUP(((struct sockaddr *)(X))->sa_len)
-#elif defined(HAVE_IPV6)
+#else
/*
* One would hope all fixed-size structure definitions are aligned,
* but round them up nonetheless.
ROUNDUP(sizeof(struct sockaddr_in6)) : \
(((struct sockaddr *)(X))->sa_family == AF_LINK ? \
ROUNDUP(sizeof(struct sockaddr_dl)) : sizeof(struct sockaddr))))
-#else /* HAVE_IPV6 */
-#define SAROUNDUP(X) \
- (((struct sockaddr *)(X))->sa_family == AF_INET ? \
- ROUNDUP(sizeof(struct sockaddr_in)):\
- (((struct sockaddr *)(X))->sa_family == AF_LINK ? \
- ROUNDUP(sizeof(struct sockaddr_dl)) : sizeof(struct sockaddr)))
#endif /* HAVE_STRUCT_SOCKADDR_SA_LEN */
#endif /* !SA_SIZE */
{
if (family == AF_INET)
return 1;
-#ifdef HAVE_IPV6
if (family == AF_INET6)
return 1;
-#endif /* HAVE_IPV6 */
return 0;
}
switch (family)
{
case AF_INET:
-#ifdef HAVE_IPV6
case AF_INET6:
-#endif
{
char buf[4][INET6_ADDRSTRLEN];
zlog_debug ("%s: ifindex %d, ifname %s, ifam_addrs 0x%x, "
ip_masklen (mask.sin.sin_addr),
&brd.sin.sin_addr);
break;
-#ifdef HAVE_IPV6
case AF_INET6:
/* Unset interface index from link-local address when IPv6 stack
is KAME. */
ip6_masklen (mask.sin6.sin6_addr),
&brd.sin6.sin6_addr);
break;
-#endif /* HAVE_IPV6 */
default:
/* Unsupported family silently ignore... */
break;
if (p->family == AF_INET)
if (p->u.prefix4.s_addr == 0 && p->prefixlen == 0)
return 1;
-#ifdef HAVE_IPV6
#if 0 /* IPv6 default separation is now pending until protocol daemon
can handle that. */
if (p->family == AF_INET6)
if (IN6_IS_ADDR_UNSPECIFIED (&p->u.prefix6) && p->prefixlen == 0)
return 1;
#endif /* 0 */
-#endif /* HAVE_IPV6 */
return 0;
}
if (ret < 0)
return ret;
-#ifdef HAVE_IPV6
/* Get IPv6 routing table. */
ret = netlink_request (AF_INET6, RTM_GETROUTE, &zns->netlink_cmd);
if (ret < 0)
ret = netlink_parse_info (netlink_routing_table, &zns->netlink_cmd, zns, 0);
if (ret < 0)
return ret;
-#endif /* HAVE_IPV6 */
return 0;
}
extern struct zebra_privs_t zserv_privs;
-#if defined (HAVE_IPV6) && defined (HAVE_RTADV)
+#if defined (HAVE_RTADV)
#ifdef OPEN_BSD
#include <netinet/icmp6.h>
{
/* Empty.*/;
}
-#endif /* HAVE_RTADV && HAVE_IPV6 */
+#endif /* HAVE_RTADV */
case AF_INET:
return inet_ntoa (*((struct in_addr *) addr));
-
-#ifdef HAVE_IPV6
+ break;
case AF_INET6:
return inet6_ntoa (*((struct in6_addr *) addr));
-#endif
-
+ break;
default:
return "<Addr in unknown AF>";
+ break;
}
}
case AF_INET:
return 4;
-
-#ifdef HAVE_IPV6
+ break;
case AF_INET6:
return 16;
-#endif
-
+ break;
default:
assert(0);
return 16;
inet_ntop(AF_INET, &dst_p.u.prefix4, buf, sizeof(buf));
ptm_lib_append_msg(ptm_hdl, out_ctxt, ZEBRA_PTM_BFD_DST_IP_FIELD, buf);
}
-#ifdef HAVE_IPV6
else
{
inet_ntop(AF_INET6, &dst_p.u.prefix6, buf, sizeof(buf));
ptm_lib_append_msg(ptm_hdl, out_ctxt, ZEBRA_PTM_BFD_DST_IP_FIELD, buf);
}
-#endif /* HAVE_IPV6 */
min_rx_timer = stream_getl(s);
sprintf(tmp_buf, "%d", min_rx_timer);
ptm_lib_append_msg(ptm_hdl, out_ctxt,
ZEBRA_PTM_BFD_SRC_IP_FIELD, buf);
}
-#ifdef HAVE_IPV6
else
{
inet_ntop(AF_INET6, &src_p.u.prefix6, buf, sizeof(buf));
ptm_lib_append_msg(ptm_hdl, out_ctxt,
ZEBRA_PTM_BFD_SRC_IP_FIELD, buf);
}
-#endif /* HAVE_IPV6 */
multi_hop_cnt = stream_getc(s);
sprintf(tmp_buf, "%d", multi_hop_cnt);
}
else
{
-#ifdef HAVE_IPV6
if (dst_p.family == AF_INET6)
{
src_p.family = stream_getw(s);
ZEBRA_PTM_BFD_SRC_IP_FIELD, buf);
}
}
-#endif /* HAVE_IPV6 */
len = stream_getc(s);
stream_get(if_name, s, len);
if_name[len] = '\0';
stream_get(&dst_p.u.prefix, s, dst_p.prefixlen);
if (dst_p.family == AF_INET)
- {
- inet_ntop(AF_INET, &dst_p.u.prefix4, buf, sizeof(buf));
- ptm_lib_append_msg(ptm_hdl, out_ctxt, ZEBRA_PTM_BFD_DST_IP_FIELD, buf);
- }
-#ifdef HAVE_IPV6
+ inet_ntop(AF_INET, &dst_p.u.prefix4, buf, sizeof(buf));
else
- {
- inet_ntop(AF_INET6, &dst_p.u.prefix6, buf, sizeof(buf));
- ptm_lib_append_msg(ptm_hdl, out_ctxt, ZEBRA_PTM_BFD_DST_IP_FIELD, buf);
- }
-#endif /* HAVE_IPV6 */
+ inet_ntop(AF_INET6, &dst_p.u.prefix6, buf, sizeof(buf));
+ ptm_lib_append_msg(ptm_hdl, out_ctxt, ZEBRA_PTM_BFD_DST_IP_FIELD, buf);
+
multi_hop = stream_getc(s);
if (multi_hop)
ptm_lib_append_msg(ptm_hdl, out_ctxt,
ZEBRA_PTM_BFD_SRC_IP_FIELD, buf);
}
-#ifdef HAVE_IPV6
else
{
inet_ntop(AF_INET6, &src_p.u.prefix6, buf, sizeof(buf));
ptm_lib_append_msg(ptm_hdl, out_ctxt,
ZEBRA_PTM_BFD_SRC_IP_FIELD, buf);
}
-#endif /* HAVE_IPV6 */
if (zvrf_id (zvrf) != VRF_DEFAULT)
ptm_lib_append_msg(ptm_hdl, out_ctxt, ZEBRA_PTM_BFD_VRF_NAME_FIELD,
zvrf_name (zvrf));
}
else
{
-#ifdef HAVE_IPV6
if (dst_p.family == AF_INET6)
{
src_p.family = stream_getw(s);
ZEBRA_PTM_BFD_SRC_IP_FIELD, buf);
}
}
-#endif /* HAVE_IPV6 */
len = stream_getc(s);
stream_get(if_name, s, len);
stream_put_in_addr (s, &nexthop->gate.ipv4);
stream_putl (s, nexthop->ifindex);
break;
-#ifdef HAVE_IPV6
case NEXTHOP_TYPE_IPV6:
stream_put (s, &nexthop->gate.ipv6, 16);
break;
stream_put (s, &nexthop->gate.ipv6, 16);
stream_putl (s, nexthop->ifindex);
break;
-#endif /* HAVE_IPV6 */
default:
/* do nothing */
break;
{
union g_addr src, *psrc;
- if (
-#ifdef HAVE_IPV6
- (inet_pton(AF_INET6, arg, &src.ipv6) == 1) ||
-#endif /* HAVE_IPV6 */
- (src.ipv4.s_addr && (inet_pton(AF_INET, arg, &src.ipv4) == 1)))
+ if (inet_pton(AF_INET6, arg, &src.ipv6) == 1 ||
+ src.ipv4.s_addr && (inet_pton(AF_INET, arg, &src.ipv4) == 1))
{
psrc = XMALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (union g_addr));
*psrc = src;
return CMD_SUCCESS;
}
-#ifdef HAVE_IPV6
/* Only display ipv6 forwarding is enabled or not. */
DEFUN (show_ipv6_forwarding,
show_ipv6_forwarding_cmd,
return CMD_SUCCESS;
}
-#endif /* HAVE_IPV6 */
-
/* IPForwarding configuration write function. */
static int
config_write_forwarding (struct vty *vty)
if (!ipforward ())
vty_out (vty, "no ip forwarding%s", VTY_NEWLINE);
-#ifdef HAVE_IPV6
if (!ipforward_ipv6 ())
vty_out (vty, "no ipv6 forwarding%s", VTY_NEWLINE);
-#endif /* HAVE_IPV6 */
vty_out (vty, "!%s", VTY_NEWLINE);
return 0;
}
install_element (CONFIG_NODE, &no_config_table_cmd);
#endif /* HAVE_NETLINK */
-#ifdef HAVE_IPV6
install_element (VIEW_NODE, &show_ipv6_forwarding_cmd);
install_element (CONFIG_NODE, &ipv6_forwarding_cmd);
install_element (CONFIG_NODE, &no_ipv6_forwarding_cmd);
-#endif /* HAVE_IPV6 */
/* Route-map */
zebra_route_map_init ();