From e3c5918aeea8639c8c9a36047fd078ddc4eab4ef Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Wed, 8 Nov 2017 14:08:24 +0900 Subject: gtp_kernel: Change gtp_kernel_init() function signature Rather than taking an explicit in_addr, prefix_length and a string-formatted prefix, let's pass in an in46_prefix and derive the other representations from it. Also, don't refer to a no-longer-existing global 'ipup' variable but add it as a function argument. Change-Id: Ife87142c86589b4fa4062d62afe3670467548589 --- ggsn/gtp-kernel.c | 17 ++++++++++++++--- ggsn/gtp-kernel.h | 6 ++---- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/ggsn/gtp-kernel.c b/ggsn/gtp-kernel.c index 916b92f..a5708fc 100644 --- a/ggsn/gtp-kernel.c +++ b/ggsn/gtp-kernel.c @@ -57,9 +57,18 @@ static struct { /* Always forces the kernel to allocate gtp0. If it exists it hits EEXIST */ #define GTP_DEVNAME "gtp0" -int gtp_kernel_init(struct gsn_t *gsn, struct in_addr *net, - size_t prefixlen, const char *net_arg) +int gtp_kernel_init(struct gsn_t *gsn, struct in46_prefix *prefix, const char *ipup) { + struct in_addr net; + const char *net_arg; + + if (prefix->addr.len != 4) { + SYS_ERR(DGGSN, LOGL_ERROR, 0, + "we only support IPv4 in this path :/"); + return -1; + } + net = prefix->addr.v4; + if (gtp_dev_create(-1, GTP_DEVNAME, gsn->fd0, gsn->fd1u) < 0) { SYS_ERR(DGGSN, LOGL_ERROR, 0, "cannot create GTP tunnel device: %s\n", @@ -83,10 +92,12 @@ int gtp_kernel_init(struct gsn_t *gsn, struct in_addr *net, SYS_ERR(DGGSN, LOGL_DEBUG, 0, "Using the GTP kernel mode (genl ID is %d)\n", gtp_nl.genl_id); + net_arg = in46p_ntoa(prefix); + DEBUGP(DGGSN, "Setting route to reach %s via %s\n", net_arg, GTP_DEVNAME); - if (gtp_dev_config(GTP_DEVNAME, net, prefixlen) < 0) { + if (gtp_dev_config(GTP_DEVNAME, &net, prefix->prefixlen) < 0) { SYS_ERR(DGGSN, LOGL_ERROR, 0, "Cannot add route to reach network %s\n", net_arg); diff --git a/ggsn/gtp-kernel.h b/ggsn/gtp-kernel.h index 34fd7bf..ce57994 100644 --- a/ggsn/gtp-kernel.h +++ b/ggsn/gtp-kernel.h @@ -7,8 +7,7 @@ extern int debug; extern char *ipup; #ifdef GTP_KERNEL -int gtp_kernel_init(struct gsn_t *gsn, struct in_addr *net, - size_t prefixlen, const char *net_arg); +int gtp_kernel_init(struct gsn_t *gsn, struct in46_prefix *prefix, const char *ipup); void gtp_kernel_stop(void); int gtp_kernel_tunnel_add(struct pdp_t *pdp); @@ -17,8 +16,7 @@ int gtp_kernel_tunnel_del(struct pdp_t *pdp); int gtp_kernel_enabled(void); #else -static inline int gtp_kernel_init(struct gsn_t *gsn, struct in_addr *net, - size_t prefixlen, const char *net_arg) +static inline int gtp_kernel_init(struct gsn_t *gsn, struct in46_prefix *prefix, const char *ipup) { SYS_ERR(DGGSN, LOGL_ERROR, 0, "ggsn compiled without GTP kernel support!\n"); return -1; -- cgit v1.2.3