Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -528,6 +528,9 @@ lib_libnl_route_3_la_SOURCES = \
lib/route/nexthop.c \
lib/route/nexthop_encap.c \
lib/route/nh.c \
lib/route/nh_encap_ila.c \
lib/route/nh_encap_ip.c \
lib/route/nh_encap_ip6.c \
lib/route/nh_encap_mpls.c \
lib/route/nl-route.h \
lib/route/pktloc.c \
Expand Down
49 changes: 49 additions & 0 deletions include/netlink/route/nexthop.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,9 @@ extern int rtnl_route_nh_str2flags(const char *);
extern struct rtnl_nh_encap *rtnl_nh_encap_alloc(void);
extern void rtnl_nh_encap_free(struct rtnl_nh_encap *nh_encap);
extern struct rtnl_nh_encap *rtnl_nh_encap_clone(struct rtnl_nh_encap *src);
extern int rtnl_nh_encap_get_type(struct rtnl_nh_encap *nh_encap);

/* MPLS encap */
extern int rtnl_nh_encap_mpls(struct rtnl_nh_encap *nh_encap,
struct nl_addr *dst, uint8_t ttl);
struct nl_addr *rtnl_nh_get_encap_mpls_dst(struct rtnl_nh_encap *);
Expand All @@ -73,6 +75,53 @@ extern int rtnl_route_nh_encap_mpls(struct rtnl_nexthop *nh,
struct nl_addr *addr, uint8_t ttl);
extern struct nl_addr *rtnl_route_nh_get_encap_mpls_dst(struct rtnl_nexthop *);
extern uint8_t rtnl_route_nh_get_encap_mpls_ttl(struct rtnl_nexthop *);

/* IPv6 encap */
extern int rtnl_nh_encap_ip6(struct rtnl_nh_encap *nh_encap,
struct nl_addr *dst);
struct nl_addr *rtnl_nh_get_encap_ip6_dst(struct rtnl_nh_encap *);
extern int rtnl_nh_set_encap_ip6_id(struct rtnl_nh_encap *, uint64_t);
extern uint64_t rtnl_nh_get_encap_ip6_id(struct rtnl_nh_encap *);
extern int rtnl_nh_set_encap_ip6_hoplimit(struct rtnl_nh_encap *, uint8_t);
extern int rtnl_nh_get_encap_ip6_hoplimit(struct rtnl_nh_encap *);
extern int rtnl_nh_set_encap_ip6_tc(struct rtnl_nh_encap *, uint8_t);
extern int rtnl_nh_get_encap_ip6_tc(struct rtnl_nh_encap *);
extern int rtnl_nh_set_encap_ip6_src(struct rtnl_nh_encap *, struct nl_addr *);
struct nl_addr *rtnl_nh_get_encap_ip6_src(struct rtnl_nh_encap *);
extern int rtnl_nh_set_encap_ip6_flags(struct rtnl_nh_encap *, uint16_t);
extern int rtnl_nh_get_encap_ip6_flags(struct rtnl_nh_encap *);

/* ILA encap */
extern int rtnl_nh_encap_ila(struct rtnl_nh_encap *nh_encap, uint64_t locator);
extern int rtnl_nh_get_encap_ila_locator(struct rtnl_nh_encap *nh_encap,
uint64_t *locator);
extern int rtnl_nh_set_encap_ila_csum_mode(struct rtnl_nh_encap *nh_encap,
uint8_t csum_mode);
extern int rtnl_nh_clear_encap_ila_csum_mode(struct rtnl_nh_encap *nh_encap);
extern int rtnl_nh_get_encap_ila_csum_mode(struct rtnl_nh_encap *nh_encap);
extern int rtnl_nh_set_encap_ila_ident_type(struct rtnl_nh_encap *nh_encap,
uint8_t ident_type);
extern int rtnl_nh_clear_encap_ila_ident_type(struct rtnl_nh_encap *nh_encap);
extern int rtnl_nh_get_encap_ila_ident_type(struct rtnl_nh_encap *nh_encap);
extern int rtnl_nh_set_encap_ila_hook_type(struct rtnl_nh_encap *nh_encap,
uint8_t hook_type);
extern int rtnl_nh_clear_encap_ila_hook_type(struct rtnl_nh_encap *nh_encap);
extern int rtnl_nh_get_encap_ila_hook_type(struct rtnl_nh_encap *nh_encap);

