libgtpnl: add flow id support

Add new attribute to the gtp tunnel object, this extension is required
by GTPv0 since the same flowid needs to be used for uplink and downlink
packet.
diff --git a/src/gtp-genl.c b/src/gtp-genl.c
index 43ffb30..c7a0522 100644
--- a/src/gtp-genl.c
+++ b/src/gtp-genl.c
@@ -19,15 +19,14 @@
 
 #include "internal.h"
 
-static void gtp_build_payload(struct nlmsghdr *nlh, uint64_t tid,
-			      uint32_t ifidx, uint32_t sgsn_addr,
-			      uint32_t ms_addr, uint32_t version)
+static void gtp_build_payload(struct nlmsghdr *nlh, struct gtp_tunnel *t)
 {
-	mnl_attr_put_u32(nlh, GTPA_VERSION, version);
-	mnl_attr_put_u32(nlh, GTPA_LINK, ifidx);
-	mnl_attr_put_u32(nlh, GTPA_SGSN_ADDRESS, sgsn_addr);
-	mnl_attr_put_u32(nlh, GTPA_MS_ADDRESS, ms_addr);
-	mnl_attr_put_u64(nlh, GTPA_TID, tid);
+	mnl_attr_put_u32(nlh, GTPA_VERSION, t->gtp_version);
+	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);
+	mnl_attr_put_u64(nlh, GTPA_TID, t->tid);
+	mnl_attr_put_u16(nlh, GTPA_FLOWID, t->flowid);
 }
 
 int gtp_add_tunnel(int genl_id, struct mnl_socket *nl, struct gtp_tunnel *t)
@@ -44,8 +43,7 @@
 
 	nlh = genl_nlmsg_build_hdr(buf, genl_id, NLM_F_EXCL | NLM_F_ACK, ++seq,
 				   GTP_CMD_TUNNEL_NEW);
-	gtp_build_payload(nlh, t->tid, t->ifidx, t->sgsn_addr.s_addr,
-			  t->ms_addr.s_addr, t->gtp_version);
+	gtp_build_payload(nlh, t);
 
 	if (genl_socket_talk(nl, nlh, seq, NULL, NULL) < 0)
 		perror("genl_socket_talk");
@@ -62,7 +60,7 @@
 
 	nlh = genl_nlmsg_build_hdr(buf, genl_id, NLM_F_ACK, ++seq,
 				   GTP_CMD_TUNNEL_DELETE);
-	gtp_build_payload(nlh, t->tid, t->ifidx, 0, 0, t->gtp_version);
+	gtp_build_payload(nlh, t);
 
 	if (genl_socket_talk(nl, nlh, seq, NULL, NULL) < 0)
 		perror("genl_socket_talk");
diff --git a/src/gtp.c b/src/gtp.c
index 9ec523f..1986954 100644
--- a/src/gtp.c
+++ b/src/gtp.c
@@ -47,6 +47,12 @@
 }
 EXPORT_SYMBOL(gtp_tunnel_set_tid);
 
+void gtp_tunnel_set_flowid(struct gtp_tunnel *t, uint16_t flowid)
+{
+	t->flowid = flowid;
+}
+EXPORT_SYMBOL(gtp_tunnel_set_flowid);
+
 const uint32_t gtp_tunnel_get_ifidx(struct gtp_tunnel *t)
 {
 	return t->ifidx;
@@ -76,3 +82,9 @@
 	return t->tid;
 }
 EXPORT_SYMBOL(gtp_tunnel_get_tid);
+
+uint16_t gtp_tunnel_get_flowid(struct gtp_tunnel *t)
+{
+	return t->flowid;
+}
+EXPORT_SYMBOL(gtp_tunnel_get_flowid);
diff --git a/src/internal.h b/src/internal.h
index cd2093a..75b3954 100644
--- a/src/internal.h
+++ b/src/internal.h
@@ -17,6 +17,7 @@
 	struct in_addr	ms_addr;
 	struct in_addr	sgsn_addr;
 	uint64_t	tid;
+	uint16_t	flowid;
 	int		gtp_version;
 };
 
diff --git a/src/libgtpnl.map b/src/libgtpnl.map
index 326bf17..2e80543 100644
--- a/src/libgtpnl.map
+++ b/src/libgtpnl.map
@@ -19,11 +19,13 @@
   gtp_tunnel_set_sgsn_ip4;
   gtp_tunnel_set_version;
   gtp_tunnel_set_tid;
+  gtp_tunnel_set_flowid;
   gtp_tunnel_get_ifidx;
   gtp_tunnel_get_ms_ip4;
   gtp_tunnel_get_sgsn_ip4;
   gtp_tunnel_get_version;
   gtp_tunnel_get_tid;
+  gtp_tunnel_get_flowid;
 
 local: *;
 };