mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-08 14:34:22 +00:00
zebra: Put unicast nexthop parsing into its own function
Move the nexthop unicast parsing into its own function to improve code readability. It was getting a bit too indented. Signed-off-by: Stephen Worley <sworley@cumulusnetworks.com>
This commit is contained in:
parent
fcc89a9cfc
commit
77a44d94f8
@ -321,6 +321,63 @@ static int parse_encap_mpls(struct rtattr *tb, mpls_label_t *labels)
|
|||||||
return num_labels;
|
return num_labels;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct nexthop
|
||||||
|
parse_nexthop_unicast(ns_id_t ns_id, struct rtmsg *rtm, struct rtattr **tb,
|
||||||
|
enum blackhole_type bh_type, int index, void *prefsrc,
|
||||||
|
void *gate, afi_t afi, vrf_id_t nh_vrf_id)
|
||||||
|
{
|
||||||
|
struct interface *ifp = NULL;
|
||||||
|
struct nexthop nh = {0};
|
||||||
|
mpls_label_t labels[MPLS_MAX_LABELS] = {0};
|
||||||
|
int num_labels = 0;
|
||||||
|
|
||||||
|
size_t sz = (afi == AFI_IP) ? 4 : 16;
|
||||||
|
|
||||||
|
if (bh_type == BLACKHOLE_UNSPEC) {
|
||||||
|
if (index && !gate)
|
||||||
|
nh.type = NEXTHOP_TYPE_IFINDEX;
|
||||||
|
else if (index && gate)
|
||||||
|
nh.type = (afi == AFI_IP) ? NEXTHOP_TYPE_IPV4_IFINDEX
|
||||||
|
: NEXTHOP_TYPE_IPV6_IFINDEX;
|
||||||
|
else if (!index && gate)
|
||||||
|
nh.type = (afi == AFI_IP) ? NEXTHOP_TYPE_IPV4
|
||||||
|
: NEXTHOP_TYPE_IPV6;
|
||||||
|
else {
|
||||||
|
nh.type = NEXTHOP_TYPE_BLACKHOLE;
|
||||||
|
nh.bh_type = bh_type;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
nh.type = NEXTHOP_TYPE_BLACKHOLE;
|
||||||
|
nh.bh_type = bh_type;
|
||||||
|
}
|
||||||
|
nh.ifindex = index;
|
||||||
|
if (prefsrc)
|
||||||
|
memcpy(&nh.src, prefsrc, sz);
|
||||||
|
if (gate)
|
||||||
|
memcpy(&nh.gate, gate, sz);
|
||||||
|
|
||||||
|
if (index) {
|
||||||
|
ifp = if_lookup_by_index_per_ns(zebra_ns_lookup(ns_id), index);
|
||||||
|
if (ifp)
|
||||||
|
nh_vrf_id = ifp->vrf_id;
|
||||||
|
}
|
||||||
|
nh.vrf_id = nh_vrf_id;
|
||||||
|
|
||||||
|
if (tb[RTA_ENCAP] && tb[RTA_ENCAP_TYPE]
|
||||||
|
&& *(uint16_t *)RTA_DATA(tb[RTA_ENCAP_TYPE])
|
||||||
|
== LWTUNNEL_ENCAP_MPLS) {
|
||||||
|
num_labels = parse_encap_mpls(tb[RTA_ENCAP], labels);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rtm->rtm_flags & RTNH_F_ONLINK)
|
||||||
|
SET_FLAG(nh.flags, NEXTHOP_FLAG_ONLINK);
|
||||||
|
|
||||||
|
if (num_labels)
|
||||||
|
nexthop_add_labels(&nh, ZEBRA_LSP_STATIC, num_labels, labels);
|
||||||
|
|
||||||
|
return nh;
|
||||||
|
}
|
||||||
|
|
||||||
/* Looking up routing table by netlink interface. */
|
/* Looking up routing table by netlink interface. */
|
||||||
static int netlink_route_change_read_unicast(struct nlmsghdr *h, ns_id_t ns_id,
|
static int netlink_route_change_read_unicast(struct nlmsghdr *h, ns_id_t ns_id,
|
||||||
int startup)
|
int startup)
|
||||||
@ -350,10 +407,6 @@ static int netlink_route_change_read_unicast(struct nlmsghdr *h, ns_id_t ns_id,
|
|||||||
void *src = NULL; /* IPv6 srcdest source prefix */
|
void *src = NULL; /* IPv6 srcdest source prefix */
|
||||||
enum blackhole_type bh_type = BLACKHOLE_UNSPEC;
|
enum blackhole_type bh_type = BLACKHOLE_UNSPEC;
|
||||||
|
|
||||||
/* MPLS labels */
|
|
||||||
mpls_label_t labels[MPLS_MAX_LABELS] = {0};
|
|
||||||
int num_labels = 0;
|
|
||||||
|
|
||||||
rtm = NLMSG_DATA(h);
|
rtm = NLMSG_DATA(h);
|
||||||
|
|
||||||
if (startup && h->nlmsg_type != RTM_NEWROUTE)
|
if (startup && h->nlmsg_type != RTM_NEWROUTE)
|
||||||
@ -557,60 +610,13 @@ static int netlink_route_change_read_unicast(struct nlmsghdr *h, ns_id_t ns_id,
|
|||||||
vrf_id_t nh_vrf_id = vrf_id;
|
vrf_id_t nh_vrf_id = vrf_id;
|
||||||
|
|
||||||
if (!tb[RTA_MULTIPATH]) {
|
if (!tb[RTA_MULTIPATH]) {
|
||||||
struct nexthop nh;
|
struct nexthop nh = {0};
|
||||||
size_t sz = (afi == AFI_IP) ? 4 : 16;
|
|
||||||
|
|
||||||
memset(&nh, 0, sizeof(nh));
|
if (!nhe_id) {
|
||||||
|
nh = parse_nexthop_unicast(
|
||||||
if (bh_type == BLACKHOLE_UNSPEC) {
|
ns_id, rtm, tb, bh_type, index, prefsrc,
|
||||||
if (index && !gate)
|
gate, afi, nh_vrf_id);
|
||||||
nh.type = NEXTHOP_TYPE_IFINDEX;
|
|
||||||
else if (index && gate)
|
|
||||||
nh.type =
|
|
||||||
(afi == AFI_IP)
|
|
||||||
? NEXTHOP_TYPE_IPV4_IFINDEX
|
|
||||||
: NEXTHOP_TYPE_IPV6_IFINDEX;
|
|
||||||
else if (!index && gate)
|
|
||||||
nh.type = (afi == AFI_IP)
|
|
||||||
? NEXTHOP_TYPE_IPV4
|
|
||||||
: NEXTHOP_TYPE_IPV6;
|
|
||||||
else {
|
|
||||||
nh.type = NEXTHOP_TYPE_BLACKHOLE;
|
|
||||||
nh.bh_type = bh_type;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
nh.type = NEXTHOP_TYPE_BLACKHOLE;
|
|
||||||
nh.bh_type = bh_type;
|
|
||||||
}
|
}
|
||||||
nh.ifindex = index;
|
|
||||||
if (prefsrc)
|
|
||||||
memcpy(&nh.src, prefsrc, sz);
|
|
||||||
if (gate)
|
|
||||||
memcpy(&nh.gate, gate, sz);
|
|
||||||
|
|
||||||
if (index) {
|
|
||||||
ifp = if_lookup_by_index_per_ns(
|
|
||||||
zebra_ns_lookup(ns_id),
|
|
||||||
index);
|
|
||||||
if (ifp)
|
|
||||||
nh_vrf_id = ifp->vrf_id;
|
|
||||||
}
|
|
||||||
nh.vrf_id = nh_vrf_id;
|
|
||||||
|
|
||||||
if (tb[RTA_ENCAP] && tb[RTA_ENCAP_TYPE]
|
|
||||||
&& *(uint16_t *)RTA_DATA(tb[RTA_ENCAP_TYPE])
|
|
||||||
== LWTUNNEL_ENCAP_MPLS) {
|
|
||||||
num_labels =
|
|
||||||
parse_encap_mpls(tb[RTA_ENCAP], labels);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rtm->rtm_flags & RTNH_F_ONLINK)
|
|
||||||
SET_FLAG(nh.flags, NEXTHOP_FLAG_ONLINK);
|
|
||||||
|
|
||||||
if (num_labels)
|
|
||||||
nexthop_add_labels(&nh, ZEBRA_LSP_STATIC,
|
|
||||||
num_labels, labels);
|
|
||||||
|
|
||||||
rib_add(afi, SAFI_UNICAST, vrf_id, proto, 0, flags, &p,
|
rib_add(afi, SAFI_UNICAST, vrf_id, proto, 0, flags, &p,
|
||||||
&src_p, &nh, table, metric, mtu, distance, tag);
|
&src_p, &nh, table, metric, mtu, distance, tag);
|
||||||
} else {
|
} else {
|
||||||
@ -619,6 +625,9 @@ static int netlink_route_change_read_unicast(struct nlmsghdr *h, ns_id_t ns_id,
|
|||||||
struct route_entry *re;
|
struct route_entry *re;
|
||||||
struct rtnexthop *rtnh =
|
struct rtnexthop *rtnh =
|
||||||
(struct rtnexthop *)RTA_DATA(tb[RTA_MULTIPATH]);
|
(struct rtnexthop *)RTA_DATA(tb[RTA_MULTIPATH]);
|
||||||
|
/* MPLS labels */
|
||||||
|
mpls_label_t labels[MPLS_MAX_LABELS] = {0};
|
||||||
|
int num_labels = 0;
|
||||||
|
|
||||||
len = RTA_PAYLOAD(tb[RTA_MULTIPATH]);
|
len = RTA_PAYLOAD(tb[RTA_MULTIPATH]);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user