diff options
| author | Renato Westphal <renato@opensourcerouting.org> | 2021-09-20 22:15:55 -0300 | 
|---|---|---|
| committer | David Lamparter <equinox@opensourcerouting.org> | 2022-01-15 17:22:27 +0100 | 
| commit | 5b5d66c43142c3d60a1595e08b0c316df1f8c85a (patch) | |
| tree | 4a67c34b3c959fec2b00f531db06255105aefcc2 /ospf6d | |
| parent | c1879c8fc50243b1edd0b42ae365adf35f190a09 (diff) | |
lib, ospfd, ospf6d, zebra: add OSPF opaque route attributes
Update ospfd and ospf6d to send opaque route attributes to
zebra. Those attributes are stored in the RIB and can be viewed
using the "show ip[v6] route" commands (other than that, they are
completely ignored by zebra).
Example:
```
debian# show ip route 192.168.1.0/24
Routing entry for 192.168.1.0/24
  Known via "ospf", distance 110, metric 20, best
  Last update 01:57:08 ago
  * 10.0.1.2, via eth-rt2, weight 1
    OSPF path type        : External-2
    OSPF tag              : 0
debian#
debian# show ip route 192.168.1.0/24 json
{
  "192.168.1.0\/24":[
    {
      "prefix":"192.168.1.0\/24",
      "prefixLen":24,
      "protocol":"ospf",
      "vrfId":0,
      "vrfName":"default",
      "selected":true,
      [snip]
      "ospfPathType":"External-2",
      "ospfTag":"0"
    }
  ]
}
```
Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
Diffstat (limited to 'ospf6d')
| -rw-r--r-- | ospf6d/ospf6_top.c | 39 | ||||
| -rw-r--r-- | ospf6d/ospf6_top.h | 6 | ||||
| -rw-r--r-- | ospf6d/ospf6_zebra.c | 37 | 
3 files changed, 79 insertions, 3 deletions
diff --git a/ospf6d/ospf6_top.c b/ospf6d/ospf6_top.c index 6c79dcfb71..b50f32059e 100644 --- a/ospf6d/ospf6_top.c +++ b/ospf6d/ospf6_top.c @@ -437,6 +437,7 @@ static struct ospf6 *ospf6_create(const char *name)  	o->fd = -1;  	o->max_multipath = MULTIPATH_NUM; +	SET_FLAG(o->config_flags, OSPF6_SEND_EXTRA_DATA_TO_ZEBRA);  	o->oi_write_q = list_new(); @@ -887,6 +888,39 @@ DEFUN (no_ospf6_log_adjacency_changes_detail,  	return CMD_SUCCESS;  } +static void ospf6_reinstall_routes(struct ospf6 *ospf6) +{ +	struct ospf6_route *route; + +	for (route = ospf6_route_head(ospf6->route_table); route; +	     route = ospf6_route_next(route)) +		ospf6_zebra_route_update_add(route, ospf6); +} + +DEFPY (ospf6_send_extra_data, +       ospf6_send_extra_data_cmd, +       "[no] ospf6 send-extra-data zebra", +       NO_STR +       OSPF6_STR +       "Extra data to Zebra for display/use\n" +       "To zebra\n") +{ +	VTY_DECLVAR_CONTEXT(ospf6, ospf6); + +	if (no +	    && CHECK_FLAG(ospf6->config_flags, +			  OSPF6_SEND_EXTRA_DATA_TO_ZEBRA)) { +		UNSET_FLAG(ospf6->config_flags, OSPF6_SEND_EXTRA_DATA_TO_ZEBRA); +		ospf6_reinstall_routes(ospf6); +	} else if (!CHECK_FLAG(ospf6->config_flags, +			       OSPF6_SEND_EXTRA_DATA_TO_ZEBRA)) { +		SET_FLAG(ospf6->config_flags, OSPF6_SEND_EXTRA_DATA_TO_ZEBRA); +		ospf6_reinstall_routes(ospf6); +	} + +	return CMD_SUCCESS; +} +  DEFUN (ospf6_timers_lsa,         ospf6_timers_lsa_cmd,         "timers lsa min-arrival (0-600000)", @@ -2198,6 +2232,10 @@ static int config_write_ospf6(struct vty *vty)  			vty_out(vty, " ospf6 router-id %pI4\n",  				&ospf6->router_id_static); +		if (!CHECK_FLAG(ospf6->config_flags, +				OSPF6_SEND_EXTRA_DATA_TO_ZEBRA)) +			vty_out(vty, " no ospf6 send-extra-data zebra\n"); +  		/* log-adjacency-changes flag print. */  		if (CHECK_FLAG(ospf6->config_flags,  			       OSPF6_LOG_ADJACENCY_CHANGES)) { @@ -2283,6 +2321,7 @@ void ospf6_top_init(void)  	install_element(OSPF6_NODE, &ospf6_log_adjacency_changes_detail_cmd);  	install_element(OSPF6_NODE, &no_ospf6_log_adjacency_changes_cmd);  	install_element(OSPF6_NODE, &no_ospf6_log_adjacency_changes_detail_cmd); +	install_element(OSPF6_NODE, &ospf6_send_extra_data_cmd);  	/* LSA timers commands */  	install_element(OSPF6_NODE, &ospf6_timers_lsa_cmd); diff --git a/ospf6d/ospf6_top.h b/ospf6d/ospf6_top.h index 55cab72307..fae5569168 100644 --- a/ospf6d/ospf6_top.h +++ b/ospf6d/ospf6_top.h @@ -32,9 +32,9 @@ struct ospf6_master {  };  /* ospf6->config_flags */ -enum { -	OSPF6_LOG_ADJACENCY_CHANGES =	(1 << 0), -	OSPF6_LOG_ADJACENCY_DETAIL =	(1 << 1), +enum { OSPF6_LOG_ADJACENCY_CHANGES	= (1 << 0), +       OSPF6_LOG_ADJACENCY_DETAIL	= (1 << 1), +       OSPF6_SEND_EXTRA_DATA_TO_ZEBRA	= (1 << 2),  };  /* For processing route-map change update in the callback */ diff --git a/ospf6d/ospf6_zebra.c b/ospf6d/ospf6_zebra.c index 5e50a6cc55..b818633518 100644 --- a/ospf6d/ospf6_zebra.c +++ b/ospf6d/ospf6_zebra.c @@ -27,6 +27,7 @@  #include "stream.h"  #include "zclient.h"  #include "memory.h" +#include "route_opaque.h"  #include "lib/bfd.h"  #include "lib_errors.h" @@ -371,6 +372,38 @@ DEFUN(show_zebra,  	return CMD_SUCCESS;  } +static void ospf6_zebra_append_opaque_attr(struct ospf6_route *request, +					   struct zapi_route *api) +{ +	struct ospf_zebra_opaque ospf_opaque = {}; + +	/* OSPF path type */ +	snprintf(ospf_opaque.path_type, sizeof(ospf_opaque.path_type), "%s", +		 OSPF6_PATH_TYPE_NAME(request->path.type)); + +	switch (request->path.type) { +	case OSPF6_PATH_TYPE_INTRA: +	case OSPF6_PATH_TYPE_INTER: +		/* OSPF area ID */ +		(void)inet_ntop(AF_INET, &request->path.area_id, +				ospf_opaque.area_id, +				sizeof(ospf_opaque.area_id)); +		break; +	case OSPF6_PATH_TYPE_EXTERNAL1: +	case OSPF6_PATH_TYPE_EXTERNAL2: +		/* OSPF route tag */ +		snprintf(ospf_opaque.tag, sizeof(ospf_opaque.tag), "%u", +			 request->path.tag); +		break; +	default: +		break; +	} + +	SET_FLAG(api->message, ZAPI_MESSAGE_OPAQUE); +	api->opaque.length = sizeof(struct ospf_zebra_opaque); +	memcpy(api->opaque.data, &ospf_opaque, api->opaque.length); +} +  #define ADD    0  #define REM    1  static void ospf6_zebra_route_update(int type, struct ospf6_route *request, @@ -455,6 +488,10 @@ static void ospf6_zebra_route_update(int type, struct ospf6_route *request,  	api.distance = ospf6_distance_apply((struct prefix_ipv6 *)dest, request,  					    ospf6); +	if (type == ADD +	    && CHECK_FLAG(ospf6->config_flags, OSPF6_SEND_EXTRA_DATA_TO_ZEBRA)) +		ospf6_zebra_append_opaque_attr(request, &api); +  	if (type == REM)  		ret = zclient_route_send(ZEBRA_ROUTE_DELETE, zclient, &api);  	else  | 
