summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPablo Neira Ayuso <pablo@gnumonks.org>2014-02-22 22:57:07 +0100
committerPablo Neira Ayuso <pablo@gnumonks.org>2014-02-22 23:09:38 +0100
commitb94023299febe814d847835c906cb619eae23202 (patch)
tree5901a62709a9cdab39f3a5ca17b538d280a599f2
parentefdbb3bc73924d215ebee820d5dc685a0df13ad0 (diff)
gtp-rtnl: refactor code to prepare the addition of gtp_dev_destroy
Add gtp_dev_talk() and gtp_put_nlmsg().
-rw-r--r--libgtnl/src/gtp-rtnl.c64
1 files changed, 40 insertions, 24 deletions
diff --git a/libgtnl/src/gtp-rtnl.c b/libgtnl/src/gtp-rtnl.c
index a48fa1c..72a2870 100644
--- a/libgtnl/src/gtp-rtnl.c
+++ b/libgtnl/src/gtp-rtnl.c
@@ -15,33 +15,24 @@
#include "internal.h"
-int gtp_dev_create(const char *ifname)
+static struct nlmsghdr *
+gtp_put_nlmsg(char *buf, uint16_t type, uint16_t nl_flags, uint32_t seq)
{
- struct mnl_socket *nl;
- char buf[MNL_SOCKET_BUFFER_SIZE];
struct nlmsghdr *nlh;
- struct ifinfomsg *ifm;
- int ret;
- unsigned int seq, portid;
- struct nlattr *nest, *nest2;
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_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;
+ nlh->nlmsg_type = type;
+ nlh->nlmsg_flags = NLM_F_REQUEST | nl_flags;
+ nlh->nlmsg_seq = seq;
- mnl_attr_put_u32(nlh, IFLA_LINK, if_nametoindex(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);
- mnl_attr_put_u32(nlh, IFLA_GTP_LOCAL_ADDR_IPV4, 0);
- mnl_attr_put_u32(nlh, IFLA_GTP_HASHSIZE, 131072);
- mnl_attr_nest_end(nlh, nest2);
- mnl_attr_nest_end(nlh, nest);
+ return nlh;
+}
+
+static int gtp_dev_talk(struct nlmsghdr *nlh, uint32_t seq)
+{
+ struct mnl_socket *nl;
+ char buf[MNL_SOCKET_BUFFER_SIZE];
+ int ret;
nl = mnl_socket_open(NETLINK_ROUTE);
if (nl == NULL) {
@@ -53,7 +44,6 @@ int gtp_dev_create(const char *ifname)
perror("mnl_socket_bind");
goto err;
}
- portid = mnl_socket_get_portid(nl);
mnl_nlmsg_fprintf(stdout, nlh, nlh->nlmsg_len,
sizeof(struct ifinfomsg));
@@ -69,7 +59,7 @@ int gtp_dev_create(const char *ifname)
goto err;
}
- ret = mnl_cb_run(buf, ret, seq, portid, NULL, NULL);
+ ret = mnl_cb_run(buf, ret, seq, mnl_socket_get_portid(nl), NULL, NULL);
if (ret == -1){
perror("callback");
goto err;
@@ -81,4 +71,30 @@ err:
mnl_socket_close(nl);
return -1;
}
+
+int gtp_dev_create(const char *ifname)
+{
+ char buf[MNL_SOCKET_BUFFER_SIZE];
+ struct nlmsghdr *nlh;
+ struct ifinfomsg *ifm;
+ unsigned int seq = time(NULL);
+ struct nlattr *nest, *nest2;
+
+ nlh = gtp_put_nlmsg(buf, RTM_NEWLINK, NLM_F_CREATE | 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));
+ 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_HASHSIZE, 131072);
+ mnl_attr_nest_end(nlh, nest2);
+ mnl_attr_nest_end(nlh, nest);
+
+ return gtp_dev_talk(nlh, seq);
+}
EXPORT_SYMBOL(gtp_dev_create);