diff options
author | Pablo Neira Ayuso <pablo@gnumonks.org> | 2014-02-22 22:57:07 +0100 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@gnumonks.org> | 2014-02-22 23:09:38 +0100 |
commit | b94023299febe814d847835c906cb619eae23202 (patch) | |
tree | 5901a62709a9cdab39f3a5ca17b538d280a599f2 | |
parent | efdbb3bc73924d215ebee820d5dc685a0df13ad0 (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.c | 64 |
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); |