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: 2 additions & 1 deletion Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -1064,9 +1064,10 @@ tests_check_all_SOURCES = \
tests/cksuite-all-attr.c \
tests/cksuite-all-ematch-tree-clone.c \
tests/cksuite-all-netns.c \
tests/cksuite-all.h \
tests/cksuite-link-ip6tnl.c \
tests/cksuite-route-nexthop.c \
tests/cksuite-route-nh.c \
tests/cksuite-all.h \
$(NULL)

tests_check_all_CPPFLAGS = \
Expand Down
80 changes: 42 additions & 38 deletions include/netlink/route/nexthop.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ extern "C" {
#endif

struct rtnl_nexthop;
struct rtnl_nh_encap;

enum {
NH_DUMP_FROM_ONELINE = -2,
Expand All @@ -22,53 +23,56 @@ enum {
/* > 0 reserved for nexthop index */
};

extern struct rtnl_nexthop * rtnl_route_nh_alloc(void);
extern struct rtnl_nexthop * rtnl_route_nh_clone(struct rtnl_nexthop *);
extern void rtnl_route_nh_free(struct rtnl_nexthop *);
extern struct rtnl_nexthop *rtnl_route_nh_alloc(void);
extern struct rtnl_nexthop *rtnl_route_nh_clone(struct rtnl_nexthop *);
extern void rtnl_route_nh_free(struct rtnl_nexthop *);

extern int rtnl_route_nh_compare(struct rtnl_nexthop *,
struct rtnl_nexthop *,
uint32_t, int);
extern int rtnl_route_nh_compare(struct rtnl_nexthop *, struct rtnl_nexthop *,
uint32_t, int);

extern int rtnl_route_nh_identical(struct rtnl_nexthop *,
struct rtnl_nexthop *);
extern int rtnl_route_nh_identical(struct rtnl_nexthop *,
struct rtnl_nexthop *);

extern void rtnl_route_nh_dump(struct rtnl_nexthop *,
struct nl_dump_params *);
extern void rtnl_route_nh_dump(struct rtnl_nexthop *, struct nl_dump_params *);

extern void rtnl_route_nh_set_weight(struct rtnl_nexthop *, uint8_t);
extern uint8_t rtnl_route_nh_get_weight(struct rtnl_nexthop *);
extern void rtnl_route_nh_set_ifindex(struct rtnl_nexthop *, int);
extern int rtnl_route_nh_get_ifindex(struct rtnl_nexthop *);
extern void rtnl_route_nh_set_gateway(struct rtnl_nexthop *,
struct nl_addr *);
extern struct nl_addr * rtnl_route_nh_get_gateway(struct rtnl_nexthop *);
extern void rtnl_route_nh_set_flags(struct rtnl_nexthop *,
unsigned int);
extern void rtnl_route_nh_unset_flags(struct rtnl_nexthop *,
unsigned int);
extern unsigned int rtnl_route_nh_get_flags(struct rtnl_nexthop *);
extern void rtnl_route_nh_set_realms(struct rtnl_nexthop *,
uint32_t);
extern uint32_t rtnl_route_nh_get_realms(struct rtnl_nexthop *);
extern void rtnl_route_nh_set_weight(struct rtnl_nexthop *, uint8_t);
extern uint8_t rtnl_route_nh_get_weight(struct rtnl_nexthop *);
extern void rtnl_route_nh_set_ifindex(struct rtnl_nexthop *, int);
extern int rtnl_route_nh_get_ifindex(struct rtnl_nexthop *);
extern void rtnl_route_nh_set_gateway(struct rtnl_nexthop *, struct nl_addr *);
extern struct nl_addr *rtnl_route_nh_get_gateway(struct rtnl_nexthop *);
extern void rtnl_route_nh_set_flags(struct rtnl_nexthop *, unsigned int);
extern void rtnl_route_nh_unset_flags(struct rtnl_nexthop *, unsigned int);
extern unsigned int rtnl_route_nh_get_flags(struct rtnl_nexthop *);
extern void rtnl_route_nh_set_realms(struct rtnl_nexthop *, uint32_t);
extern uint32_t rtnl_route_nh_get_realms(struct rtnl_nexthop *);

extern int rtnl_route_nh_set_newdst(struct rtnl_nexthop *,
struct nl_addr *);
extern struct nl_addr * rtnl_route_nh_get_newdst(struct rtnl_nexthop *);
extern int rtnl_route_nh_set_via(struct rtnl_nexthop *,
struct nl_addr *);
extern struct nl_addr * rtnl_route_nh_get_via(struct rtnl_nexthop *);
extern char * rtnl_route_nh_flags2str(int, char *, size_t);
extern int rtnl_route_nh_str2flags(const char *);
extern int rtnl_route_nh_set_newdst(struct rtnl_nexthop *, struct nl_addr *);
extern struct nl_addr *rtnl_route_nh_get_newdst(struct rtnl_nexthop *);
extern int rtnl_route_nh_set_via(struct rtnl_nexthop *, struct nl_addr *);
extern struct nl_addr *rtnl_route_nh_get_via(struct rtnl_nexthop *);
extern int rtnl_route_nh_set_encap(struct rtnl_nexthop *,
struct rtnl_nh_encap *);
extern struct rtnl_nh_encap *rtnl_route_nh_get_encap(struct rtnl_nexthop *);
extern char *rtnl_route_nh_flags2str(int, char *, size_t);
extern int rtnl_route_nh_str2flags(const char *);

/*
* nexthop encapsulations
*/
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 *);
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_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 *);
extern int rtnl_nh_get_encap_mpls_ttl(struct rtnl_nh_encap *);

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 *);
#ifdef __cplusplus
}
#endif
Expand Down
5 changes: 5 additions & 0 deletions include/netlink/route/nh.h
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,11 @@ extern int rtnl_nh_set_res_group_unbalanced_timer(struct rtnl_nh *,
extern int rtnl_nh_get_res_group_unbalanced_timer(struct rtnl_nh *,
uint32_t *out_value);

/* lwtunnel encapsulation */
struct rtnl_nh_encap;
extern int rtnl_nh_set_encap(struct rtnl_nh *, struct rtnl_nh_encap *);
extern struct rtnl_nh_encap *rtnl_nh_get_encap(struct rtnl_nh *);

#ifdef __cplusplus
}
#endif
Expand Down
5 changes: 5 additions & 0 deletions include/nl-aux-route/nl-route.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
#include "base/nl-base-utils.h"

