@@ -8,6 +8,7 @@ struct gtp_tunnel;
struct gtp_tunnel *gtp_tunnel_alloc(void);
void gtp_tunnel_free(struct gtp_tunnel *t);
+void gtp_tunnel_set_ifns(struct gtp_tunnel *t, int ifns);
void gtp_tunnel_set_ifidx(struct gtp_tunnel *t, uint32_t ifidx);
void gtp_tunnel_set_ms_ip4(struct gtp_tunnel *t, struct in_addr *ms_addr);
void gtp_tunnel_set_sgsn_ip4(struct gtp_tunnel *t, struct in_addr *sgsn_addr);
@@ -15,6 +16,7 @@ void gtp_tunnel_set_version(struct gtp_tunnel *t, uint32_t version);
void gtp_tunnel_set_tid(struct gtp_tunnel *t, uint64_t tid);
void gtp_tunnel_set_flowid(struct gtp_tunnel *t, uint16_t flowid);
+const int gtp_tunnel_get_ifns(struct gtp_tunnel *t);
const uint32_t gtp_tunnel_get_ifidx(struct gtp_tunnel *t);
const struct in_addr *gtp_tunnel_get_ms_ip4(struct gtp_tunnel *t);
const struct in_addr *gtp_tunnel_get_sgsn_ip4(struct gtp_tunnel *t);
@@ -16,7 +16,7 @@ int genl_lookup_family(struct mnl_socket *nl, const char *family);
struct in_addr;
-int gtp_dev_create(const char *gtp_ifname, const char *real_ifname,
+int gtp_dev_create(int dest_ns, const char *gtp_ifname, const char *real_ifname,
int fd0, int fd1);
int gtp_dev_config(const char *iface, struct in_addr *net, uint32_t prefix);
int gtp_dev_destroy(const char *gtp_ifname);
@@ -40,6 +40,7 @@ enum gtp_attrs {
GTPA_SGSN_ADDRESS,
GTPA_MS_ADDRESS,
GTPA_FLOWID, /* only for GTPv0 */
+ GTPA_NET_NS_FD,
__GTPA_MAX,
};
#define GTPA_MAX (__GTPA_MAX + 1)
@@ -44,6 +44,8 @@
static void gtp_build_payload(struct nlmsghdr *nlh, struct gtp_tunnel *t)
{
mnl_attr_put_u32(nlh, GTPA_VERSION, t->gtp_version);
+ if (t->ifns >= 0)
+ mnl_attr_put_u32(nlh, GTPA_NET_NS_FD, t->ifns);
mnl_attr_put_u32(nlh, GTPA_LINK, t->ifidx);
mnl_attr_put_u32(nlh, GTPA_SGSN_ADDRESS, t->sgsn_addr.s_addr);
mnl_attr_put_u32(nlh, GTPA_MS_ADDRESS, t->ms_addr.s_addr);
@@ -104,7 +104,7 @@ static int gtp_dev_talk(struct nlmsghdr *nlh, uint32_t seq)
return ret;
}
-int gtp_dev_create(const char *gtp_ifname, const char *real_ifname,
+int gtp_dev_create(int dest_ns, const char *gtp_ifname, const char *real_ifname,
int fd0, int fd1)
{
char buf[MNL_SOCKET_BUFFER_SIZE];
@@ -120,6 +120,8 @@ int gtp_dev_create(const char *gtp_ifname, const char *real_ifname,
ifm->ifi_change |= IFF_UP;
ifm->ifi_flags |= IFF_UP;
+ if (dest_ns >= 0)
+ mnl_attr_put_u32(nlh, IFLA_NET_NS_FD, dest_ns);
mnl_attr_put_u32(nlh, IFLA_LINK, if_nametoindex(real_ifname));
mnl_attr_put_str(nlh, IFLA_IFNAME, gtp_ifname);
nest = mnl_attr_nest_start(nlh, IFLA_LINKINFO);
@@ -39,6 +39,12 @@ void gtp_tunnel_free(struct gtp_tunnel *t)
}
EXPORT_SYMBOL(gtp_tunnel_free);
+void gtp_tunnel_set_ifns(struct gtp_tunnel *t, int ifns)
+{
+ t->ifns = ifns;
+}
+EXPORT_SYMBOL(gtp_tunnel_set_ifns);
+
void gtp_tunnel_set_ifidx(struct gtp_tunnel *t, uint32_t ifidx)
{
t->ifidx = ifidx;
@@ -75,6 +81,12 @@ void gtp_tunnel_set_flowid(struct gtp_tunnel *t, uint16_t flowid)
}
EXPORT_SYMBOL(gtp_tunnel_set_flowid);
+const int gtp_tunnel_get_ifns(struct gtp_tunnel *t)
+{
+ return t->ifns;
+}
+EXPORT_SYMBOL(gtp_tunnel_get_ifns);
+
const uint32_t gtp_tunnel_get_ifidx(struct gtp_tunnel *t)
{
return t->ifidx;
@@ -13,6 +13,7 @@
#include <netinet/in.h>
struct gtp_tunnel {
+ int ifns;
uint32_t ifidx;
struct in_addr ms_addr;
struct in_addr sgsn_addr;
@@ -15,12 +15,14 @@ global:
gtp_tunnel_alloc;
gtp_tunnel_free;
+ gtp_tunnel_set_ifns;
gtp_tunnel_set_ifidx;
gtp_tunnel_set_ms_ip4;
gtp_tunnel_set_sgsn_ip4;
gtp_tunnel_set_version;
gtp_tunnel_set_tid;
gtp_tunnel_set_flowid;
+ gtp_tunnel_get_ifns;
gtp_tunnel_get_ifidx;
gtp_tunnel_get_ms_ip4;
gtp_tunnel_get_sgsn_ip4;
Signed-off-by: Andreas Schultz <aschultz@tpip.net> --- libgtnl/include/libgtpnl/gtp.h | 2 ++ libgtnl/include/libgtpnl/gtpnl.h | 2 +- libgtnl/include/linux/gtp_nl.h | 1 + libgtnl/src/gtp-genl.c | 2 ++ libgtnl/src/gtp-rtnl.c | 4 +++- libgtnl/src/gtp.c | 12 ++++++++++++ libgtnl/src/internal.h | 1 + libgtnl/src/libgtpnl.map | 2 ++ 8 files changed, 24 insertions(+), 2 deletions(-)