summaryrefslogtreecommitdiffstats
path: root/zebra/connected.c
diff options
context:
space:
mode:
Diffstat (limited to 'zebra/connected.c')
-rw-r--r--zebra/connected.c879
1 files changed, 437 insertions, 442 deletions
diff --git a/zebra/connected.c b/zebra/connected.c
index 0ceaddc8e..322a93a55 100644
--- a/zebra/connected.c
+++ b/zebra/connected.c
@@ -17,7 +17,7 @@
* You should have received a copy of the GNU General Public License
* along with GNU Zebra; see the file COPYING. If not, write to the Free
* Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
+ * 02111-1307, USA.
*/
#include <zebra.h>
@@ -43,533 +43,528 @@
#include "zebra/debug.h"
/* communicate the withdrawal of a connected address */
-static void
-connected_withdraw (struct connected *ifc)
+static void connected_withdraw(struct connected *ifc)
{
- if (! ifc)
- return;
+ if (!ifc)
+ return;
- /* Update interface address information to protocol daemon. */
- if (CHECK_FLAG (ifc->conf, ZEBRA_IFC_REAL))
- {
- zebra_interface_address_delete_update (ifc->ifp, ifc);
+ /* Update interface address information to protocol daemon. */
+ if (CHECK_FLAG(ifc->conf, ZEBRA_IFC_REAL)) {
+ zebra_interface_address_delete_update(ifc->ifp, ifc);
- if (ifc->address->family == AF_INET)
- if_subnet_delete (ifc->ifp, ifc);
+ if (ifc->address->family == AF_INET)
+ if_subnet_delete(ifc->ifp, ifc);
- if (ifc->address->family == AF_INET)
- connected_down_ipv4 (ifc->ifp, ifc);
- else
- connected_down_ipv6 (ifc->ifp, ifc);
+ if (ifc->address->family == AF_INET)
+ connected_down_ipv4(ifc->ifp, ifc);
+ else
+ connected_down_ipv6(ifc->ifp, ifc);
- UNSET_FLAG (ifc->conf, ZEBRA_IFC_REAL);
- }
+ UNSET_FLAG(ifc->conf, ZEBRA_IFC_REAL);
+ }
- /* The address is not in the kernel anymore, so clear the flag */
- UNSET_FLAG(ifc->conf, ZEBRA_IFC_QUEUED);
+ /* The address is not in the kernel anymore, so clear the flag */
+ UNSET_FLAG(ifc->conf, ZEBRA_IFC_QUEUED);
- if (!CHECK_FLAG (ifc->conf, ZEBRA_IFC_CONFIGURED))
- {
- listnode_delete (ifc->ifp->connected, ifc);
- connected_free (ifc);
- }
+ if (!CHECK_FLAG(ifc->conf, ZEBRA_IFC_CONFIGURED)) {
+ listnode_delete(ifc->ifp->connected, ifc);
+ connected_free(ifc);
+ }
}
-static void
-connected_announce (struct interface *ifp, struct connected *ifc)
+static void connected_announce(struct interface *ifp, struct connected *ifc)
{
- if (!ifc)
- return;
-
- if (!if_is_loopback(ifp) && ifc->address->family == AF_INET)
- {
- if (ifc->address->prefixlen == 32)
- SET_FLAG (ifc->flags, ZEBRA_IFA_UNNUMBERED);
- else
- UNSET_FLAG (ifc->flags, ZEBRA_IFA_UNNUMBERED);
- }
-
- listnode_add (ifp->connected, ifc);
-
- /* Update interface address information to protocol daemon. */
- if (ifc->address->family == AF_INET)
- if_subnet_add (ifp, ifc);
-
- zebra_interface_address_add_update (ifp, ifc);
-
- if (if_is_operative(ifp))
- {
- if (ifc->address->family == AF_INET)
- connected_up_ipv4 (ifp, ifc);
- else
- connected_up_ipv6 (ifp, ifc);
- }
+ if (!ifc)
+ return;
+
+ if (!if_is_loopback(ifp) && ifc->address->family == AF_INET) {
+ if (ifc->address->prefixlen == 32)
+ SET_FLAG(ifc->flags, ZEBRA_IFA_UNNUMBERED);
+ else
+ UNSET_FLAG(ifc->flags, ZEBRA_IFA_UNNUMBERED);
+ }
+
+ listnode_add(ifp->connected, ifc);
+
+ /* Update interface address information to protocol daemon. */
+ if (ifc->address->family == AF_INET)
+ if_subnet_add(ifp, ifc);
+
+ zebra_interface_address_add_update(ifp, ifc);
+
+ if (if_is_operative(ifp)) {
+ if (ifc->address->family == AF_INET)
+ connected_up_ipv4(ifp, ifc);
+ else
+ connected_up_ipv6(ifp, ifc);
+ }
}
/* If same interface address is already exist... */
-struct connected *
-connected_check (struct interface *ifp, struct prefix *p)
+struct connected *connected_check(struct interface *ifp, struct prefix *p)
{
- struct connected *ifc;
- struct listnode *node;
+ struct connected *ifc;
+ struct listnode *node;
- for (ALL_LIST_ELEMENTS_RO (ifp->connected, node, ifc))
- if (prefix_same (ifc->address, p))
- return ifc;
+ for (ALL_LIST_ELEMENTS_RO(ifp->connected, node, ifc))
+ if (prefix_same(ifc->address, p))
+ return ifc;
- return NULL;
+ return NULL;
}
/* Check if two ifc's describe the same address in the same state */
-static int
-connected_same (struct connected *ifc1, struct connected *ifc2)
+static int connected_same(struct connected *ifc1, struct connected *ifc2)
{
- if (ifc1->ifp != ifc2->ifp)
- return 0;
-
- if (ifc1->destination)
- if (!ifc2->destination)
- return 0;
- if (ifc2->destination)
- if (!ifc1->destination)
- return 0;
-
- if (ifc1->destination && ifc2->destination)
- if (!prefix_same (ifc1->destination, ifc2->destination))
- return 0;
-
- if (ifc1->flags != ifc2->flags)
- return 0;
-
- if (ifc1->conf != ifc2->conf)
- return 0;
-
- return 1;
+ if (ifc1->ifp != ifc2->ifp)
+ return 0;
+
+ if (ifc1->destination)
+ if (!ifc2->destination)
+ return 0;
+ if (ifc2->destination)
+ if (!ifc1->destination)
+ return 0;
+
+ if (ifc1->destination && ifc2->destination)
+ if (!prefix_same(ifc1->destination, ifc2->destination))
+ return 0;
+
+ if (ifc1->flags != ifc2->flags)
+ return 0;
+
+ if (ifc1->conf != ifc2->conf)
+ return 0;
+
+ return 1;
}
/* Handle changes to addresses and send the neccesary announcements
* to clients. */
-static void
-connected_update(struct interface *ifp, struct connected *ifc)
+static void connected_update(struct interface *ifp, struct connected *ifc)
{
- struct connected *current;
-
- /* Check same connected route. */
- if ((current = connected_check (ifp, (struct prefix *) ifc->address)))
- {
- if (CHECK_FLAG(current->conf, ZEBRA_IFC_CONFIGURED))
- SET_FLAG(ifc->conf, ZEBRA_IFC_CONFIGURED);
-
- /* Avoid spurious withdraws, this might be just the kernel 'reflecting'
- * back an address we have already added.
- */
- if (connected_same (current, ifc))
- {
- /* nothing to do */
- connected_free (ifc);
- return;
- }
-
- /* Clear the configured flag on the old ifc, so it will be freed by
- * connected withdraw. */
- UNSET_FLAG(current->conf, ZEBRA_IFC_CONFIGURED);
- connected_withdraw (current); /* implicit withdraw - freebsd does this */
- }
-
- /* If the connected is new or has changed, announce it, if it is usable */
- if (CHECK_FLAG(ifc->conf, ZEBRA_IFC_REAL))
- connected_announce(ifp, ifc);
+ struct connected *current;
+
+ /* Check same connected route. */
+ if ((current = connected_check(ifp, (struct prefix *)ifc->address))) {
+ if (CHECK_FLAG(current->conf, ZEBRA_IFC_CONFIGURED))
+ SET_FLAG(ifc->conf, ZEBRA_IFC_CONFIGURED);
+
+ /* Avoid spurious withdraws, this might be just the kernel
+ * 'reflecting'
+ * back an address we have already added.
+ */
+ if (connected_same(current, ifc)) {
+ /* nothing to do */
+ connected_free(ifc);
+ return;
+ }
+
+ /* Clear the configured flag on the old ifc, so it will be freed
+ * by
+ * connected withdraw. */
+ UNSET_FLAG(current->conf, ZEBRA_IFC_CONFIGURED);
+ connected_withdraw(
+ current); /* implicit withdraw - freebsd does this */
+ }
+
+ /* If the connected is new or has changed, announce it, if it is usable
+ */
+ if (CHECK_FLAG(ifc->conf, ZEBRA_IFC_REAL))
+ connected_announce(ifp, ifc);
}
/* Called from if_up(). */
-void
-connected_up_ipv4 (struct interface *ifp, struct connected *ifc)
+void connected_up_ipv4(struct interface *ifp, struct connected *ifc)
{
- struct prefix p;
-
- if (! CHECK_FLAG (ifc->conf, ZEBRA_IFC_REAL))
- return;
-
- PREFIX_COPY_IPV4((struct prefix_ipv4 *)&p, CONNECTED_PREFIX(ifc));
-
- /* Apply mask to the network. */
- apply_mask (&p);
-
- /* In case of connected address is 0.0.0.0/0 we treat it tunnel
- address. */
- if (prefix_ipv4_any ((struct prefix_ipv4 *)&p))
- return;
-
- rib_add (AFI_IP, SAFI_UNICAST, ifp->vrf_id, ZEBRA_ROUTE_CONNECT,
- 0, 0, &p, NULL, NULL, NULL, ifp->ifindex,
- RT_TABLE_MAIN, ifp->metric, 0, 0);
-
- rib_add (AFI_IP, SAFI_MULTICAST, ifp->vrf_id, ZEBRA_ROUTE_CONNECT,
- 0, 0, &p, NULL, NULL, NULL, ifp->ifindex,
- RT_TABLE_MAIN, ifp->metric, 0, 0);
-
- if (IS_ZEBRA_DEBUG_RIB_DETAILED)
- zlog_debug ("%u: IF %s IPv4 address add/up, scheduling RIB processing",
- ifp->vrf_id, ifp->name);
- rib_update (ifp->vrf_id, RIB_UPDATE_IF_CHANGE);
-
- /* Schedule LSP forwarding entries for processing, if appropriate. */
- if (ifp->vrf_id == VRF_DEFAULT)
- {
- if (IS_ZEBRA_DEBUG_MPLS)
- zlog_debug ("%u: IF %s IPv4 address add/up, scheduling MPLS processing",
- ifp->vrf_id, ifp->name);
- mpls_mark_lsps_for_processing (vrf_info_lookup(ifp->vrf_id));
- }
+ struct prefix p;
+
+ if (!CHECK_FLAG(ifc->conf, ZEBRA_IFC_REAL))
+ return;
+
+ PREFIX_COPY_IPV4((struct prefix_ipv4 *)&p, CONNECTED_PREFIX(ifc));
+
+ /* Apply mask to the network. */
+ apply_mask(&p);
+
+ /* In case of connected address is 0.0.0.0/0 we treat it tunnel
+ address. */
+ if (prefix_ipv4_any((struct prefix_ipv4 *)&p))
+ return;
+
+ rib_add(AFI_IP, SAFI_UNICAST, ifp->vrf_id, ZEBRA_ROUTE_CONNECT, 0, 0,
+ &p, NULL, NULL, NULL, ifp->ifindex, RT_TABLE_MAIN, ifp->metric,
+ 0, 0);
+
+ rib_add(AFI_IP, SAFI_MULTICAST, ifp->vrf_id, ZEBRA_ROUTE_CONNECT, 0, 0,
+ &p, NULL, NULL, NULL, ifp->ifindex, RT_TABLE_MAIN, ifp->metric,
+ 0, 0);
+
+ if (IS_ZEBRA_DEBUG_RIB_DETAILED)
+ zlog_debug(
+ "%u: IF %s IPv4 address add/up, scheduling RIB processing",
+ ifp->vrf_id, ifp->name);
+ rib_update(ifp->vrf_id, RIB_UPDATE_IF_CHANGE);
+
+ /* Schedule LSP forwarding entries for processing, if appropriate. */
+ if (ifp->vrf_id == VRF_DEFAULT) {
+ if (IS_ZEBRA_DEBUG_MPLS)
+ zlog_debug(
+ "%u: IF %s IPv4 address add/up, scheduling MPLS processing",
+ ifp->vrf_id, ifp->name);
+ mpls_mark_lsps_for_processing(vrf_info_lookup(ifp->vrf_id));
+ }
}
/* Add connected IPv4 route to the interface. */
-void
-connected_add_ipv4 (struct interface *ifp, int flags, struct in_addr *addr,
- u_char prefixlen, struct in_addr *broad,
- const char *label)
+void connected_add_ipv4(struct interface *ifp, int flags, struct in_addr *addr,
+ u_char prefixlen, struct in_addr *broad,
+ const char *label)
{
- struct prefix_ipv4 *p;
- struct connected *ifc;
-
- if (ipv4_martian(addr))
- return;
-
- /* Make connected structure. */
- ifc = connected_new ();
- ifc->ifp = ifp;
- ifc->flags = flags;
- /* If we get a notification from the kernel,
- * we can safely assume the address is known to the kernel */
- SET_FLAG(ifc->conf, ZEBRA_IFC_QUEUED);
-
- /* Allocate new connected address. */
- p = prefix_ipv4_new ();
- p->family = AF_INET;
- p->prefix = *addr;
- p->prefixlen = prefixlen;
- ifc->address = (struct prefix *) p;
-
- /* If there is broadcast or peer address. */
- if (broad)
- {
- p = prefix_ipv4_new ();
- p->family = AF_INET;
- p->prefix = *broad;
- p->prefixlen = prefixlen;
- ifc->destination = (struct prefix *) p;
-
- /* validate the destination address */
- if (CONNECTED_PEER(ifc))
- {
- if (IPV4_ADDR_SAME(addr,broad))
- zlog_warn("warning: interface %s has same local and peer "
- "address %s, routing protocols may malfunction",
- ifp->name,inet_ntoa(*addr));
- }
- else
- {
- if (broad->s_addr != ipv4_broadcast_addr(addr->s_addr,prefixlen))
- {
- char buf[2][INET_ADDRSTRLEN];
- struct in_addr bcalc;
- bcalc.s_addr = ipv4_broadcast_addr(addr->s_addr,prefixlen);
- zlog_warn("warning: interface %s broadcast addr %s/%d != "
- "calculated %s, routing protocols may malfunction",
- ifp->name,
- inet_ntop (AF_INET, broad, buf[0], sizeof(buf[0])),
- prefixlen,
- inet_ntop (AF_INET, &bcalc, buf[1], sizeof(buf[1])));
- }
- }
-
- }
- else
- {
- if (CHECK_FLAG(ifc->flags, ZEBRA_IFA_PEER))
- {
- zlog_warn("warning: %s called for interface %s "
- "with peer flag set, but no peer address supplied",
- __func__, ifp->name);
- UNSET_FLAG(ifc->flags, ZEBRA_IFA_PEER);
+ struct prefix_ipv4 *p;
+ struct connected *ifc;
+
+ if (ipv4_martian(addr))
+ return;
+
+ /* Make connected structure. */
+ ifc = connected_new();
+ ifc->ifp = ifp;
+ ifc->flags = flags;
+ /* If we get a notification from the kernel,
+ * we can safely assume the address is known to the kernel */
+ SET_FLAG(ifc->conf, ZEBRA_IFC_QUEUED);
+
+ /* Allocate new connected address. */
+ p = prefix_ipv4_new();
+ p->family = AF_INET;
+ p->prefix = *addr;
+ p->prefixlen = prefixlen;
+ ifc->address = (struct prefix *)p;
+
+ /* If there is broadcast or peer address. */
+ if (broad) {
+ p = prefix_ipv4_new();
+ p->family = AF_INET;
+ p->prefix = *broad;
+ p->prefixlen = prefixlen;
+ ifc->destination = (struct prefix *)p;
+
+ /* validate the destination address */
+ if (CONNECTED_PEER(ifc)) {
+ if (IPV4_ADDR_SAME(addr, broad))
+ zlog_warn(
+ "warning: interface %s has same local and peer "
+ "address %s, routing protocols may malfunction",
+ ifp->name, inet_ntoa(*addr));
+ } else {
+ if (broad->s_addr
+ != ipv4_broadcast_addr(addr->s_addr, prefixlen)) {
+ char buf[2][INET_ADDRSTRLEN];
+ struct in_addr bcalc;
+ bcalc.s_addr = ipv4_broadcast_addr(addr->s_addr,
+ prefixlen);
+ zlog_warn(
+ "warning: interface %s broadcast addr %s/%d != "
+ "calculated %s, routing protocols may malfunction",
+ ifp->name,
+ inet_ntop(AF_INET, broad, buf[0],
+ sizeof(buf[0])),
+ prefixlen,
+ inet_ntop(AF_INET, &bcalc, buf[1],
+ sizeof(buf[1])));
+ }
+ }
+
+ } else {
+ if (CHECK_FLAG(ifc->flags, ZEBRA_IFA_PEER)) {
+ zlog_warn(
+ "warning: %s called for interface %s "
+ "with peer flag set, but no peer address supplied",
+ __func__, ifp->name);
+ UNSET_FLAG(ifc->flags, ZEBRA_IFA_PEER);
+ }
+
+ /* no broadcast or destination address was supplied */
+ if ((prefixlen == IPV4_MAX_PREFIXLEN) && if_is_pointopoint(ifp))
+ zlog_warn(
+ "warning: PtP interface %s with addr %s/%d needs a "
+ "peer address",
+ ifp->name, inet_ntoa(*addr), prefixlen);
}
- /* no broadcast or destination address was supplied */
- if ((prefixlen == IPV4_MAX_PREFIXLEN) && if_is_pointopoint(ifp))
- zlog_warn("warning: PtP interface %s with addr %s/%d needs a "
- "peer address",ifp->name,inet_ntoa(*addr),prefixlen);
- }
+ /* Label of this address. */
+ if (label)
+ ifc->label = XSTRDUP(MTYPE_CONNECTED_LABEL, label);
- /* Label of this address. */
- if (label)
- ifc->label = XSTRDUP (MTYPE_CONNECTED_LABEL, label);
+ /* For all that I know an IPv4 address is always ready when we receive
+ * the notification. So it should be safe to set the REAL flag here. */
+ SET_FLAG(ifc->conf, ZEBRA_IFC_REAL);
- /* For all that I know an IPv4 address is always ready when we receive
- * the notification. So it should be safe to set the REAL flag here. */
- SET_FLAG(ifc->conf, ZEBRA_IFC_REAL);
-
- connected_update(ifp, ifc);
+ connected_update(ifp, ifc);
}
-void
-connected_down_ipv4 (struct interface *ifp, struct connected *ifc)
+void connected_down_ipv4(struct interface *ifp, struct connected *ifc)
{
- struct prefix p;
+ struct prefix p;
- if (! CHECK_FLAG (ifc->conf, ZEBRA_IFC_REAL))
- return;
+ if (!CHECK_FLAG(ifc->conf, ZEBRA_IFC_REAL))
+ return;
- PREFIX_COPY_IPV4(&p, CONNECTED_PREFIX(ifc));
+ PREFIX_COPY_IPV4(&p, CONNECTED_PREFIX(ifc));
- /* Apply mask to the network. */
- apply_mask (&p);
+ /* Apply mask to the network. */
+ apply_mask(&p);
- /* In case of connected address is 0.0.0.0/0 we treat it tunnel
- address. */
- if (prefix_ipv4_any ((struct prefix_ipv4 *)&p))
- return;
+ /* In case of connected address is 0.0.0.0/0 we treat it tunnel
+ address. */
+ if (prefix_ipv4_any((struct prefix_ipv4 *)&p))
+ return;
- /* Same logic as for connected_up_ipv4(): push the changes into the head. */
- rib_delete (AFI_IP, SAFI_UNICAST, ifp->vrf_id, ZEBRA_ROUTE_CONNECT,
- 0, 0, &p, NULL, NULL, ifp->ifindex, 0);
+ /* Same logic as for connected_up_ipv4(): push the changes into the
+ * head. */
+ rib_delete(AFI_IP, SAFI_UNICAST, ifp->vrf_id, ZEBRA_ROUTE_CONNECT, 0, 0,
+ &p, NULL, NULL, ifp->ifindex, 0);
- rib_delete (AFI_IP, SAFI_MULTICAST, ifp->vrf_id, ZEBRA_ROUTE_CONNECT,
- 0, 0, &p, NULL, NULL, ifp->ifindex, 0);
+ rib_delete(AFI_IP, SAFI_MULTICAST, ifp->vrf_id, ZEBRA_ROUTE_CONNECT, 0,
+ 0, &p, NULL, NULL, ifp->ifindex, 0);
- if (IS_ZEBRA_DEBUG_RIB_DETAILED)
- zlog_debug ("%u: IF %s IPv4 address down, scheduling RIB processing",
- ifp->vrf_id, ifp->name);
+ if (IS_ZEBRA_DEBUG_RIB_DETAILED)
+ zlog_debug(
+ "%u: IF %s IPv4 address down, scheduling RIB processing",
+ ifp->vrf_id, ifp->name);
- rib_update (ifp->vrf_id, RIB_UPDATE_IF_CHANGE);
+ rib_update(ifp->vrf_id, RIB_UPDATE_IF_CHANGE);
- /* Schedule LSP forwarding entries for processing, if appropriate. */
- if (ifp->vrf_id == VRF_DEFAULT)
- {
- if (IS_ZEBRA_DEBUG_MPLS)
- zlog_debug ("%u: IF %s IPv4 address add/up, scheduling MPLS processing",
- ifp->vrf_id, ifp->name);
- mpls_mark_lsps_for_processing (vrf_info_lookup(ifp->vrf_id));
- }
+ /* Schedule LSP forwarding entries for processing, if appropriate. */
+ if (ifp->vrf_id == VRF_DEFAULT) {
+ if (IS_ZEBRA_DEBUG_MPLS)
+ zlog_debug(
+ "%u: IF %s IPv4 address add/up, scheduling MPLS processing",
+ ifp->vrf_id, ifp->name);
+ mpls_mark_lsps_for_processing(vrf_info_lookup(ifp->vrf_id));
+ }
}
/* Delete connected IPv4 route to the interface. */
-void
-connected_delete_ipv4 (struct interface *ifp, int flags, struct in_addr *addr,
- u_char prefixlen, struct in_addr *broad)
+void connected_delete_ipv4(struct interface *ifp, int flags,
+ struct in_addr *addr, u_char prefixlen,
+ struct in_addr *broad)
{
- struct prefix_ipv4 p;
- struct connected *ifc;
-
- memset (&p, 0, sizeof (struct prefix_ipv4));
- p.family = AF_INET;
- p.prefix = *addr;
- p.prefixlen = prefixlen;
-
- ifc = connected_check (ifp, (struct prefix *) &p);
- if (! ifc)
- return;
-
- connected_withdraw (ifc);
-
- if (IS_ZEBRA_DEBUG_RIB_DETAILED)
- zlog_debug ("%u: IF %s IPv4 address del, scheduling RIB processing",
- ifp->vrf_id, ifp->name);
-
- rib_update (ifp->vrf_id, RIB_UPDATE_IF_CHANGE);
-
- /* Schedule LSP forwarding entries for processing, if appropriate. */
- if (ifp->vrf_id == VRF_DEFAULT)
- {
- if (IS_ZEBRA_DEBUG_MPLS)
- zlog_debug ("%u: IF %s IPv4 address add/up, scheduling MPLS processing",
- ifp->vrf_id, ifp->name);
- mpls_mark_lsps_for_processing (vrf_info_lookup(ifp->vrf_id));
- }
+ struct prefix_ipv4 p;
+ struct connected *ifc;
+
+ memset(&p, 0, sizeof(struct prefix_ipv4));
+ p.family = AF_INET;
+ p.prefix = *addr;
+ p.prefixlen = prefixlen;
+
+ ifc = connected_check(ifp, (struct prefix *)&p);
+ if (!ifc)
+ return;
+
+ connected_withdraw(ifc);
+
+ if (IS_ZEBRA_DEBUG_RIB_DETAILED)
+ zlog_debug(
+ "%u: IF %s IPv4 address del, scheduling RIB processing",
+ ifp->vrf_id, ifp->name);
+
+ rib_update(ifp->vrf_id, RIB_UPDATE_IF_CHANGE);
+
+ /* Schedule LSP forwarding entries for processing, if appropriate. */
+ if (ifp->vrf_id == VRF_DEFAULT) {
+ if (IS_ZEBRA_DEBUG_MPLS)
+ zlog_debug(
+ "%u: IF %s IPv4 address add/up, scheduling MPLS processing",
+ ifp->vrf_id, ifp->name);
+ mpls_mark_lsps_for_processing(vrf_info_lookup(ifp->vrf_id));
+ }
}
-void
-connected_up_ipv6 (struct interface *ifp, struct connected *ifc)
+void connected_up_ipv6(struct interface *ifp, struct connected *ifc)
{
- struct prefix p;
+ struct prefix p;
- if (! CHECK_FLAG (ifc->conf, ZEBRA_IFC_REAL))
- return;
+ if (!CHECK_FLAG(ifc->conf, ZEBRA_IFC_REAL))
+ return;
- PREFIX_COPY_IPV6((struct prefix_ipv6 *)&p, CONNECTED_PREFIX(ifc));
+ PREFIX_COPY_IPV6((struct prefix_ipv6 *)&p, CONNECTED_PREFIX(ifc));
- /* Apply mask to the network. */
- apply_mask (&p);
+ /* Apply mask to the network. */
+ apply_mask(&p);
#ifndef LINUX
- /* XXX: It is already done by rib_bogus_ipv6 within rib_add */
- if (IN6_IS_ADDR_UNSPECIFIED (&p.u.prefix6))
- return;
+ /* XXX: It is already done by rib_bogus_ipv6 within rib_add */
+ if (IN6_IS_ADDR_UNSPECIFIED(&p.u.prefix6))
+ return;
#endif
- rib_add (AFI_IP6, SAFI_UNICAST, ifp->vrf_id, ZEBRA_ROUTE_CONNECT,
- 0, 0, &p, NULL, NULL, NULL, ifp->ifindex,
- RT_TABLE_MAIN, ifp->metric, 0, 0);
+ rib_add(AFI_IP6, SAFI_UNICAST, ifp->vrf_id, ZEBRA_ROUTE_CONNECT, 0, 0,
+ &p, NULL, NULL, NULL, ifp->ifindex, RT_TABLE_MAIN, ifp->metric,
+ 0, 0);
- if (IS_ZEBRA_DEBUG_RIB_DETAILED)
- zlog_debug ("%u: IF %s IPv6 address down, scheduling RIB processing",
- ifp->vrf_id, ifp->name);
+ if (IS_ZEBRA_DEBUG_RIB_DETAILED)
+ zlog_debug(
+ "%u: IF %s IPv6 address down, scheduling RIB processing",
+ ifp->vrf_id, ifp->name);
- rib_update (ifp->vrf_id, RIB_UPDATE_IF_CHANGE);
+ rib_update(ifp->vrf_id, RIB_UPDATE_IF_CHANGE);
- /* Schedule LSP forwarding entries for processing, if appropriate. */
- if (ifp->vrf_id == VRF_DEFAULT)
- {
- if (IS_ZEBRA_DEBUG_MPLS)
- zlog_debug ("%u: IF %s IPv4 address add/up, scheduling MPLS processing",
- ifp->vrf_id, ifp->name);
- mpls_mark_lsps_for_processing (vrf_info_lookup(ifp->vrf_id));
- }
+ /* Schedule LSP forwarding entries for processing, if appropriate. */
+ if (ifp->vrf_id == VRF_DEFAULT) {
+ if (IS_ZEBRA_DEBUG_MPLS)
+ zlog_debug(
+ "%u: IF %s IPv4 address add/up, scheduling MPLS processing",
+ ifp->vrf_id, ifp->name);
+ mpls_mark_lsps_for_processing(vrf_info_lookup(ifp->vrf_id));
+ }
}
/* Add connected IPv6 route to the interface. */
-void
-connected_add_ipv6 (struct interface *ifp, int flags, struct in6_addr *addr,
- u_char prefixlen, struct in6_addr *broad,
- const char *label)
+void connected_add_ipv6(struct interface *ifp, int flags, struct in6_addr *addr,
+ u_char prefixlen, struct in6_addr *broad,
+ const char *label)
{
- struct prefix_ipv6 *p;
- struct connected *ifc;
-
- if (ipv6_martian(addr))
- return;
-
- /* Make connected structure. */
- ifc = connected_new ();
- ifc->ifp = ifp;
- ifc->flags = flags;
- /* If we get a notification from the kernel,
- * we can safely assume the address is known to the kernel */
- SET_FLAG(ifc->conf, ZEBRA_IFC_QUEUED);
-
- /* Allocate new connected address. */
- p = prefix_ipv6_new ();
- p->family = AF_INET6;
- IPV6_ADDR_COPY (&p->prefix, addr);
- p->prefixlen = prefixlen;
- ifc->address = (struct prefix *) p;
-
- /* If there is broadcast or peer address. */
- if (broad)
- {
- if (IN6_IS_ADDR_UNSPECIFIED(broad))
- zlog_warn("warning: %s called for interface %s with unspecified "
- "destination address; ignoring!", __func__, ifp->name);
- else
- {
- p = prefix_ipv6_new ();
- p->family = AF_INET6;
- IPV6_ADDR_COPY (&p->prefix, broad);
- p->prefixlen = prefixlen;
- ifc->destination = (struct prefix *) p;
+ struct prefix_ipv6 *p;
+ struct connected *ifc;
+
+ if (ipv6_martian(addr))
+ return;
+
+ /* Make connected structure. */
+ ifc = connected_new();
+ ifc->ifp = ifp;
+ ifc->flags = flags;
+ /* If we get a notification from the kernel,
+ * we can safely assume the address is known to the kernel */
+ SET_FLAG(ifc->conf, ZEBRA_IFC_QUEUED);
+
+ /* Allocate new connected address. */
+ p = prefix_ipv6_new();
+ p->family = AF_INET6;
+ IPV6_ADDR_COPY(&p->prefix, addr);
+ p->prefixlen = prefixlen;
+ ifc->address = (struct prefix *)p;
+
+ /* If there is broadcast or peer address. */
+ if (broad) {
+ if (IN6_IS_ADDR_UNSPECIFIED(broad))
+ zlog_warn(
+ "warning: %s called for interface %s with unspecified "
+ "destination address; ignoring!",
+ __func__, ifp->name);
+ else {
+ p = prefix_ipv6_new();
+ p->family = AF_INET6;
+ IPV6_ADDR_COPY(&p->prefix, broad);
+ p->prefixlen = prefixlen;
+ ifc->destination = (struct prefix *)p;
+ }
+ }
+ if (CHECK_FLAG(ifc->flags, ZEBRA_IFA_PEER) && !ifc->destination) {
+ zlog_warn(
+ "warning: %s called for interface %s "
+ "with peer flag set, but no peer address supplied",
+ __func__, ifp->name);
+ UNSET_FLAG(ifc->flags, ZEBRA_IFA_PEER);
}
- }
- if (CHECK_FLAG(ifc->flags, ZEBRA_IFA_PEER) && !ifc->destination)
- {
- zlog_warn("warning: %s called for interface %s "
- "with peer flag set, but no peer address supplied",
- __func__, ifp->name);
- UNSET_FLAG(ifc->flags, ZEBRA_IFA_PEER);
- }
-
- /* Label of this address. */
- if (label)
- ifc->label = XSTRDUP (MTYPE_CONNECTED_LABEL, label);
-
- /* On Linux, we only get here when DAD is complete, therefore we can set
- * ZEBRA_IFC_REAL.
- *
- * On BSD, there currently doesn't seem to be a way to check for completion of
- * DAD, so we replicate the old behaviour and set ZEBRA_IFC_REAL, although DAD
- * might still be running.
- */
- SET_FLAG(ifc->conf, ZEBRA_IFC_REAL);
- connected_update(ifp, ifc);
+
+ /* Label of this address. */
+ if (label)
+ ifc->label = XSTRDUP(MTYPE_CONNECTED_LABEL, label);
+
+ /* On Linux, we only get here when DAD is complete, therefore we can set
+ * ZEBRA_IFC_REAL.
+ *
+ * On BSD, there currently doesn't seem to be a way to check for
+ * completion of
+ * DAD, so we replicate the old behaviour and set ZEBRA_IFC_REAL,
+ * although DAD
+ * might still be running.
+ */
+ SET_FLAG(ifc->conf, ZEBRA_IFC_REAL);
+ connected_update(ifp, ifc);
}
-void
-connected_down_ipv6 (struct interface *ifp, struct connected *ifc)
+void connected_down_ipv6(struct interface *ifp, struct connected *ifc)
{
- struct prefix p;
+ struct prefix p;
- if (! CHECK_FLAG (ifc->conf, ZEBRA_IFC_REAL))
- return;
+ if (!CHECK_FLAG(ifc->conf, ZEBRA_IFC_REAL))
+ return;
- PREFIX_COPY_IPV6(&p, CONNECTED_PREFIX(ifc));
+ PREFIX_COPY_IPV6(&p, CONNECTED_PREFIX(ifc));
- apply_mask (&p);
+ apply_mask(&p);
- if (IN6_IS_ADDR_UNSPECIFIED (&p.u.prefix6))
- return;
+ if (IN6_IS_ADDR_UNSPECIFIED(&p.u.prefix6))
+ return;
- rib_delete (AFI_IP6, SAFI_UNICAST, ifp->vrf_id, ZEBRA_ROUTE_CONNECT,
- 0, 0, &p, NULL, NULL, ifp->ifindex, 0);
+ rib_delete(AFI_IP6, SAFI_UNICAST, ifp->vrf_id, ZEBRA_ROUTE_CONNECT, 0,
+ 0, &p, NULL, NULL, ifp->ifindex, 0);
- if (IS_ZEBRA_DEBUG_RIB_DETAILED)
- zlog_debug ("%u: IF %s IPv6 address down, scheduling RIB processing",
- ifp->vrf_id, ifp->name);
+ if (IS_ZEBRA_DEBUG_RIB_DETAILED)
+ zlog_debug(
+ "%u: IF %s IPv6 address down, scheduling RIB processing",
+ ifp->vrf_id, ifp->name);
- rib_update (ifp->vrf_id, RIB_UPDATE_IF_CHANGE);
+ rib_update(ifp->vrf_id, RIB_UPDATE_IF_CHANGE);
- /* Schedule LSP forwarding entries for processing, if appropriate. */
- if (ifp->vrf_id == VRF_DEFAULT)
- {
- if (IS_ZEBRA_DEBUG_MPLS)
- zlog_debug ("%u: IF %s IPv4 address add/up, scheduling MPLS processing",
- ifp->vrf_id, ifp->name);
- mpls_mark_lsps_for_processing (vrf_info_lookup(ifp->vrf_id));
- }
+ /* Schedule LSP forwarding entries for processing, if appropriate. */
+ if (ifp->vrf_id == VRF_DEFAULT) {
+ if (IS_ZEBRA_DEBUG_MPLS)
+ zlog_debug(
+ "%u: IF %s IPv4 address add/up, scheduling MPLS processing",
+ ifp->vrf_id, ifp->name);
+ mpls_mark_lsps_for_processing(vrf_info_lookup(ifp->vrf_id));
+ }
}
-void
-connected_delete_ipv6 (struct interface *ifp, struct in6_addr *address,
- u_char prefixlen, struct in6_addr *broad)
+void connected_delete_ipv6(struct interface *ifp, struct in6_addr *address,
+ u_char prefixlen, struct in6_addr *broad)
{
- struct prefix_ipv6 p;
- struct connected *ifc;
-
- memset (&p, 0, sizeof (struct prefix_ipv6));
- p.family = AF_INET6;
- memcpy (&p.prefix, address, sizeof (struct in6_addr));
- p.prefixlen = prefixlen;
-
- ifc = connected_check (ifp, (struct prefix *) &p);
- if (! ifc)
- return;
-
- connected_withdraw (ifc);
-
- if (IS_ZEBRA_DEBUG_RIB_DETAILED)
- zlog_debug ("%u: IF %s IPv6 address del, scheduling RIB processing",
- ifp->vrf_id, ifp->name);
-
- rib_update (ifp->vrf_id, RIB_UPDATE_IF_CHANGE);
-
- /* Schedule LSP forwarding entries for processing, if appropriate. */
- if (ifp->vrf_id == VRF_DEFAULT)
- {
- if (IS_ZEBRA_DEBUG_MPLS)
- zlog_debug ("%u: IF %s IPv4 address add/up, scheduling MPLS processing",
- ifp->vrf_id, ifp->name);
- mpls_mark_lsps_for_processing (vrf_info_lookup(ifp->vrf_id));
- }
+ struct prefix_ipv6 p;
+ struct connected *ifc;
+
+ memset(&p, 0, sizeof(struct prefix_ipv6));
+ p.family = AF_INET6;
+ memcpy(&p.prefix, address, sizeof(struct in6_addr));
+ p.prefixlen = prefixlen;
+
+ ifc = connected_check(ifp, (struct prefix *)&p);
+ if (!ifc)
+ return;
+
+ connected_withdraw(ifc);
+
+ if (IS_ZEBRA_DEBUG_RIB_DETAILED)
+ zlog_debug(
+ "%u: IF %s IPv6 address del, scheduling RIB processing",
+ ifp->vrf_id, ifp->name);
+
+ rib_update(ifp->vrf_id, RIB_UPDATE_IF_CHANGE);
+
+ /* Schedule LSP forwarding entries for processing, if appropriate. */
+ if (ifp->vrf_id == VRF_DEFAULT) {
+ if (IS_ZEBRA_DEBUG_MPLS)
+ zlog_debug(
+ "%u: IF %s IPv4 address add/up, scheduling MPLS processing",
+ ifp->vrf_id, ifp->name);
+ mpls_mark_lsps_for_processing(vrf_info_lookup(ifp->vrf_id));
+ }
}
-int
-connected_is_unnumbered (struct interface *ifp)
+int connected_is_unnumbered(struct interface *ifp)
{
- struct connected *connected;
- struct listnode *node;
-
- for (ALL_LIST_ELEMENTS_RO (ifp->connected, node, connected))
- {
- if (CHECK_FLAG (connected->conf, ZEBRA_IFC_REAL) &&
- connected->address->family == AF_INET)
- return CHECK_FLAG(connected->flags, ZEBRA_IFA_UNNUMBERED);
- }
- return 0;
+ struct connected *connected;
+ struct listnode *node;
+
+ for (ALL_LIST_ELEMENTS_RO(ifp->connected, node, connected)) {
+ if (CHECK_FLAG(connected->conf, ZEBRA_IFC_REAL)
+ && connected->address->family == AF_INET)
+ return CHECK_FLAG(connected->flags,
+ ZEBRA_IFA_UNNUMBERED);
+ }
+ return 0;
}