summaryrefslogtreecommitdiffstats
path: root/zebra/zserv.c
diff options
context:
space:
mode:
authorTimo Teräs <timo.teras@iki.fi>2015-11-02 16:50:07 +0200
committerDonald Sharp <sharpd@cumulusnetworks.com>2015-12-08 14:12:10 -0500
commitb11f3b54c842117e22e2f5cf1561ea34eee8dfcc (patch)
treec31f9893baa2a05db24ea72d1370fb6b11f59c20 /zebra/zserv.c
parent7eb6136b2732d4782360f9f376336c6d4f667ff0 (diff)
downloadquagga-b11f3b54c842117e22e2f5cf1561ea34eee8dfcc.tar.bz2
quagga-b11f3b54c842117e22e2f5cf1561ea34eee8dfcc.tar.xz
zebra: implement per-route mtu handling
This commits allow overriding MTU using netlink attributes on per-route basis. This is useful for routing protocols that can advertice prefix specific MTUs between routers (e.g. NHRP). Signed-off-by: Timo Teräs <timo.teras@iki.fi>
Diffstat (limited to 'zebra/zserv.c')
-rw-r--r--zebra/zserv.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/zebra/zserv.c b/zebra/zserv.c
index e26c8cac..7a75ed42 100644
--- a/zebra/zserv.c
+++ b/zebra/zserv.c
@@ -455,6 +455,8 @@ zsend_route_multipath (int cmd, struct zserv *client, struct prefix *p,
stream_putc (s, rib->distance);
SET_FLAG (zapi_flags, ZAPI_MESSAGE_METRIC);
stream_putl (s, rib->metric);
+ SET_FLAG (zapi_flags, ZAPI_MESSAGE_MTU);
+ stream_putl (s, rib->mtu);
}
/* write real message flags value */
@@ -903,6 +905,9 @@ zread_ipv4_add (struct zserv *client, u_short length, vrf_id_t vrf_id)
if (CHECK_FLAG (message, ZAPI_MESSAGE_METRIC))
rib->metric = stream_getl (s);
+ if (CHECK_FLAG (message, ZAPI_MESSAGE_MTU))
+ rib->mtu = stream_getl (s);
+
/* Table */
rib->table=zebrad.rtm_table_default;
rib_add_ipv4_multipath (&p, rib, safi);
@@ -1092,15 +1097,20 @@ zread_ipv6_add (struct zserv *client, u_short length, vrf_id_t vrf_id)
api.metric = stream_getl (s);
else
api.metric = 0;
+
+ if (CHECK_FLAG (api.message, ZAPI_MESSAGE_MTU))
+ api.mtu = stream_getl (s);
+ else
+ api.mtu = 0;
if (IN6_IS_ADDR_UNSPECIFIED (&nexthop))
rib_add_ipv6 (api.type, api.flags, &p, NULL, ifindex,
vrf_id, zebrad.rtm_table_default, api.metric,
- api.distance, api.safi);
+ api.mtu, api.distance, api.safi);
else
rib_add_ipv6 (api.type, api.flags, &p, &nexthop, ifindex,
vrf_id, zebrad.rtm_table_default, api.metric,
- api.distance, api.safi);
+ api.mtu, api.distance, api.safi);
return 0;
}