From 2153472351e06c1e27e11439036815015130f47b Mon Sep 17 00:00:00 2001 From: Ycarus Date: Sat, 1 Sep 2018 21:59:02 +0200 Subject: [PATCH] Fix macvlan interface support and add interface in wizard using device --- .../luasrc/controller/openmptcprouter.lua | 36 +++++++++++++++++-- .../luasrc/view/openmptcprouter/wizard.htm | 30 ++++++++++++++-- .../luasrc/model/cbi/admin_network/ifaces.lua | 2 +- luci-mod-admin-full/root/etc/init.d/macvlan | 9 ++--- .../files/etc/uci-defaults/1920-omr-network | 3 +- 5 files changed, 70 insertions(+), 10 deletions(-) diff --git a/luci-app-openmptcprouter/luasrc/controller/openmptcprouter.lua b/luci-app-openmptcprouter/luasrc/controller/openmptcprouter.lua index 93cbdadf8..f3e9933e0 100644 --- a/luci-app-openmptcprouter/luasrc/controller/openmptcprouter.lua +++ b/luci-app-openmptcprouter/luasrc/controller/openmptcprouter.lua @@ -2,6 +2,7 @@ local tools = require "luci.tools.status" local sys = require "luci.sys" local json = require("luci.json") local fs = require("nixio.fs") +local net = require "luci.model.network".init() local ucic = luci.model.uci.cursor() module("luci.controller.openmptcprouter", package.seeall) @@ -20,8 +21,21 @@ function index() entry({"admin", "system", "openmptcprouter", "mptcp_check_trace"}, post("mptcp_check_trace")).leaf = true end +function interface_from_device(dev) + for _, iface in ipairs(net:get_networks()) do + local ifacen = iface:name() + local ifacename = ucic:get("network",ifacen,"ifname") + if ifacename == dev then + return ifacen + end + end + return "" +end + + function wizard_add() local add_interface = luci.http.formvalue("add_interface") or "" + local add_interface_ifname = luci.http.formvalue("add_interface_ifname") or "" local gostatus = true if add_interface ~= "" then local i = 1 @@ -35,11 +49,29 @@ function wizard_add() multipath_master = true end end) - local defif = ucic:get("network","wan1_dev","ifname") or "eth0" + local defif = "eth0" + if add_interface_ifname == "" then + local defif1 = ucic:get("network","wan1_dev","ifname") or "" + if defif1 ~= "" then + defif = defif1 + end + else + defif = add_interface_ifname + end + + local ointf = interface_from_device(defif) or "" + if ointf ~= "" then + if ucic:get("network",ointf,"type") == "" then + ucic:set("network",ointf,"type","macvlan") + end + end + ucic:set("network","wan" .. i,"interface") ucic:set("network","wan" .. i,"ifname",defif) ucic:set("network","wan" .. i,"proto","static") - ucic:set("network","wan" .. i,"type","macvlan") + if ointf ~= "" then + ucic:set("network","wan" .. i,"type","macvlan") + end ucic:set("network","wan" .. i,"ip4table","wan") if multipath_master then ucic:set("network","wan" .. i,"multipath","on") diff --git a/luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm b/luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm index e048c17f7..169a58f9b 100644 --- a/luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm +++ b/luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm @@ -4,7 +4,8 @@ local uci = require("luci.model.uci").cursor() local net = require "luci.model.network".init() local fs = require "nixio.fs" - local ifaces = net:get_interfaces() + local sys = require "luci.sys" + local ifaces = sys.net:devices() local servers_ip = {} local server_ip = uci:get("shadowsocks-libev","sss0","server") if server_ip == '127.0.0.1' then @@ -16,8 +17,22 @@ else table.insert(servers_ip,server_ip) end + +function device_notvirtual(dev) + for _, iface in ipairs(net:get_networks()) do + local ifacen = iface:name() + local ifacename = uci:get("network",ifacen,"ifname") + local ifacetype = uci:get("network",ifacen,"type") or "" + local ifaceproto = uci:get("network",ifacen,"proto") or "" + if ifacename == dev and (ifacetype == "macvlan" or ifacetype == "bridge" or ifaceproto == "6in4") then + return false + end + end + return true +end + %> - + <% if stderr and #stderr > 0 then %>
<%=pcdata(stderr)%>
<% end %>
@@ -204,6 +219,17 @@ %>
+
diff --git a/luci-mod-admin-full/luasrc/model/cbi/admin_network/ifaces.lua b/luci-mod-admin-full/luasrc/model/cbi/admin_network/ifaces.lua index 4f267f695..86d3ec4e7 100644 --- a/luci-mod-admin-full/luasrc/model/cbi/admin_network/ifaces.lua +++ b/luci-mod-admin-full/luasrc/model/cbi/admin_network/ifaces.lua @@ -306,7 +306,7 @@ if not net:is_virtual() then -- macsource.rmempty = true end -macvlanmaster = s:taboption("physical", Value, "interface", translate("Master interface")) +macvlanmaster = s:taboption("physical", Value, "masterintf", translate("Master interface")) macvlanmaster.default = "eth0" macvlanmaster:depends("type", "macvlan") diff --git a/luci-mod-admin-full/root/etc/init.d/macvlan b/luci-mod-admin-full/root/etc/init.d/macvlan index fae2a4fbe..554116a64 100755 --- a/luci-mod-admin-full/root/etc/init.d/macvlan +++ b/luci-mod-admin-full/root/etc/init.d/macvlan @@ -33,11 +33,11 @@ _setup_interface() { uci -q get "network.$1_dev.ifname" >/dev/null && { uci -q set network.$1_dev.mtu=$(uci -q get network.$1.mtu) - uci -q commit network + [ -n "$(uci -q get network.$1.masterintf)" ] && uci -q set network.$1_dev.ifname=$(uci -q get network.$1.masterintf) + [ -z "$(uci -q get network.$1.masterintf)" ] && uci -q set network.$1.masterintf=$(uci -q get network.$1_dev.ifname) [ "$_type" = "macvlan" ] || { uci -q batch <<-EOF delete network.$1_dev - commit network EOF } [ "$_type" = "macvlan" ] && { @@ -47,10 +47,10 @@ _setup_interface() { uci -q batch <<-EOF delete network.$1.interface set network.$1_dev.ifname=$_interface - commit network EOF } } + uci -q commit network return 0 } @@ -62,12 +62,13 @@ _setup_interface() { set network.$1_dev.type=macvlan set network.$1_dev.ifname=$_ifname set network.$1.ifname=$1 + set network.$1.masterintf=$_ifname + set network.$1.type=macvlan set network.$1.defaultroute=0 EOF _macaddr=$(uci -q get "network.$1.macaddr") _setup_macaddr "$1" "${_macaddr:-auto$(date +%s)}" - uci -q set "network.$1.type=macvlan" # legacy uci -q set network.$1_dev.mtu=$(uci -q get network.$1.mtu) uci -q commit network } diff --git a/openmptcprouter/files/etc/uci-defaults/1920-omr-network b/openmptcprouter/files/etc/uci-defaults/1920-omr-network index 15c1e8d8c..2ef0c823e 100755 --- a/openmptcprouter/files/etc/uci-defaults/1920-omr-network +++ b/openmptcprouter/files/etc/uci-defaults/1920-omr-network @@ -23,10 +23,11 @@ _setup_macvlan() { set network.$1_dev.type=macvlan set network.$1_dev.ifname=$_ifname set network.$1.ifname=$1 + set network.$1.type=macvlan + set network.$1.masterintf=$_ifname EOF _macaddr=$(uci -q get "network.$1.macaddr") _setup_macaddr "$1" "${_macaddr:-auto$(date +%s)}" - uci -q set "network.$1.type=macvlan" # legacy } _setup_multipath_off() {