From: Matthias Schiffer Date: Fri, 10 Mar 2017 01:23:50 +0100 Subject: vxlan: add new package for netifd VXLAN proto Signed-off-by: Matthias Schiffer diff --git a/package/network/config/vxlan/Makefile b/package/network/config/vxlan/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..a471d4e90cbe30c1d1dd01dbf7553995d8c0485e --- /dev/null +++ b/package/network/config/vxlan/Makefile @@ -0,0 +1,32 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME:=vxlan +PKG_VERSION:=1 +PKG_LICENSE:=GPL-2.0 + +include $(INCLUDE_DIR)/package.mk + +define Package/vxlan + SECTION:=net + CATEGORY:=Network + MAINTAINER:=Matthias Schiffer + TITLE:=Virtual eXtensible LAN config support + DEPENDS:=+kmod-vxlan +endef + +define Package/vxlan/description + Virtual eXtensible LAN config support in /etc/config/network. +endef + +define Build/Compile +endef + +define Build/Configure +endef + +define Package/vxlan/install + $(INSTALL_DIR) $(1)/lib/netifd/proto + $(INSTALL_BIN) ./files/vxlan.sh $(1)/lib/netifd/proto/vxlan.sh +endef + +$(eval $(call BuildPackage,vxlan)) diff --git a/package/network/config/vxlan/files/vxlan.sh b/package/network/config/vxlan/files/vxlan.sh new file mode 100755 index 0000000000000000000000000000000000000000..27ccd8f12759f69c7c226cac0c923335b8ccc6a8 --- /dev/null +++ b/package/network/config/vxlan/files/vxlan.sh @@ -0,0 +1,148 @@ +#!/bin/sh + +[ -n "$INCLUDE_ONLY" ] || { + . /lib/functions.sh + . /lib/functions/network.sh + . ../netifd-proto.sh + init_proto "$@" +} + +vxlan_generic_setup() { + local cfg="$1" + local mode="$2" + local local="$3" + local remote="$4" + + local link="$cfg" + + local port vid ttl tos mtu macaddr zone + json_get_vars port vid ttl tos mtu macaddr zone + + + proto_init_update "$link" 1 + + proto_add_tunnel + json_add_string mode "$mode" + + [ -n "$tunlink" ] && json_add_string link "$tunlink" + [ -n "$local" ] && json_add_string local "$local" + [ -n "$remote" ] && json_add_string remote "$remote" + + [ -n "$ttl" ] && json_add_int ttl "$ttl" + [ -n "$tos" ] && json_add_string tos "$tos" + [ -n "$mtu" ] && json_add_int mtu "$mtu" + + json_add_object 'data' + [ -n "$port" ] && json_add_int port "$port" + [ -n "$vid" ] && json_add_int id "$vid" + [ -n "$macaddr" ] && json_add_string macaddr "$macaddr" + json_close_object + + proto_close_tunnel + + proto_add_data + [ -n "$zone" ] && json_add_string zone "$zone" + proto_close_data + + proto_send_update "$cfg" +} + +proto_vxlan_setup() { + local cfg="$1" + + local ipaddr peeraddr + json_get_vars ipaddr peeraddr tunlink + + [ -z "$peeraddr" ] && { + proto_notify_error "$cfg" "MISSING_ADDRESS" + proto_block_restart "$cfg" + exit + } + + ( proto_add_host_dependency "$cfg" '' "$tunlink" ) + + [ -z "$ipaddr" ] && { + local wanif="$tunlink" + if [ -z "$wanif" ] && ! network_find_wan wanif; then + proto_notify_error "$cfg" "NO_WAN_LINK" + exit + fi + + if ! network_get_ipaddr ipaddr "$wanif"; then + proto_notify_error "$cfg" "NO_WAN_LINK" + exit + fi + } + + vxlan_generic_setup "$cfg" 'vxlan' "$ipaddr" "$peeraddr" +} + +proto_vxlan6_setup() { + local cfg="$1" + + local ip6addr peer6addr + json_get_vars ip6addr peer6addr tunlink + + [ -z "$peer6addr" ] && { + proto_notify_error "$cfg" "MISSING_ADDRESS" + proto_block_restart "$cfg" + exit + } + + ( proto_add_host_dependency "$cfg" '' "$tunlink" ) + + [ -z "$ip6addr" ] && { + local wanif="$tunlink" + if [ -z "$wanif" ] && ! network_find_wan6 wanif; then + proto_notify_error "$cfg" "NO_WAN_LINK" + exit + fi + + if ! network_get_ipaddr6 ip6addr "$wanif"; then + proto_notify_error "$cfg" "NO_WAN_LINK" + exit + fi + } + + vxlan_generic_setup "$cfg" 'vxlan6' "$ip6addr" "$peer6addr" +} + +proto_vxlan_teardown() { + local cfg="$1" +} + +proto_vxlan6_teardown() { + local cfg="$1" +} + +vxlan_generic_init_config() { + no_device=1 + available=1 + + proto_config_add_string "tunlink" + proto_config_add_string "zone" + + proto_config_add_int "vid" + proto_config_add_int "port" + proto_config_add_int "ttl" + proto_config_add_int "tos" + proto_config_add_int "mtu" + proto_config_add_string "macaddr" +} + +proto_vxlan_init_config() { + vxlan_generic_init_config + proto_config_add_string "ipaddr" + proto_config_add_string "peeraddr" +} + +proto_vxlan6_init_config() { + vxlan_generic_init_config + proto_config_add_string "ip6addr" + proto_config_add_string "peer6addr" +} + +[ -n "$INCLUDE_ONLY" ] || { + add_protocol vxlan + add_protocol vxlan6 +}