diff --git a/libgtnl/include/libgtpnl/gtpnl.h b/libgtnl/include/libgtpnl/gtpnl.h index 74fb8cf..e27dec4 100644 --- a/libgtnl/include/libgtpnl/gtpnl.h +++ b/libgtnl/include/libgtpnl/gtpnl.h @@ -14,8 +14,9 @@ int genl_socket_talk(struct mnl_socket *nl, struct nlmsghdr *nlh, uint32_t seq, void *data); int genl_lookup_family(struct mnl_socket *nl, const char *family); -int gtp_dev_create(const char *ifname, int fd0, int fd1); -int gtp_dev_destroy(const char *ifname); +int gtp_dev_create(const char *gtp_ifname, const char *real_ifname, + int fd0, int fd1); +int gtp_dev_destroy(const char *gtp_ifname); struct gtp_tunnel; diff --git a/libgtnl/src/gtp-rtnl.c b/libgtnl/src/gtp-rtnl.c index d5af6fc..519cacb 100644 --- a/libgtnl/src/gtp-rtnl.c +++ b/libgtnl/src/gtp-rtnl.c @@ -72,7 +72,8 @@ err: return -1; } -int gtp_dev_create(const char *ifname, int fd0, int fd1) +int gtp_dev_create(const char *gtp_ifname, const char *real_ifname, + int fd0, int fd1) { char buf[MNL_SOCKET_BUFFER_SIZE]; struct nlmsghdr *nlh; @@ -80,13 +81,15 @@ int gtp_dev_create(const char *ifname, int fd0, int fd1) unsigned int seq = time(NULL); struct nlattr *nest, *nest2; - nlh = gtp_put_nlmsg(buf, RTM_NEWLINK, NLM_F_CREATE | NLM_F_ACK, seq); + nlh = gtp_put_nlmsg(buf, RTM_NEWLINK, + NLM_F_CREATE | NLM_F_EXCL | NLM_F_ACK, seq); ifm = mnl_nlmsg_put_extra_header(nlh, sizeof(*ifm)); ifm->ifi_family = AF_INET; ifm->ifi_change |= IFF_UP; ifm->ifi_flags |= IFF_UP; - mnl_attr_put_u32(nlh, IFLA_LINK, if_nametoindex(ifname)); + 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); mnl_attr_put_str(nlh, IFLA_INFO_KIND, "gtp"); nest2 = mnl_attr_nest_start(nlh, IFLA_INFO_DATA); @@ -100,7 +103,7 @@ int gtp_dev_create(const char *ifname, int fd0, int fd1) } EXPORT_SYMBOL(gtp_dev_create); -int gtp_dev_destroy(const char *ifname) +int gtp_dev_destroy(const char *gtp_ifname) { char buf[MNL_SOCKET_BUFFER_SIZE]; struct nlmsghdr *nlh; @@ -112,7 +115,7 @@ int gtp_dev_destroy(const char *ifname) ifm->ifi_family = AF_INET; ifm->ifi_change |= IFF_UP; ifm->ifi_flags &= ~IFF_UP; - ifm->ifi_index = if_nametoindex(ifname); + ifm->ifi_index = if_nametoindex(gtp_ifname); return gtp_dev_talk(nlh, seq); } diff --git a/libgtnl/tools/gtp-link-add.c b/libgtnl/tools/gtp-link-add.c index c9c50c8..0038b9e 100644 --- a/libgtnl/tools/gtp-link-add.c +++ b/libgtnl/tools/gtp-link-add.c @@ -28,18 +28,25 @@ int main(int argc, char *argv[]) nlh = mnl_nlmsg_put_header(buf); nlh->nlmsg_type = RTM_NEWLINK; - nlh->nlmsg_flags = NLM_F_REQUEST | NLM_F_CREATE | NLM_F_ACK; + nlh->nlmsg_flags = NLM_F_REQUEST | NLM_F_CREATE | NLM_F_EXCL |NLM_F_ACK; nlh->nlmsg_seq = seq = time(NULL); ifm = mnl_nlmsg_put_extra_header(nlh, sizeof(*ifm)); ifm->ifi_family = AF_INET; ifm->ifi_change |= IFF_UP; ifm->ifi_flags |= IFF_UP; + fprintf(stderr, "WARNING: attaching dummy socket descriptors. Use " + "this command for testing purposes only.\n"): + int fd1 = socket(AF_INET, SOCK_DGRAM, 0); + int fd2 = socket(AF_INET, SOCK_DGRAM, 0); + mnl_attr_put_u32(nlh, IFLA_LINK, if_nametoindex(argv[1])); + mnl_attr_put_str(nlh, IFLA_IFNAME, "gtp0"); nest = mnl_attr_nest_start(nlh, IFLA_LINKINFO); mnl_attr_put_str(nlh, IFLA_INFO_KIND, "gtp"); nest2 = mnl_attr_nest_start(nlh, IFLA_INFO_DATA); - mnl_attr_put_u32(nlh, IFLA_GTP_LOCAL_ADDR_IPV4, 0); + mnl_attr_put_u32(nlh, IFLA_GTP_FD0, fd1); + mnl_attr_put_u32(nlh, IFLA_GTP_FD1, fd2); mnl_attr_put_u32(nlh, IFLA_GTP_HASHSIZE, 131072); mnl_attr_nest_end(nlh, nest2); mnl_attr_nest_end(nlh, nest);