Skip to content

Commit 06f3c59

Browse files
committed
route: merge branch 'cpaasch-oai:t/add_encaps'
#446
2 parents 6c0c02f + 9f89452 commit 06f3c59

File tree

14 files changed

+1888
-60
lines changed

14 files changed

+1888
-60
lines changed

Makefile.am

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -528,6 +528,9 @@ lib_libnl_route_3_la_SOURCES = \
528528
lib/route/nexthop.c \
529529
lib/route/nexthop_encap.c \
530530
lib/route/nh.c \
531+
lib/route/nh_encap_ila.c \
532+
lib/route/nh_encap_ip.c \
533+
lib/route/nh_encap_ip6.c \
531534
lib/route/nh_encap_mpls.c \
532535
lib/route/nl-route.h \
533536
lib/route/pktloc.c \

include/netlink/route/nexthop.h

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,9 @@ extern int rtnl_route_nh_str2flags(const char *);
6363
extern struct rtnl_nh_encap *rtnl_nh_encap_alloc(void);
6464
extern void rtnl_nh_encap_free(struct rtnl_nh_encap *nh_encap);
6565
extern struct rtnl_nh_encap *rtnl_nh_encap_clone(struct rtnl_nh_encap *src);
66+
extern int rtnl_nh_encap_get_type(struct rtnl_nh_encap *nh_encap);
6667

68+
/* MPLS encap */
6769
extern int rtnl_nh_encap_mpls(struct rtnl_nh_encap *nh_encap,
6870
struct nl_addr *dst, uint8_t ttl);
6971
struct nl_addr *rtnl_nh_get_encap_mpls_dst(struct rtnl_nh_encap *);
@@ -73,6 +75,53 @@ extern int rtnl_route_nh_encap_mpls(struct rtnl_nexthop *nh,
7375
struct nl_addr *addr, uint8_t ttl);
7476
extern struct nl_addr *rtnl_route_nh_get_encap_mpls_dst(struct rtnl_nexthop *);
7577
extern uint8_t rtnl_route_nh_get_encap_mpls_ttl(struct rtnl_nexthop *);
78+
79+
/* IPv6 encap */
80+
extern int rtnl_nh_encap_ip6(struct rtnl_nh_encap *nh_encap,
81+
struct nl_addr *dst);
82+
struct nl_addr *rtnl_nh_get_encap_ip6_dst(struct rtnl_nh_encap *);
83+
extern int rtnl_nh_set_encap_ip6_id(struct rtnl_nh_encap *, uint64_t);
84+
extern uint64_t rtnl_nh_get_encap_ip6_id(struct rtnl_nh_encap *);
85+
extern int rtnl_nh_set_encap_ip6_hoplimit(struct rtnl_nh_encap *, uint8_t);
86+
extern int rtnl_nh_get_encap_ip6_hoplimit(struct rtnl_nh_encap *);
87+
extern int rtnl_nh_set_encap_ip6_tc(struct rtnl_nh_encap *, uint8_t);
88+
extern int rtnl_nh_get_encap_ip6_tc(struct rtnl_nh_encap *);
89+
extern int rtnl_nh_set_encap_ip6_src(struct rtnl_nh_encap *, struct nl_addr *);
90+
struct nl_addr *rtnl_nh_get_encap_ip6_src(struct rtnl_nh_encap *);
91+
extern int rtnl_nh_set_encap_ip6_flags(struct rtnl_nh_encap *, uint16_t);
92+
extern int rtnl_nh_get_encap_ip6_flags(struct rtnl_nh_encap *);
93+
94+
/* ILA encap */
95+
extern int rtnl_nh_encap_ila(struct rtnl_nh_encap *nh_encap, uint64_t locator);
96+
extern int rtnl_nh_get_encap_ila_locator(struct rtnl_nh_encap *nh_encap,
97+
uint64_t *locator);
98+
extern int rtnl_nh_set_encap_ila_csum_mode(struct rtnl_nh_encap *nh_encap,
99+
uint8_t csum_mode);
100+
extern int rtnl_nh_clear_encap_ila_csum_mode(struct rtnl_nh_encap *nh_encap);
101+
extern int rtnl_nh_get_encap_ila_csum_mode(struct rtnl_nh_encap *nh_encap);
102+
extern int rtnl_nh_set_encap_ila_ident_type(struct rtnl_nh_encap *nh_encap,
103+
uint8_t ident_type);
104+
extern int rtnl_nh_clear_encap_ila_ident_type(struct rtnl_nh_encap *nh_encap);
105+
extern int rtnl_nh_get_encap_ila_ident_type(struct rtnl_nh_encap *nh_encap);
106+
extern int rtnl_nh_set_encap_ila_hook_type(struct rtnl_nh_encap *nh_encap,
107+
uint8_t hook_type);
108+
extern int rtnl_nh_clear_encap_ila_hook_type(struct rtnl_nh_encap *nh_encap);
109+
extern int rtnl_nh_get_encap_ila_hook_type(struct rtnl_nh_encap *nh_encap);
110+
111+
/* IPv4 encap */
112+
extern int rtnl_nh_encap_ip(struct rtnl_nh_encap *nh_encap,
113+
struct nl_addr *dst);
114+
struct nl_addr *rtnl_nh_get_encap_ip_dst(struct rtnl_nh_encap *);
115+
extern int rtnl_nh_set_encap_ip_src(struct rtnl_nh_encap *, struct nl_addr *);
116+
struct nl_addr *rtnl_nh_get_encap_ip_src(struct rtnl_nh_encap *);
117+
extern int rtnl_nh_set_encap_ip_ttl(struct rtnl_nh_encap *, uint8_t);
118+
extern int rtnl_nh_get_encap_ip_ttl(struct rtnl_nh_encap *);
119+
extern int rtnl_nh_set_encap_ip_tos(struct rtnl_nh_encap *, uint8_t);
120+
extern int rtnl_nh_get_encap_ip_tos(struct rtnl_nh_encap *);
121+
extern int rtnl_nh_set_encap_ip_id(struct rtnl_nh_encap *, uint64_t);
122+
extern uint64_t rtnl_nh_get_encap_ip_id(struct rtnl_nh_encap *);
123+
extern int rtnl_nh_set_encap_ip_flags(struct rtnl_nh_encap *, uint16_t);
124+
extern int rtnl_nh_get_encap_ip_flags(struct rtnl_nh_encap *);
76125
#ifdef __cplusplus
77126
}
78127
#endif