#include <netlink/route/action.h>
#include <netlink/route/nexthop.h>

struct rtnl_link;
void rtnl_link_put(struct rtnl_link *);
Expand Down Expand Up @@ -42,6 +43,10 @@ void rtnl_nh_put(struct rtnl_nh *);
#define _nl_auto_rtnl_nh _nl_auto(_nl_auto_rtnl_nh_fcn)
_NL_AUTO_DEFINE_FCN_TYPED0(struct rtnl_nh *, _nl_auto_rtnl_nh_fcn, rtnl_nh_put);

#define _nl_auto_rtnl_nh_encap _nl_auto(_nl_auto_rtnl_nh_encap_fcn)
_NL_AUTO_DEFINE_FCN_TYPED0(struct rtnl_nh_encap *, _nl_auto_rtnl_nh_encap_fcn,
rtnl_nh_encap_free);

struct rtnl_link_af_ops;
void rtnl_link_af_ops_put(struct rtnl_link_af_ops *);
#define _nl_auto_rtnl_link_af_ops _nl_auto(_nl_auto_rtnl_link_af_ops_fcn)
Expand Down
21 changes: 10 additions & 11 deletions lib/route/nexthop-encap.h
Original file line number Diff line number Diff line change
@@ -1,27 +1,26 @@
#ifndef NETLINK_NEXTHOP_ENCAP_H_
#define NETLINK_NEXTHOP_ENCAP_H_
#define NETLINK_NEXTHOP_ENCAP_H_

struct rtnl_nh_encap;

struct nh_encap_ops {
uint16_t encap_type;

int (*build_msg)(struct nl_msg *msg, void *priv);
int (*parse_msg)(struct nlattr *nla, struct rtnl_nexthop *rtnh);
int (*build_msg)(struct nl_msg *msg, void *priv);
int (*parse_msg)(struct nlattr *nla, struct rtnl_nh_encap **encap_out);

int (*compare)(void *a, void *b);
int (*compare)(void *a, void *b);
void *(*clone)(void *priv);

void (*dump)(void *priv, struct nl_dump_params *dp);
void (*destructor)(void *priv);
void (*dump)(void *priv, struct nl_dump_params *dp);
void (*destructor)(void *priv);
};

struct rtnl_nh_encap;

/*
* generic nexthop encap
*/
void nh_set_encap(struct rtnl_nexthop *nh, struct rtnl_nh_encap *rtnh_encap);

int nh_encap_parse_msg(struct nlattr *encap, struct nlattr *encap_type,
struct rtnl_nexthop *rtnh);
struct rtnl_nh_encap **encap_out);
int nh_encap_build_msg(struct nl_msg *msg, struct rtnl_nh_encap *rtnh_encap);

void nh_encap_dump(struct rtnl_nh_encap *rtnh_encap, struct nl_dump_params *dp);
Expand Down
Loading