/* IPv4 encap */
extern int rtnl_nh_encap_ip(struct rtnl_nh_encap *nh_encap,
struct nl_addr *dst);
struct nl_addr *rtnl_nh_get_encap_ip_dst(struct rtnl_nh_encap *);
extern int rtnl_nh_set_encap_ip_src(struct rtnl_nh_encap *, struct nl_addr *);
struct nl_addr *rtnl_nh_get_encap_ip_src(struct rtnl_nh_encap *);
extern int rtnl_nh_set_encap_ip_ttl(struct rtnl_nh_encap *, uint8_t);
extern int rtnl_nh_get_encap_ip_ttl(struct rtnl_nh_encap *);
extern int rtnl_nh_set_encap_ip_tos(struct rtnl_nh_encap *, uint8_t);
extern int rtnl_nh_get_encap_ip_tos(struct rtnl_nh_encap *);
extern int rtnl_nh_set_encap_ip_id(struct rtnl_nh_encap *, uint64_t);
extern uint64_t rtnl_nh_get_encap_ip_id(struct rtnl_nh_encap *);
extern int rtnl_nh_set_encap_ip_flags(struct rtnl_nh_encap *, uint16_t);
extern int rtnl_nh_get_encap_ip_flags(struct rtnl_nh_encap *);
#ifdef __cplusplus
}
#endif
Expand Down
18 changes: 18 additions & 0 deletions lib/route/nexthop-encap.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,26 @@ void nh_encap_dump(struct rtnl_nh_encap *rtnh_encap, struct nl_dump_params *dp);

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

void *nh_encap_check_and_get_priv(struct rtnl_nh_encap *nh_encap,
uint16_t encap_type);

/*
* MPLS encap
*/
extern struct nh_encap_ops mpls_encap_ops;

/*
* IPv6 encap
*/
extern struct nh_encap_ops ip6_encap_ops;

/*
* IPv4 encap
*/
extern struct nh_encap_ops ip_encap_ops;

/*
* ILA encap
*/
extern struct nh_encap_ops ila_encap_ops;
#endif
17 changes: 14 additions & 3 deletions lib/route/nexthop_encap.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@ static struct lwtunnel_encap_type {
} lwtunnel_encap_types[__LWTUNNEL_ENCAP_MAX] = {
[LWTUNNEL_ENCAP_NONE] = { .name = "none" },
[LWTUNNEL_ENCAP_MPLS] = { .name = "mpls", .ops = &mpls_encap_ops },
[LWTUNNEL_ENCAP_IP] = { .name = "ip" },
[LWTUNNEL_ENCAP_IP6] = { .name = "ip6" },
[LWTUNNEL_ENCAP_ILA] = { .name = "ila" },
[LWTUNNEL_ENCAP_IP] = { .name = "ip", .ops = &ip_encap_ops },
[LWTUNNEL_ENCAP_IP6] = { .name = "ip6", .ops = &ip6_encap_ops },
[LWTUNNEL_ENCAP_ILA] = { .name = "ila", .ops = &ila_encap_ops },
[LWTUNNEL_ENCAP_BPF] = { .name = "bpf" },
};

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

return a->ops->compare(a->priv, b->priv);
}

void *nh_encap_check_and_get_priv(struct rtnl_nh_encap *nh_encap,
uint16_t encap_type)
{
if (!nh_encap || !nh_encap->ops ||
nh_encap->ops->encap_type != encap_type) {
return NULL;
}

return nh_encap->priv;
}
10 changes: 10 additions & 0 deletions lib/route/nh.c
Original file line number Diff line number Diff line change
Expand Up @@ -737,6 +737,16 @@ struct rtnl_nh_encap *rtnl_nh_encap_alloc(void)
return calloc(1, sizeof(struct rtnl_nh_encap));
}

int rtnl_nh_encap_get_type(struct rtnl_nh_encap *nh_encap)
{
if (!nh_encap)
return -NLE_INVAL;
if (!nh_encap->ops)
return -NLE_INVAL;

return nh_encap->ops->encap_type;
}

void rtnl_nh_encap_free(struct rtnl_nh_encap *nh_encap)
{
if (!nh_encap)
Expand Down
Loading