diff --git a/libgtnl/include/libgtpnl/Makefile.am b/libgtnl/include/libgtpnl/Makefile.am index b1c2bee..b12e9a3 100644 --- a/libgtnl/include/libgtpnl/Makefile.am +++ b/libgtnl/include/libgtpnl/Makefile.am @@ -1 +1 @@ -pkginclude_HEADERS = gtpnl.h +pkginclude_HEADERS = gtp.h gtpnl.h diff --git a/libgtnl/include/libgtpnl/gtp.h b/libgtnl/include/libgtpnl/gtp.h new file mode 100644 index 0000000..8239335 --- /dev/null +++ b/libgtnl/include/libgtpnl/gtp.h @@ -0,0 +1,23 @@ +#ifndef _LIBGTP_H_ +#define _LIBGTP_H_ + +#include + +struct gtp_tunnel; + +struct gtp_tunnel *gtp_tunnel_alloc(void); +void gtp_tunnel_free(struct gtp_tunnel *t); + +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); +void gtp_tunnel_set_version(struct gtp_tunnel *t, uint32_t version); +void gtp_tunnel_set_tid(struct gtp_tunnel *t, uint64_t tid); + +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); +int gtp_tunnel_get_version(struct gtp_tunnel *t); +uint64_t gtp_tunnel_get_tid(struct gtp_tunnel *t); + +#endif diff --git a/libgtnl/include/libgtpnl/gtpnl.h b/libgtnl/include/libgtpnl/gtpnl.h index 00a60d8..1685a17 100644 --- a/libgtnl/include/libgtpnl/gtpnl.h +++ b/libgtnl/include/libgtpnl/gtpnl.h @@ -16,11 +16,10 @@ int genl_lookup_family(struct mnl_socket *nl, const char *family); int gtp_dev_create(const char *ifname); -int gtp_add_tunnel(int genl_id, struct mnl_socket *nl, const char *ifname, - const char *ms_addr, const char *sgsn_addr, uint64_t tid, - int gtp_version); -int gtp_del_tunnel(int genl_id, struct mnl_socket *nl, const char *ifname, - uint64_t tid, uint32_t gtp_version); +struct gtp_tunnel; + +int gtp_add_tunnel(int genl_id, struct mnl_socket *nl, struct gtp_tunnel *t); +int gtp_del_tunnel(int genl_id, struct mnl_socket *nl, struct gtp_tunnel *t); int gtp_list_tunnel(int genl_id, struct mnl_socket *nl); #endif diff --git a/libgtnl/src/Makefile.am b/libgtnl/src/Makefile.am index a9b072f..f4d8d6c 100644 --- a/libgtnl/src/Makefile.am +++ b/libgtnl/src/Makefile.am @@ -2,4 +2,8 @@ include $(top_srcdir)/Make_global.am lib_LTLIBRARIES = libgtpnl.la libgtpnl_la_LDFLAGS = -Wl,--version-script=$(srcdir)/libgtpnl.map -version-info $(LIBVERSION) -libgtpnl_la_SOURCES = genl.c gtp-genl.c gtp-rtnl.c libgtpnl.map +libgtpnl_la_SOURCES = genl.c \ + gtp-genl.c \ + gtp-rtnl.c \ + gtp.c \ + libgtpnl.map diff --git a/libgtnl/src/gtp-genl.c b/libgtnl/src/gtp-genl.c index 0dd5473..4891b08 100644 --- a/libgtnl/src/gtp-genl.c +++ b/libgtnl/src/gtp-genl.c @@ -11,6 +11,7 @@ #include #include +#include #include #include @@ -29,42 +30,22 @@ static void gtp_build_payload(struct nlmsghdr *nlh, uint64_t tid, mnl_attr_put_u64(nlh, GTPA_TID, tid); } -int gtp_add_tunnel(int genl_id, struct mnl_socket *nl, const char *ifname, - const char *ms_addr, const char *sgsn_addr, uint64_t tid, - int gtp_version) +int gtp_add_tunnel(int genl_id, struct mnl_socket *nl, struct gtp_tunnel *t) { - uint32_t gtp_ifidx; - struct in_addr ms, sgsn; struct nlmsghdr *nlh; char buf[MNL_SOCKET_BUFFER_SIZE]; uint32_t seq = time(NULL); - gtp_ifidx = if_nametoindex(ifname); - if (gtp_ifidx == 0){ - fprintf(stderr, "wrong GTP interface %s\n", ifname); - return -1; - } - - if (inet_aton(ms_addr, &ms) < 0) { - perror("bad address for ms"); - return -1; - } - - if (inet_aton(sgsn_addr, &sgsn) < 0) { - perror("bad address for sgsn"); - return -1; - } - - if (gtp_version > GTP_V1) { + if (t->gtp_version > GTP_V1) { fprintf(stderr, "wrong GTP version %u, use v0 or v1\n", - gtp_version); + t->gtp_version); return -1; } nlh = genl_nlmsg_build_hdr(buf, genl_id, NLM_F_EXCL | NLM_F_ACK, ++seq, GTP_CMD_TUNNEL_NEW); - gtp_build_payload(nlh, tid, gtp_ifidx, sgsn.s_addr, - ms.s_addr, gtp_version); + gtp_build_payload(nlh, t->tid, t->ifidx, t->sgsn_addr.s_addr, + t->ms_addr.s_addr, t->gtp_version); if (genl_socket_talk(nl, nlh, seq, NULL, NULL) < 0) perror("genl_socket_talk"); @@ -73,19 +54,15 @@ int gtp_add_tunnel(int genl_id, struct mnl_socket *nl, const char *ifname, } EXPORT_SYMBOL(gtp_add_tunnel); -int gtp_del_tunnel(int genl_id, struct mnl_socket *nl, const char *ifname, - uint64_t tid, uint32_t gtp_version) +int gtp_del_tunnel(int genl_id, struct mnl_socket *nl, struct gtp_tunnel *t) { - uint32_t gtp_ifidx; char buf[MNL_SOCKET_BUFFER_SIZE]; struct nlmsghdr *nlh; uint32_t seq = time(NULL); - gtp_ifidx = if_nametoindex(ifname); - nlh = genl_nlmsg_build_hdr(buf, genl_id, NLM_F_ACK, ++seq, GTP_CMD_TUNNEL_DELETE); - gtp_build_payload(nlh, tid, gtp_ifidx, 0, 0, gtp_version); + gtp_build_payload(nlh, t->tid, t->ifidx, 0, 0, t->gtp_version); if (genl_socket_talk(nl, nlh, seq, NULL, NULL) < 0) perror("genl_socket_talk"); diff --git a/libgtnl/src/gtp.c b/libgtnl/src/gtp.c new file mode 100644 index 0000000..9ec523f --- /dev/null +++ b/libgtnl/src/gtp.c @@ -0,0 +1,78 @@ +#include +#include + +#include + +#include "internal.h" + +struct gtp_tunnel *gtp_tunnel_alloc(void) +{ + return calloc(1, sizeof(struct gtp_tunnel)); +} +EXPORT_SYMBOL(gtp_tunnel_alloc); + +void gtp_tunnel_free(struct gtp_tunnel *t) +{ + free(t); +} +EXPORT_SYMBOL(gtp_tunnel_free); + +void gtp_tunnel_set_ifidx(struct gtp_tunnel *t, uint32_t ifidx) +{ + t->ifidx = ifidx; +} +EXPORT_SYMBOL(gtp_tunnel_set_ifidx); + +void gtp_tunnel_set_ms_ip4(struct gtp_tunnel *t, struct in_addr *ms_addr) +{ + t->ms_addr = *ms_addr; +} +EXPORT_SYMBOL(gtp_tunnel_set_ms_ip4); + +void gtp_tunnel_set_sgsn_ip4(struct gtp_tunnel *t, struct in_addr *sgsn_addr) +{ + t->sgsn_addr = *sgsn_addr; +} +EXPORT_SYMBOL(gtp_tunnel_set_sgsn_ip4); + +void gtp_tunnel_set_version(struct gtp_tunnel *t, uint32_t version) +{ + t->gtp_version = version; +} +EXPORT_SYMBOL(gtp_tunnel_set_version); + +void gtp_tunnel_set_tid(struct gtp_tunnel *t, uint64_t tid) +{ + t->tid = tid; +} +EXPORT_SYMBOL(gtp_tunnel_set_tid); + +const uint32_t gtp_tunnel_get_ifidx(struct gtp_tunnel *t) +{ + return t->ifidx; +} +EXPORT_SYMBOL(gtp_tunnel_get_ifidx); + +const struct in_addr *gtp_tunnel_get_ms_ip4(struct gtp_tunnel *t) +{ + return &t->ms_addr; +} +EXPORT_SYMBOL(gtp_tunnel_get_ms_ip4); + +const struct in_addr *gtp_tunnel_get_sgsn_ip4(struct gtp_tunnel *t) +{ + return &t->sgsn_addr; +} +EXPORT_SYMBOL(gtp_tunnel_get_sgsn_ip4); + +int gtp_tunnel_get_version(struct gtp_tunnel *t) +{ + return t->gtp_version; +} +EXPORT_SYMBOL(gtp_tunnel_get_version); + +uint64_t gtp_tunnel_get_tid(struct gtp_tunnel *t) +{ + return t->tid; +} +EXPORT_SYMBOL(gtp_tunnel_get_tid); diff --git a/libgtnl/src/internal.h b/libgtnl/src/internal.h index 3a88d1a..cd2093a 100644 --- a/libgtnl/src/internal.h +++ b/libgtnl/src/internal.h @@ -9,4 +9,15 @@ # define EXPORT_SYMBOL #endif +#include +#include + +struct gtp_tunnel { + uint32_t ifidx; + struct in_addr ms_addr; + struct in_addr sgsn_addr; + uint64_t tid; + int gtp_version; +}; + #endif diff --git a/libgtnl/src/libgtpnl.map b/libgtnl/src/libgtpnl.map index ead02e0..b38785c 100644 --- a/libgtnl/src/libgtpnl.map +++ b/libgtnl/src/libgtpnl.map @@ -9,5 +9,18 @@ global: gtp_del_tunnel; gtp_list_tunnel; + gtp_tunnel_alloc; + gtp_tunnel_free; + gtp_tunnel_set_ifidx; + gtp_tunnel_set_ms_ip4; + gtp_tunnel_set_sgsn_ip4; + gtp_tunnel_set_version; + gtp_tunnel_set_tid; + gtp_tunnel_get_ifidx; + gtp_tunnel_get_ms_ip4; + gtp_tunnel_get_sgsn_ip4; + gtp_tunnel_get_version; + gtp_tunnel_get_tid; + local: *; };