Skip to content

Commit

Permalink
ip6tnl: introduce ip6 tunnel support
Browse files Browse the repository at this point in the history
This patch adds support for ip6 tunnel that works with
the ip6_tunnel kernel module.

Signed-off-by: Susant Sahani <susant@redhat.com>
Signed-off-by: Thomas Haller <thaller@redhat.com>
  • Loading branch information
Susant Sahani authored and thom311 committed Jun 16, 2014
1 parent cfc57ce commit 11f9cc0
Show file tree
Hide file tree
Showing 8 changed files with 863 additions and 1 deletion.
59 changes: 59 additions & 0 deletions doc/route.txt
Expand Up @@ -1140,6 +1140,65 @@ if((err = rtnl_link_add(sk, link, NLM_F_CREATE)) < 0)
rtnl_link_put(link);
-----

[[link_ip6tnl]]
==== IP6TNL

[source,c]
-----
extern struct rtnl_link *rtnl_link_ip6_tnl_alloc(void);
extern int rtnl_link_ip6_tnl_add(struct nl_sock *sk, const char *name);

extern int rtnl_link_ip6_tnl_set_link(struct rtnl_link *link, uint32_t index);
extern uint32_t rtnl_link_ip6_tnl_get_link(struct rtnl_link *link);

extern int rtnl_link_ip6_tnl_set_local(struct rtnl_link *link, struct in6_addr *);
extern int rtnl_link_ip6_tnl_get_local(struct rtnl_link *link, struct in6_addr *);

extern int rtnl_link_ip6_tnl_set_remote(struct rtnl_link *link, struct in6_addr *);
extern int rtnl_link_ip6_tnl_get_remote(struct rtnl_link *link, struct in6_addr *);

extern int rtnl_link_ip6_tnl_set_ttl(struct rtnl_link *link, uint8_t ttl);
extern uint8_t rtnl_link_ip6_tnl_get_ttl(struct rtnl_link *link);

extern int rtnl_link_ip6_tnl_set_tos(struct rtnl_link *link, uint8_t tos);
extern uint8_t rtnl_link_ip6_tnl_get_tos(struct rtnl_link *link);

extern int rtnl_link_ip6_tnl_set_encaplimit(struct rtnl_link *link, uint8_t encap_limit);
extern uint8_t rtnl_link_ip6_tnl_get_encaplimit(struct rtnl_link *link);

extern int rtnl_link_ip6_tnl_set_flags(struct rtnl_link *link, uint32_t flags);
extern uint32_t rtnl_link_ip6_tnl_get_flags(struct rtnl_link *link);

extern uint32_t rtnl_link_ip6_tnl_get_flowinfo(struct rtnl_link *link);
extern int rtnl_link_ip6_tnl_set_flowinfo(struct rtnl_link *link, uint32_t flowinfo);

extern int rtnl_link_ip6_tnl_set_proto(struct rtnl_link *link, uint8_t proto);
extern uint8_t rtnl_link_ip6_tnl_get_proto(struct rtnl_link *link);

-----

.Example: Add a ip6tnl tunnel device
[source,c]
-----
struct rtnl_link *link
struct in6_addr addr

link = rtnl_link_ip6_tnl_alloc();

rtnl_link_set_name(link, "ip6tnl-tun");
rtnl_link_ip6_tnl_set_link(link, if_index);

inet_pton(AF_INET6, "2607:f0d0:1002:51::4", &addr);
rtnl_link_ip6_tnl_set_local(link, &addr);

inet_pton(AF_INET6, "2607:f0d0:1002:52::5", &addr);
rtnl_link_ip6_tnl_set_remote(link, &addr);

rtnl_link_add(sk, link, NLM_F_CREATE);
rtnl_link_put(link);

-----


== Neighbouring