lib/route/nexthop-encap.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,26 @@ void nh_encap_dump(struct rtnl_nh_encap *rtnh_encap, struct nl_dump_params *dp);
2727

2828
int nh_encap_compare(struct rtnl_nh_encap *a, struct rtnl_nh_encap *b);
2929

30+
void *nh_encap_check_and_get_priv(struct rtnl_nh_encap *nh_encap,
31+
uint16_t encap_type);
32+
3033
/*
3134
* MPLS encap
3235
*/
3336
extern struct nh_encap_ops mpls_encap_ops;
37+
38+
/*
39+
* IPv6 encap
40+
*/
41+
extern struct nh_encap_ops ip6_encap_ops;
42+
43+
/*
44+
* IPv4 encap
45+
*/
46+
extern struct nh_encap_ops ip_encap_ops;
47+
48+
/*
49+
* ILA encap
50+
*/
51+
extern struct nh_encap_ops ila_encap_ops;
3452
#endif

lib/route/nexthop_encap.c

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ static struct lwtunnel_encap_type {
1313
} lwtunnel_encap_types[__LWTUNNEL_ENCAP_MAX] = {
1414
[LWTUNNEL_ENCAP_NONE] = { .name = "none" },
1515
[LWTUNNEL_ENCAP_MPLS] = { .name = "mpls", .ops = &mpls_encap_ops },
16-
[LWTUNNEL_ENCAP_IP] = { .name = "ip" },
17-
[LWTUNNEL_ENCAP_IP6] = { .name = "ip6" },
18-
[LWTUNNEL_ENCAP_ILA] = { .name = "ila" },
16+
[LWTUNNEL_ENCAP_IP] = { .name = "ip", .ops = &ip_encap_ops },
17+
[LWTUNNEL_ENCAP_IP6] = { .name = "ip6", .ops = &ip6_encap_ops },
18+
[LWTUNNEL_ENCAP_ILA] = { .name = "ila", .ops = &ila_encap_ops },
1919
[LWTUNNEL_ENCAP_BPF] = { .name = "bpf" },
2020
};
2121

@@ -121,3 +121,14 @@ int nh_encap_compare(struct rtnl_nh_encap *a, struct rtnl_nh_encap *b)
121121

122122
return a->ops->compare(a->priv, b->priv);
123123
}
124+
125+
void *nh_encap_check_and_get_priv(struct rtnl_nh_encap *nh_encap,
126+
uint16_t encap_type)
127+
{
128+
if (!nh_encap || !nh_encap->ops ||
129+
nh_encap->ops->encap_type != encap_type) {
130+
return NULL;
131+
}
132+
133+
return nh_encap->priv;
134+
}

lib/route/nh.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -737,6 +737,16 @@ struct rtnl_nh_encap *rtnl_nh_encap_alloc(void)
737737
return calloc(1, sizeof(struct rtnl_nh_encap));
738738
}
739739

740+
int rtnl_nh_encap_get_type(struct rtnl_nh_encap *nh_encap)
741+
{
742+
if (!nh_encap)
743+
return -NLE_INVAL;
744+
if (!nh_encap->ops)
745+
return -NLE_INVAL;
746+
747+
return nh_encap->ops->encap_type;
748+
}
749+
740750
void rtnl_nh_encap_free(struct rtnl_nh_encap *nh_encap)
741751
{
742752
if (!nh_encap)

0 commit comments

Comments
 (0)