svn commit: r306847 - in head/net/quagga: . files
Sergey Matveychuk
sem at FreeBSD.org
Fri Nov 2 13:06:16 UTC 2012
Author: sem
Date: Fri Nov 2 13:06:15 2012
New Revision: 306847
URL: http://svn.freebsd.org/changeset/ports/306847
Log:
- Add an optional patch to allow 'set ip next-hop' in route maps
for OSPF announces. This is useful for OSPF with CARP.
Submitted by: glebius
Approved by: maintainer
Feature safe: yes
Added:
head/net/quagga/files/extra-patch-ospf-nexthop (contents, props changed)
Modified:
head/net/quagga/Makefile
Modified: head/net/quagga/Makefile
==============================================================================
--- head/net/quagga/Makefile Fri Nov 2 12:17:41 2012 (r306846)
+++ head/net/quagga/Makefile Fri Nov 2 13:06:15 2012 (r306847)
@@ -34,7 +34,7 @@ MAN8= bgpd.8 ospf6d.8 ospfd.8 ripd.8 ri
INFO= quagga
OPTIONS_DEFINE= ISISD PAM OSPF_OPAQUE_LSA RTADV SNMP TCPSOCKETS DLMALLOC \
- NO_BGP_ANNOUNCE
+ NO_BGP_ANNOUNCE OSPF_NEXTHOP
ISISD_DESC= Enable experimental ISIS daemon
PAM_DESC= PAM authentication for vtysh
@@ -43,6 +43,7 @@ RTADV_DESC= IPv6 Router Advertisements
TCPSOCKETS_DESC= Use TCP/IP sockets for protocol daemons
DLMALLOC_DESC= Use dlmalloc (makes bgpd much faster)
NO_BGP_ANNOUNCE_DESC= Turn off BGP route announcement
+OSPF_NEXTHOP_DESC= Set ip next-hop in OSPF route maps
.include <bsd.port.options.mk>
@@ -127,6 +128,11 @@ SUB_LIST= RCLDCONFIG=
CONFIGURE_ARGS+=--disable-bgp-announce
.endif
+.if ${PORT_OPTIONS:MOSPF_NEXTHOP}
+post-patch:
+ @${PATCH} ${PATCH_ARGS} < ${PATCHDIR}/extra-patch-ospf-nexthop
+.endif
+
USE_RC_SUBR= quagga watchquagga
SUB_LIST+= LOCALSTATE_DIR=${LOCALSTATE_DIR} \
Added: head/net/quagga/files/extra-patch-ospf-nexthop
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ head/net/quagga/files/extra-patch-ospf-nexthop Fri Nov 2 13:06:15 2012 (r306847)
@@ -0,0 +1,175 @@
+diff -Nur ./ospfd/ospf_asbr.c /tmp/quagga-0.99.20-patched/ospfd/ospf_asbr.c
+--- ./ospfd/ospf_asbr.c 2011-09-29 16:59:32.000000000 +0400
++++ /tmp/quagga-0.99.20-patched/ospfd/ospf_asbr.c 2012-01-15 18:44:18.000000000 +0400
+@@ -122,6 +122,7 @@
+ {
+ values->metric = -1;
+ values->metric_type = -1;
++ values->nexthop.s_addr = -1;
+ }
+
+ int
+diff -Nur ./ospfd/ospf_asbr.h /tmp/quagga-0.99.20-patched/ospfd/ospf_asbr.h
+--- ./ospfd/ospf_asbr.h 2011-09-29 16:59:32.000000000 +0400
++++ /tmp/quagga-0.99.20-patched/ospfd/ospf_asbr.h 2012-01-15 18:44:18.000000000 +0400
+@@ -27,6 +27,7 @@
+ {
+ int32_t metric;
+ int32_t metric_type;
++ struct in_addr nexthop;
+ };
+
+ /* Redistributed external information. */
+@@ -50,6 +51,7 @@
+ struct route_map_set_values route_map_set;
+ #define ROUTEMAP_METRIC(E) (E)->route_map_set.metric
+ #define ROUTEMAP_METRIC_TYPE(E) (E)->route_map_set.metric_type
++#define ROUTEMAP_NEXTHOP(E) (E)->route_map_set.nexthop
+ };
+
+ #define OSPF_ASBR_CHECK_DELAY 30
+diff -Nur ./ospfd/ospf_lsa.c /tmp/quagga-0.99.20-patched/ospfd/ospf_lsa.c
+--- ./ospfd/ospf_lsa.c 2011-09-29 16:59:32.000000000 +0400
++++ /tmp/quagga-0.99.20-patched/ospfd/ospf_lsa.c 2012-01-15 18:44:18.000000000 +0400
+@@ -1614,7 +1614,8 @@
+ stream_put_ospf_metric (s, mvalue);
+
+ /* Get forwarding address to nexthop if on the Connection List, else 0. */
+- fwd_addr = ospf_external_lsa_nexthop_get (ospf, ei->nexthop);
++ fwd_addr = (ei->route_map_set.nexthop.s_addr != -1) ?
++ ROUTEMAP_NEXTHOP (ei) : ospf_external_lsa_nexthop_get (ospf, ei->nexthop);
+
+ /* Put forwarding address. */
+ stream_put_ipv4 (s, fwd_addr.s_addr);
+diff -Nur ./ospfd/ospf_routemap.c /tmp/quagga-0.99.20-patched/ospfd/ospf_routemap.c
+--- ./ospfd/ospf_routemap.c 2011-09-29 16:59:32.000000000 +0400
++++ /tmp/quagga-0.99.20-patched/ospfd/ospf_routemap.c 2012-01-15 18:44:18.000000000 +0400
+@@ -527,6 +527,62 @@
+ route_set_metric_type_free,
+ };
+
++/* `set ip next-hop IP_ADDRESS' */
++/* Set nexthop to object. */
++static route_map_result_t
++route_set_ip_nexthop (void *rule, struct prefix *prefix,
++ route_map_object_t type, void *object)
++{
++ struct in_addr *address;
++ struct external_info *ei;
++
++ if (type == RMAP_OSPF)
++ {
++ /* Fetch routemap's rule information. */
++ address = rule;
++ ei = object;
++
++ /* Set metric out value. */
++ ei->route_map_set.nexthop = *address;
++ }
++ return RMAP_OKAY;
++}
++
++/* set ip next-hop compilation. */
++static void *
++route_set_ip_nexthop_compile (const char *arg)
++{
++ struct in_addr *address = NULL;
++ int ret;
++
++ address = XMALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (struct in_addr));
++ ret = inet_aton (arg, address);
++
++ if (ret == 0)
++ {
++ XFREE (MTYPE_ROUTE_MAP_COMPILED, address);
++ return NULL;
++ }
++
++ return address;
++}
++
++/* Free route map's compiled `set ip next-hop' value. */
++static void
++route_set_ip_nexthop_free (void *rule)
++{
++ XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);
++}
++
++/* Set ip next-hop rule structure. */
++struct route_map_rule_cmd route_set_ip_nexthop_cmd =
++{
++ "ip next-hop",
++ route_set_ip_nexthop,
++ route_set_ip_nexthop_compile,
++ route_set_ip_nexthop_free,
++};
++
+ DEFUN (match_ip_nexthop,
+ match_ip_nexthop_cmd,
+ "match ip next-hop (<1-199>|<1300-2699>|WORD)",
+@@ -781,6 +837,49 @@
+ "OSPF[6] external type 1 metric\n"
+ "OSPF[6] external type 2 metric\n")
+
++DEFUN (set_ip_nexthop,
++ set_ip_nexthop_cmd,
++ "set ip next-hop A.B.C.D",
++ SET_STR
++ IP_STR
++ "Next hop address\n"
++ "IP address of next hop\n")
++{
++ union sockunion su;
++ int ret;
++
++ ret = str2sockunion (argv[0], &su);
++ if (ret < 0)
++ {
++ vty_out (vty, "%% Malformed Next-hop address%s", VTY_NEWLINE);
++ return CMD_WARNING;
++ }
++
++ return ospf_route_set_add (vty, vty->index, "ip next-hop", argv[0]);
++}
++
++DEFUN (no_set_ip_nexthop,
++ no_set_ip_nexthop_cmd,
++ "no set ip next-hop",
++ NO_STR
++ SET_STR
++ "Next hop address\n")
++{
++ if (argc == 0)
++ return ospf_route_set_delete (vty, vty->index, "ip next-hop", NULL);
++
++ return ospf_route_set_delete (vty, vty->index, "ip next-hop", argv[0]);
++}
++
++ALIAS (no_set_ip_nexthop,
++ no_set_ip_nexthop_val_cmd,
++ "no set ip next-hop A.B.C.D",
++ NO_STR
++ SET_STR
++ IP_STR
++ "Next hop address\n"
++ "IP address of next hop\n")
++
+ /* Route-map init */
+ void
+ ospf_route_map_init (void)
+@@ -800,6 +899,7 @@
+
+ route_map_install_set (&route_set_metric_cmd);
+ route_map_install_set (&route_set_metric_type_cmd);
++ route_map_install_set (&route_set_ip_nexthop_cmd);
+
+ install_element (RMAP_NODE, &match_ip_nexthop_cmd);
+ install_element (RMAP_NODE, &no_match_ip_nexthop_cmd);
+@@ -823,4 +923,7 @@
+ install_element (RMAP_NODE, &set_metric_type_cmd);
+ install_element (RMAP_NODE, &no_set_metric_type_cmd);
+ install_element (RMAP_NODE, &no_set_metric_type_val_cmd);
++ install_element (RMAP_NODE, &set_ip_nexthop_cmd);
++ install_element (RMAP_NODE, &no_set_ip_nexthop_cmd);
++ install_element (RMAP_NODE, &no_set_ip_nexthop_val_cmd);
+ }
More information about the svn-ports-all
mailing list