[OpenWrt-Devel] [PATCH] netifd: IPIP tunnel support
Steven Barth
cyrus at openwrt.org
Wed Oct 1 08:59:04 EDT 2014
Hello Hans,
thanks for the patch. However can't you rather reuse some of the code
provided by the "sit" tunnel-type of system_add_ip_tunnel? The current
patch looks like duplicating a lot of that.
Cheers,
Steven
Am 01.10.2014 um 13:41 schrieb Hans Dedecker:
> Adds IPIP tunnel support to netifd.
> Following IPIP tunnel parameters can be configured :
> -peeraddr (IPv4 remote address)
> -ipaddr (IPv4 local address)
> -mtu (IPIP tunnel mtu)
> -ttl (time to live of encapsulting packets)
> -tos (type of service either inherit (outer header inherits the value of the inner header) or hex value)
> -df (don't fragment flag of encapsulating packets)
> -tunlink (bind tunnel to this interface)
>
> Signed-off-by: Hans Dedecker <dedeckeh at gmail.com>
> ---
> system-linux.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++---
> 1 file changed, 62 insertions(+), 3 deletions(-)
>
> diff --git a/system-linux.c b/system-linux.c
> index aca30ca..36657d7 100644
> --- a/system-linux.c
> +++ b/system-linux.c
> @@ -204,6 +204,18 @@ system_rtn_aton(const char *src, unsigned int *dst)
> return true;
> }
>
> +static bool
> +system_tos_aton(const char *src, unsigned *dst)
> +{
> + char *e;
> +
> + *dst = strtoul(src, &e, 16);
> + if (e == src || *e || *dst > 255)
> + return false;
> +
> + return true;
> +}
> +
> int system_init(void)
> {
> static struct event_socket rtnl_event;
> @@ -1709,13 +1721,12 @@ static int system_add_gre_tunnel(const char *name, const char *kind,
> char *str = blobmsg_get_string(cur);
> if (strcmp(str, "inherit")) {
> unsigned uval;
> - char *e;
>
> - uval = strtoul(str, &e, 16);
> - if (e == str || *e || uval > 255) {
> + if (!system_tos_aton(str, &uval)) {
> ret = -EINVAL;
> goto failure;
> }
> +
> if (v6)
> flowinfo |= htonl(uval << 20) & IP6_FLOWINFO_TCLASS;
> else
> @@ -1842,6 +1853,52 @@ failure:
> }
> #endif
>
> +static int system_add_ipip_tunnel(const char *name, const unsigned int link, struct blob_attr **tb)
> +{
> + struct blob_attr *cur;
> + bool set_df = true;
> + struct ip_tunnel_parm p = {
> + .link = link,
> + .iph = {
> + .version = 4,
> + .ihl = 5,
> + .protocol = IPPROTO_IPIP,
> + }
> + };
> +
> + if ((cur = tb[TUNNEL_ATTR_LOCAL]) &&
> + inet_pton(AF_INET, blobmsg_data(cur), &p.iph.saddr) < 1)
> + return -EINVAL;
> +
> + if ((cur = tb[TUNNEL_ATTR_REMOTE]) &&
> + inet_pton(AF_INET, blobmsg_data(cur), &p.iph.daddr) < 1)
> + return -EINVAL;
> +
> + if ((cur = tb[TUNNEL_ATTR_DF]))
> + set_df = blobmsg_get_bool(cur);
> +
> + if ((cur = tb[TUNNEL_ATTR_TTL]))
> + p.iph.ttl = blobmsg_get_u32(cur);
> +
> + if ((cur = tb[TUNNEL_ATTR_TOS])) {
> + char *str = blobmsg_get_string(cur);
> + if (strcmp(str, "inherit")) {
> + unsigned uval;
> +
> + if (!system_tos_aton(str, &uval))
> + return -EINVAL;
> +
> + p.iph.tos = uval;
> + } else
> + p.iph.tos = 1;
> + }
> +
> + p.iph.frag_off = set_df ? htons(IP_DF) : 0;
> + strncpy(p.name, name, sizeof(p.name));
> +
> + return tunnel_ioctl("tunl0", SIOCADDTUNNEL, &p);
> +}
> +
> static int __system_del_ip_tunnel(const char *name, struct blob_attr **tb)
> {
> struct blob_attr *cur;
> @@ -2092,6 +2149,8 @@ failure:
> } else if (!strcmp(str, "gretapip6")) {
> return system_add_gre_tunnel(name, "ip6gretap", link, tb, true);
> #endif
> + } else if (!strcmp(str, "ipip")) {
> + return system_add_ipip_tunnel(name, link, tb);
> }
> else
> return -EINVAL;
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel
More information about the openwrt-devel
mailing list