Initial commit
Some checks failed
Build Kernel / Build all affected Kernels (push) Has been cancelled
Build all core packages / Build all core packages for selected target (push) Has been cancelled
Build and Push prebuilt tools container / Build and Push all prebuilt containers (push) Has been cancelled
Build Toolchains / Build Toolchains for each target (push) Has been cancelled
Build host tools / Build host tools for linux and macos based systems (push) Has been cancelled
Coverity scan build / Coverity x86/64 build (push) Has been cancelled
Some checks failed
Build Kernel / Build all affected Kernels (push) Has been cancelled
Build all core packages / Build all core packages for selected target (push) Has been cancelled
Build and Push prebuilt tools container / Build and Push all prebuilt containers (push) Has been cancelled
Build Toolchains / Build Toolchains for each target (push) Has been cancelled
Build host tools / Build host tools for linux and macos based systems (push) Has been cancelled
Coverity scan build / Coverity x86/64 build (push) Has been cancelled
This commit is contained in:
48
package/network/ipv6/6rd/Makefile
Normal file
48
package/network/ipv6/6rd/Makefile
Normal file
@@ -0,0 +1,48 @@
|
||||
#
|
||||
# Copyright (C) 2010-2012 OpenWrt.org
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=6rd
|
||||
PKG_RELEASE:=13
|
||||
PKG_LICENSE:=GPL-2.0
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define Package/6rd
|
||||
SECTION:=net
|
||||
CATEGORY:=Network
|
||||
DEPENDS:=@IPV6 +kmod-sit
|
||||
TITLE:=6rd configuration support
|
||||
MAINTAINER:=Steven Barth <cyrus@openwrt.org>
|
||||
PKGARCH:=all
|
||||
endef
|
||||
|
||||
define Package/6rd/description
|
||||
Provides support for 6rd tunnels in /etc/config/network.
|
||||
Refer to http://wiki.openwrt.org/doc/uci/network for
|
||||
configuration details.
|
||||
endef
|
||||
|
||||
define Build/Configure
|
||||
endef
|
||||
|
||||
define Build/Compile
|
||||
$(MAKE) -C $(PKG_BUILD_DIR) \
|
||||
CC="$(TARGET_CC)" \
|
||||
CFLAGS="$(TARGET_CFLAGS) -Wall" \
|
||||
LDFLAGS="$(TARGET_LDFLAGS)"
|
||||
endef
|
||||
|
||||
define Package/6rd/install
|
||||
$(INSTALL_DIR) $(1)/usr/sbin
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/6rdcalc $(1)/usr/sbin/
|
||||
$(INSTALL_DIR) $(1)/lib/netifd/proto
|
||||
$(INSTALL_BIN) ./files/6rd.sh $(1)/lib/netifd/proto/6rd.sh
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,6rd))
|
||||
106
package/network/ipv6/6rd/files/6rd.sh
Normal file
106
package/network/ipv6/6rd/files/6rd.sh
Normal file
@@ -0,0 +1,106 @@
|
||||
#!/bin/sh
|
||||
# 6rd.sh - IPv6-in-IPv4 tunnel backend
|
||||
# Copyright (c) 2010-2012 OpenWrt.org
|
||||
|
||||
[ -n "$INCLUDE_ONLY" ] || {
|
||||
. /lib/functions.sh
|
||||
. /lib/functions/network.sh
|
||||
. ../netifd-proto.sh
|
||||
init_proto "$@"
|
||||
}
|
||||
|
||||
proto_6rd_setup() {
|
||||
local cfg="$1"
|
||||
local iface="$2"
|
||||
local link="6rd-$cfg"
|
||||
|
||||
local mtu df ttl tos ipaddr peeraddr ip6prefix ip6prefixlen ip4prefixlen tunlink zone
|
||||
json_get_vars mtu df ttl tos ipaddr peeraddr ip6prefix ip6prefixlen ip4prefixlen tunlink zone
|
||||
|
||||
[ -z "$ip6prefix" -o -z "$peeraddr" ] && {
|
||||
proto_notify_error "$cfg" "MISSING_ADDRESS"
|
||||
proto_block_restart "$cfg"
|
||||
return
|
||||
}
|
||||
|
||||
( proto_add_host_dependency "$cfg" "$peeraddr" "$tunlink" )
|
||||
|
||||
[ -z "$ipaddr" ] && {
|
||||
local wanif="$tunlink"
|
||||
if [ -z $wanif ] && ! network_find_wan wanif; then
|
||||
proto_notify_error "$cfg" "NO_WAN_LINK"
|
||||
return
|
||||
fi
|
||||
|
||||
if ! network_get_ipaddr ipaddr "$wanif"; then
|
||||
proto_notify_error "$cfg" "NO_WAN_LINK"
|
||||
return
|
||||
fi
|
||||
}
|
||||
|
||||
# Determine the relay prefix.
|
||||
local ip4prefixlen="${ip4prefixlen:-0}"
|
||||
local ip4prefix IP PREFIX NETWORK NETMASK BROADCAST
|
||||
ipcalc "$ipaddr/$ip4prefixlen" && ip4prefix="$NETWORK"
|
||||
|
||||
# Determine our IPv6 address.
|
||||
local ip6subnet=$(6rdcalc "$ip6prefix/$ip6prefixlen" "$ipaddr/$ip4prefixlen")
|
||||
local ip6addr="${ip6subnet%%::*}::1"
|
||||
|
||||
# Determine the IPv6 prefix
|
||||
local ip6lanprefix="$ip6subnet/$(($ip6prefixlen + 32 - $ip4prefixlen))"
|
||||
|
||||
proto_init_update "$link" 1
|
||||
proto_add_ipv6_address "$ip6addr" "$ip6prefixlen"
|
||||
proto_add_ipv6_prefix "$ip6lanprefix"
|
||||
|
||||
proto_add_ipv6_route "::" 0 "::$peeraddr" 4096 "" "$ip6addr/$ip6prefixlen"
|
||||
proto_add_ipv6_route "::" 0 "::$peeraddr" 4096 "" "$ip6lanprefix"
|
||||
|
||||
proto_add_tunnel
|
||||
json_add_string mode sit
|
||||
json_add_int mtu "${mtu:-1280}"
|
||||
json_add_boolean df "${df:-1}"
|
||||
json_add_int ttl "${ttl:-64}"
|
||||
[ -n "$tos" ] && json_add_string tos "$tos"
|
||||
json_add_string local "$ipaddr"
|
||||
[ -n "$tunlink" ] && json_add_string link "$tunlink"
|
||||
|
||||
json_add_object 'data'
|
||||
json_add_string prefix "$ip6prefix/$ip6prefixlen"
|
||||
json_add_string relay-prefix "$ip4prefix/$ip4prefixlen"
|
||||
json_close_object
|
||||
|
||||
proto_close_tunnel
|
||||
|
||||
proto_add_data
|
||||
[ -n "$zone" ] && json_add_string zone "$zone"
|
||||
proto_close_data
|
||||
|
||||
proto_send_update "$cfg"
|
||||
}
|
||||
|
||||
proto_6rd_teardown() {
|
||||
local cfg="$1"
|
||||
}
|
||||
|
||||
proto_6rd_init_config() {
|
||||
no_device=1
|
||||
available=1
|
||||
|
||||
proto_config_add_int "mtu"
|
||||
proto_config_add_boolean "df"
|
||||
proto_config_add_int "ttl"
|
||||
proto_config_add_string "tos"
|
||||
proto_config_add_string "ipaddr"
|
||||
proto_config_add_string "peeraddr"
|
||||
proto_config_add_string "ip6prefix"
|
||||
proto_config_add_string "ip6prefixlen"
|
||||
proto_config_add_string "ip4prefixlen"
|
||||
proto_config_add_string "tunlink"
|
||||
proto_config_add_string "zone"
|
||||
}
|
||||
|
||||
[ -n "$INCLUDE_ONLY" ] || {
|
||||
add_protocol 6rd
|
||||
}
|
||||
126
package/network/ipv6/6rd/src/6rdcalc.c
Normal file
126
package/network/ipv6/6rd/src/6rdcalc.c
Normal file
@@ -0,0 +1,126 @@
|
||||
/*
|
||||
* Utility used to calculate the 6rd subnet.
|
||||
*
|
||||
* Copyright 2012, Stéphan Kochen <stephan@kochen.nl>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/errno.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <netinet/in.h>
|
||||
|
||||
#define INET_PREFIXSTRLEN (INET_ADDRSTRLEN+3)
|
||||
#define INET6_PREFIXSTRLEN (INET6_ADDRSTRLEN+4)
|
||||
|
||||
static void print_usage()
|
||||
{
|
||||
fprintf(stderr, "Usage: 6rdcalc <v6 prefix>/<mask> <v4 address>/<mask>\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
static void print_error()
|
||||
{
|
||||
fprintf(stderr, "%s", strerror(errno));
|
||||
exit(1);
|
||||
}
|
||||
|
||||
static void parse_str(int af, char *str, void *addr, unsigned long *mask)
|
||||
{
|
||||
int ret;
|
||||
char *slash;
|
||||
|
||||
/* Split the address at the slash. */
|
||||
if ((slash = strchr(str, '/')) == NULL)
|
||||
print_usage();
|
||||
*slash = '\0';
|
||||
|
||||
/* Parse the address. */
|
||||
if ((ret = inet_pton(af, str, addr)) != 1) {
|
||||
if (ret == 0)
|
||||
print_usage();
|
||||
else
|
||||
print_error();
|
||||
}
|
||||
|
||||
/* Parse the mask. */
|
||||
*mask = strtoul(slash+1, NULL, 10);
|
||||
if ((af == AF_INET && *mask > 32) ||
|
||||
(af == AF_INET6 && *mask > 128))
|
||||
print_usage();
|
||||
}
|
||||
|
||||
int main(int argc, const char **argv)
|
||||
{
|
||||
char v6str[INET6_PREFIXSTRLEN], v4str[INET_PREFIXSTRLEN];
|
||||
struct in6_addr v6;
|
||||
struct in_addr v4;
|
||||
unsigned long v6it, v4it, mask;
|
||||
unsigned char *byte4, *byte6;
|
||||
unsigned char bit4, bit6;
|
||||
|
||||
/* Check parameters. */
|
||||
if (argc != 3)
|
||||
print_usage();
|
||||
|
||||
/* Parse the v6 address. */
|
||||
strncpy(v6str, argv[1], INET6_PREFIXSTRLEN);
|
||||
v6str[INET6_PREFIXSTRLEN-1] = '\0';
|
||||
parse_str(AF_INET6, v6str, &v6, &v6it);
|
||||
|
||||
/* Parse the v4 address */
|
||||
strncpy(v4str, argv[2], INET_PREFIXSTRLEN);
|
||||
v6str[INET_PREFIXSTRLEN-1] = '\0';
|
||||
parse_str(AF_INET, v4str, &v4, &v4it);
|
||||
|
||||
/* Check if the combined mask is within bounds. */
|
||||
mask = (32 - v4it) + v6it;
|
||||
if (mask > 128)
|
||||
print_usage();
|
||||
|
||||
/* Combine the addresses. */
|
||||
while (v4it < 32) {
|
||||
byte6 = (unsigned char *)(&v6.s6_addr) + (v6it >> 3);
|
||||
byte4 = (unsigned char *)(&v4.s_addr) + (v4it >> 3);
|
||||
bit6 = 128 >> (v6it & 0x07);
|
||||
bit4 = 128 >> (v4it & 0x07);
|
||||
|
||||
if (*byte4 & bit4)
|
||||
*byte6 |= bit6;
|
||||
else
|
||||
*byte6 &= ~bit6;
|
||||
|
||||
v4it++; v6it++;
|
||||
}
|
||||
|
||||
/* Clear remaining bits. */
|
||||
while (v6it < 128) {
|
||||
byte6 = (unsigned char *)(&v6.s6_addr) + (v6it >> 3);
|
||||
bit6 = 128 >> (v6it & 0x07);
|
||||
|
||||
*byte6 &= ~bit6;
|
||||
|
||||
v6it++;
|
||||
}
|
||||
|
||||
/* Print the subnet prefix. */
|
||||
if (inet_ntop(AF_INET6, &v6, v6str, sizeof(v6str)) == NULL)
|
||||
print_error();
|
||||
printf("%s/%lu\n", v6str, mask);
|
||||
return 0;
|
||||
}
|
||||
7
package/network/ipv6/6rd/src/Makefile
Normal file
7
package/network/ipv6/6rd/src/Makefile
Normal file
@@ -0,0 +1,7 @@
|
||||
all: 6rdcalc
|
||||
|
||||
6rdcalc: 6rdcalc.c
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $<
|
||||
|
||||
clean:
|
||||
rm -f 6rdcalc
|
||||
Reference in New Issue
Block a user