Expand Down
1 change: 1 addition & 0 deletions include/Makefile.am
Expand Up @@ -53,6 +53,7 @@ nobase_libnlinclude_HEADERS = \
netlink/route/link/vlan.h \
netlink/route/link/vxlan.h \
netlink/route/link/veth.h \
netlink/route/link/ip6tnl.h
netlink/route/link/ipgre.h \
netlink/route/link/ipip.h \
netlink/route/link/ipvti.h \
Expand Down
56 changes: 56 additions & 0 deletions include/netlink/route/link/ip6tnl.h
@@ -0,0 +1,56 @@
/*
* netlink/route/link/ip6tnl.h IP6TNL interface
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation version 2.1
* of the License.
*
* Copyright (c) 2014 Susant Sahani <susant@redhat.com>
*/

#ifndef NETLINK_LINK_IP6TNL_H_
#define NETLINK_LINK_IP6TNL_H_

#include <netlink/netlink.h>
#include <netlink/route/link.h>

#ifdef __cplusplus
extern "C" {
#endif

extern struct rtnl_link *rtnl_link_ip6_tnl_alloc(void);
extern int rtnl_link_ip6_tnl_add(struct nl_sock *sk, const char *name);

extern int rtnl_link_ip6_tnl_set_link(struct rtnl_link *link, uint32_t index);
extern uint32_t rtnl_link_ip6_tnl_get_link(struct rtnl_link *link);

extern int rtnl_link_ip6_tnl_set_local(struct rtnl_link *link, struct in6_addr *);
extern int rtnl_link_ip6_tnl_get_local(struct rtnl_link *link, struct in6_addr *addr);

extern int rtnl_link_ip6_tnl_set_remote(struct rtnl_link *link, struct in6_addr *);
extern int rtnl_link_ip6_tnl_get_remote(struct rtnl_link *link, struct in6_addr *);

extern int rtnl_link_ip6_tnl_set_ttl(struct rtnl_link *link, uint8_t ttl);
extern uint8_t rtnl_link_ip6_tnl_get_ttl(struct rtnl_link *link);

extern int rtnl_link_ip6_tnl_set_tos(struct rtnl_link *link, uint8_t tos);
extern uint8_t rtnl_link_ip6_tnl_get_tos(struct rtnl_link *link);

extern int rtnl_link_ip6_tnl_set_encaplimit(struct rtnl_link *link, uint8_t encap_limit);
extern uint8_t rtnl_link_ip6_tnl_get_encaplimit(struct rtnl_link *link);

extern int rtnl_link_ip6_tnl_set_flags(struct rtnl_link *link, uint32_t flags);
extern uint32_t rtnl_link_ip6_tnl_get_flags(struct rtnl_link *link);

extern uint32_t rtnl_link_ip6_tnl_get_flowinfo(struct rtnl_link *link);
extern int rtnl_link_ip6_tnl_set_flowinfo(struct rtnl_link *link, uint32_t flowinfo);

extern int rtnl_link_ip6_tnl_set_proto(struct rtnl_link *link, uint8_t proto);
extern uint8_t rtnl_link_ip6_tnl_get_proto(struct rtnl_link *link);

#ifdef _cplusplus
}
#endif

#endif
3 changes: 2 additions & 1 deletion lib/Makefile.am
Expand Up @@ -79,7 +79,8 @@ libnl_route_3_la_SOURCES = \
route/link/bridge.c route/link/inet6.c route/link/inet.c \
route/link/bonding.c route/link/can.c route/link/macvlan.c \
route/link/vxlan.c route/link/veth.c route/link/ipip.c \
route/link/ipgre.c route/link/sit.c route/link/ipvti.c\
route/link/ipgre.c route/link/sit.c route/link/ipvti.c \
route/link/ip6tnl.c \
\
route/qdisc/blackhole.c route/qdisc/cbq.c route/qdisc/dsmark.c \
route/qdisc/fifo.c route/qdisc/htb.c route/qdisc/netem.c \
Expand Down

0 comments on commit 11f9cc0

Please sign in to comment.