Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • 0x4A6F-master
  • 0x4A6F-rpi4
  • 2014.3.x
  • 2014.4.x
  • babel
  • experimental
  • hoodselector
  • master
  • nrb/gluon-master-cpe510
  • nrb/test-radv-filter
  • nrbffs/fastd-remove-delay
  • nrbffs/netgear-ex6120
  • radv-filterd
  • v2015.1.x
  • v2016.1.x
  • v2016.2.4-batmanbug
  • v2016.2.x
  • v2018.2.2-ffs
  • v2018.2.3-ffs
  • v2018.2.x
  • v2019.1-ffs
  • v2019.1.1-ffs
  • v2019.1.2-ffs
  • v2020.1-ffs
  • v2020.1.1-ffs
  • v2020.1.3-ffs
  • v2020.2-ffs
  • v2020.2.1-ffs
  • v2020.2.2-ffs
  • v2020.2.3-ffs
  • v2020.2.x
  • v2021.1-ffs
  • v2021.1.1-ffs
  • v2021.1.2-ffs
  • v2014.1
  • v2014.2
  • v2014.3
  • v2014.3.1
  • v2014.4
  • v2015.1
  • v2015.1.1
  • v2015.1.2
  • v2016.1
  • v2016.1.1
  • v2016.1.2
  • v2016.1.3
  • v2016.1.4
  • v2016.1.5
  • v2016.1.6
  • v2016.2
  • v2016.2.1
  • v2016.2.2
  • v2016.2.3
  • v2016.2.4
  • v2016.2.5
  • v2016.2.6
  • v2016.2.7
  • v2017.1
  • v2017.1.1
  • v2017.1.2
  • v2017.1.3
  • v2017.1.4
  • v2017.1.5
  • v2017.1.6
  • v2017.1.7
  • v2017.1.8
  • v2018.1
  • v2018.1.1
  • v2018.1.2
  • v2018.1.3
  • v2018.1.4
  • v2018.2
  • v2018.2-ffs0.1
  • v2018.2.1
  • v2018.2.1-ffs0.1
  • v2018.2.2-ffs0.1
  • v2018.2.3-ffs0.1
  • v2019.1-ffs0.1
  • v2019.1.1-ffs0.1
  • v2019.1.2-ffs0.1
  • v2020.1-ffs0.1
  • v2020.1.1-ffs0.1
  • v2020.1.3-ffs0.1
  • v2020.2
  • v2020.2-ffs0.1
  • v2020.2.1-ffs0.1
  • v2020.2.2-ffs0.1
  • v2020.2.3-ffs0.1
  • v2020.2.3-ffs0.2
  • v2020.2.3-ffs0.3
  • v2020.2.x-ffs0.1
  • v2021.1-ffs0.1
  • v2021.1.1-ffs0.1
  • v2021.1.1-ffs0.2
  • v2021.1.1-ffs0.3
  • v2021.1.1-ffs0.4
  • v2021.1.2-ffs0.1
  • v2021.1.2-ffs0.2
98 results

Target

Select target project
  • firmware/gluon
  • 0x4A6F/gluon
  • patrick/gluon
3 results
Select Git revision
Loading items
Show changes
Showing
with 250 additions and 121 deletions
...@@ -24,16 +24,6 @@ if unistd.access('/etc/config/gluon-simple-tc') then ...@@ -24,16 +24,6 @@ if unistd.access('/etc/config/gluon-simple-tc') then
os.rename('/etc/config/gluon-simple-tc', '/etc/config/simple-tc') os.rename('/etc/config/gluon-simple-tc', '/etc/config/simple-tc')
end end
if not uci:get('simple-tc', 'mesh_vpn') then
uci:section('simple-tc', 'interface', 'mesh_vpn', {
ifname = 'mesh-vpn',
enabled = site.mesh_vpn.bandwidth_limit.enabled(false),
limit_ingress = site.mesh_vpn.bandwidth_limit.ingress(),
limit_egress = site.mesh_vpn.bandwidth_limit.egress(),
})
uci:save('simple-tc')
end
-- The previously used user and group are removed, we now have a generic group -- The previously used user and group are removed, we now have a generic group
users.remove_user('gluon-fastd') users.remove_user('gluon-fastd')
...@@ -49,18 +39,23 @@ uci:save('firewall') ...@@ -49,18 +39,23 @@ uci:save('firewall')
-- VPN migration -- VPN migration
local has_fastd = unistd.access('/lib/gluon/mesh-vpn/fastd') if not uci:get('gluon', 'mesh_vpn') then
local fastd_enabled = uci:get('fastd', 'mesh_vpn', 'enabled') local vpn
if unistd.access('/lib/gluon/mesh-vpn/fastd') then
vpn = 'fastd'
elseif unistd.access('/lib/gluon/mesh-vpn/tunneldigger') then
vpn = 'tunneldigger'
end
local has_tunneldigger = unistd.access('/lib/gluon/mesh-vpn/tunneldigger') local fastd_enabled = uci:get('fastd', 'mesh_vpn', 'enabled')
local tunneldigger_enabled = uci:get('tunneldigger', 'mesh_vpn', 'enabled') local tunneldigger_enabled = uci:get('tunneldigger', 'mesh_vpn', 'enabled')
local enabled local enabled
-- If the installed VPN package has its enabled state set, keep the value -- If the installed VPN package has its enabled state set, keep the value
if has_fastd and fastd_enabled then if vpn == 'fastd' and fastd_enabled then
enabled = fastd_enabled == '1' enabled = fastd_enabled == '1'
elseif has_tunneldigger and tunneldigger_enabled then elseif vpn == 'tunneldigger' and tunneldigger_enabled then
enabled = tunneldigger_enabled == '1' enabled = tunneldigger_enabled == '1'
-- Otherwise, migrate the other package's value if any is set -- Otherwise, migrate the other package's value if any is set
elseif fastd_enabled or tunneldigger_enabled then elseif fastd_enabled or tunneldigger_enabled then
...@@ -70,21 +65,33 @@ else ...@@ -70,21 +65,33 @@ else
enabled = site.mesh_vpn.enabled(false) enabled = site.mesh_vpn.enabled(false)
end end
if has_fastd then
uci:set('fastd', 'mesh_vpn', 'enabled', enabled) local limit_enabled = tonumber((uci:get('simple-tc', 'mesh_vpn', 'enabled')))
else if limit_enabled == nil then
uci:delete('fastd', 'mesh_vpn') limit_enabled = site.mesh_vpn.bandwidth_limit.enabled(false)
end end
uci:save('fastd')
local limit_ingress = tonumber((uci:get('tunneldigger', 'mesh_vpn', 'limit_bw_down')))
if has_tunneldigger then if limit_ingress == nil then
uci:set('tunneldigger', 'mesh_vpn', 'enabled', enabled) limit_ingress = tonumber((uci:get('simple-tc', 'mesh_vpn', 'limit_ingress')))
if site.mesh_vpn.bandwidth_limit.enabled(false) then
uci:set('tunneldigger', 'mesh_vpn', 'limit_bw_down', site.mesh_vpn.bandwidth_limit.ingress())
uci:set('simple-tc', 'mesh_vpn', 'limit_ingress', 0)
uci:save('simple-tc')
end end
else if limit_ingress == nil then
uci:delete('tunneldigger', 'mesh_vpn') limit_ingress = site.mesh_vpn.bandwidth_limit.ingress()
end end
uci:save('tunneldigger')
local limit_egress = tonumber((uci:get('simple-tc', 'mesh_vpn', 'limit_egress')))
if limit_egress == nil then
limit_egress = site.mesh_vpn.bandwidth_limit.egress()
end
uci:section('gluon', 'mesh_vpn', 'mesh_vpn', {
enabled = enabled,
limit_enabled = limit_enabled,
limit_ingress = limit_ingress,
limit_egress = limit_egress,
})
uci:save('gluon')
end
os.execute('exec /lib/gluon/mesh-vpn/update-config')
include $(TOPDIR)/rules.mk
PKG_NAME:=gluon-scheduled-domain-switch
PKG_VERSION:=1
include ../gluon.mk
define Package/gluon-scheduled-domain-switch
TITLE:=Allows scheduled migrations between domains
DEPENDS:=+gluon-core @GLUON_MULTIDOMAIN
endef
$(eval $(call BuildPackageGluon,gluon-scheduled-domain-switch))
if need_table(in_domain({'domain_switch'}), check_domain_switch, false) then
need_domain_name(in_domain({'domain_switch', 'target_domain'}))
need_number(in_domain({'domain_switch', 'switch_after_offline_mins'}))
need_number(in_domain({'domain_switch', 'switch_time'}))
need_string_array_match(in_domain({'domain_switch', 'connection_check_targets'}), '^[%x:]+$')
end
#!/usr/bin/lua
local json = require 'jsonc'
local site = require 'gluon.site'
local unistd = require 'posix.unistd'
local cronfile = "/usr/lib/micron.d/gluon-scheduled-domain-switch"
-- Check if domain switch is scheduled
if site.domain_switch() == nil then
-- In case no domain switch is scheduled, remove cronfile
os.remove(cronfile)
os.exit(0)
end
-- Only in case domain switch is scheduled
local f = io.open(cronfile, "w")
f:write("* * * * * /usr/bin/gluon-check-connection\n")
f:write("*/5 * * * * /usr/bin/gluon-switch-domain\n")
f:close()
#!/usr/bin/lua
local unistd = require 'posix.unistd'
local util = require 'gluon.util'
local site = require 'gluon.site'
local offline_flag_file = "/tmp/gluon_offline"
local is_offline = true
-- Check if domain-switch is scheduled
if site.domain_switch() == nil then
-- Switch not applicable for current domain
os.exit(0)
end
-- Check reachability of pre-defined targets
for _, ip in ipairs(site.domain_switch.connection_check_targets()) do
local exit_code = os.execute("ping -c 1 -w 10 " .. ip)
if exit_code == 0 then
is_offline = false
break
end
end
if is_offline then
-- Check if we were previously offline
if unistd.access(offline_flag_file) then
os.exit(0)
end
-- Create offline flag
local f = io.open(offline_flag_file, "w")
f:write(tostring(util.get_uptime()))
f:close()
else
os.remove(offline_flag_file)
end
#!/usr/bin/lua
local uci = require('simple-uci').cursor()
local unistd = require 'posix.unistd'
local util = require 'gluon.util'
local site = require 'gluon.site'
-- Returns true if node was offline long enough to perform domain switch
function switch_after_min_reached()
if not unistd.access("/tmp/gluon_offline") then
return false
end
local switch_after_sec = site.domain_switch.switch_after_offline_mins() * 60
local current_uptime = util.get_uptime()
if current_uptime == nil then
return false
end
local f = util.readfile("/tmp/gluon_offline")
if f == nil then
return false
end
local offline_since = tonumber(f)
local offline_time_sec = current_uptime - offline_since
if offline_time_sec > switch_after_sec then
return true
end
return false
end
-- Returns true in case switch time has passed
function switch_time_passed()
local current_time = os.time()
local switch_time = site.domain_switch.switch_time()
return switch_time < current_time
end
if site.domain_switch() == nil then
-- Switch not applicable for current domain
print("No domain switch defined for the current domain.")
os.exit(0)
end
local current_domain = uci:get("gluon", "core", "domain")
local target_domain = site.domain_switch.target_domain()
if target_domain == current_domain then
-- Current and target domain are equal
print("Domain '" .. target_domain .. "' equals current domain.")
os.exit(1)
end
if not switch_after_min_reached() and not switch_time_passed() then
-- Neither switch-time passed nor switch_after_min reached
os.exit(0)
end
uci:set("gluon", "core", "domain", target_domain)
uci:commit("gluon")
os.execute("gluon-reconfigure")
os.execute("reboot")
...@@ -49,9 +49,16 @@ define Build/Compile ...@@ -49,9 +49,16 @@ define Build/Compile
$(foreach domain,$(patsubst $(GLUON_SITEDIR)/domains/%.conf,%,$(wildcard $(GLUON_SITEDIR)/domains/*.conf)), $(foreach domain,$(patsubst $(GLUON_SITEDIR)/domains/%.conf,%,$(wildcard $(GLUON_SITEDIR)/domains/*.conf)),
[ ! -e '$(PKG_BUILD_DIR)/domains/$(domain).json' ] [ ! -e '$(PKG_BUILD_DIR)/domains/$(domain).json' ]
$(call GenerateJSON,domains/$(domain)) $(call GenerateJSON,domains/$(domain))
lua ../../scripts/domain_aliases.lua '$(PKG_BUILD_DIR)/domains/$(domain).json' | while read alias; do \ @lua ../../scripts/domain_aliases.lua '$(PKG_BUILD_DIR)/domains/$(domain).json' | while read alias; do \
[ "$$$${alias}" != '$(domain)' ] || continue; \ [ "$$$${alias}" != '$(domain)' ] || continue; \
ln -s '$(domain).json' $(PKG_BUILD_DIR)/domains/$$$${alias}.json || exit 1; \ link="$(PKG_BUILD_DIR)/domains/$$$${alias}.json"; \
if ! ln -s '$(domain).json' "$$$$link"; then \
other="$$$$(basename $$$$(readlink -f "$$$$link") .json)"; \
if [ "$$$$other" ]; then \
echo >&2 "Failed to alias domain '"'$(domain)'"' as '$$$$alias', name already taken by domain '$$$$other'."; \
fi; \
exit 1; \
fi; \
done done
) )
endif endif
......
"use strict";!function(){var a=JSON.parse(document.body.getAttribute("data-translations"));function i(t,e){return t.toFixed(e).replace(/\./,a["."])}function o(t,e){e--;for(var n=t;10<=n&&0<e;n/=10)e--;return i(t,e)}function r(t){return function(t,e,n){var r=0;if(void 0===n)return"- ";for(;e<n&&r<t.length-1;)n/=e,r++;return(n=o(n,3))+" "+t[r]}(["","K","M","G","T"],1024,t)}String.prototype.sprintf=function(){var t=0,e=arguments;return this.replace(/%s/g,function(){return e[t++]})};var u={id:function(t){return t},decimal:function(t){return i(t,2)},percent:function(t){return a["%s used"].sprintf(o(100*t,3)+"%")},memory:function(t){var e=1-(t.free+t.buffers+t.cached)/t.total;return u.percent(e)},time:function(t){var e=Math.round(t/60),n=Math.floor(e/1440),r=Math.floor(e%1440/60);e=Math.floor(e%60);var i="";return 1===n?i+=a["1 day"]+", ":1<n&&(i+=a["%s days"].sprintf(n)+", "),i+=r+":",e<10&&(i+="0"),i+=e},packetsDiff:function(t,e,n){if(0<n)return r=(t-e)/n,a["%s packets/s"].sprintf(i(r,0));var r},bytesDiff:function(t,e,n){if(0<n)return r(8*((t-e)/n))+"bps"},bytes:function(t){return r(t)+"B"}};function f(e,t){return t.split("/").forEach(function(t){e&&(e=e[t])}),e}function l(t,n){var e=new EventSource(t),r={};e.onmessage=function(t){var e=JSON.parse(t.data);n(e,r),r=e},e.onerror=function(){e.close(),window.setTimeout(function(){l(t,n)},3e3)}}var y,C=document.body.getAttribute("data-node-address");try{y=JSON.parse(document.body.getAttribute("data-node-location"))}catch(t){}var t=document.querySelectorAll("[data-statistics]");l("/cgi-bin/dyn/statistics",function(o,c){var s=o.uptime-c.uptime;t.forEach(function(t){var e=t.getAttribute("data-statistics"),n=t.getAttribute("data-format"),r=f(c,e),i=f(o,e);try{var a=u[n](i,r,s);void 0!==a&&(t.textContent=a)}catch(t){console.error(t)}});try{!function(t){var e=document.getElementById("mesh-vpn");if(t){e.style.display="";for(var i=document.getElementById("mesh-vpn-peers");i.lastChild;)i.removeChild(i.lastChild);var n=function e(n,r){return Object.keys(r.peers||{}).forEach(function(t){n.push([t,r.peers[t]])}),Object.keys(r.groups||{}).forEach(function(t){e(n,r.groups[t])}),n}([],t);n.sort(),n.forEach(function(t){var e=document.createElement("tr"),n=document.createElement("th");n.textContent=t[0],e.appendChild(n);var r=document.createElement("td");t[1]?r.textContent=a.connected+" ("+u.time(t[1].established)+")":r.textContent=a["not connected"],e.appendChild(r),i.appendChild(e)})}else e.style.display="none"}(o.mesh_vpn)}catch(t){console.error(t)}});var c={};function w(a){var o=document.createElement("canvas"),c=o.getContext("2d"),s=null,u=1.2;return{canvas:o,highlight:!1,resize:function(t,e){try{c.getImageData(0,0,t,e)}catch(t){}o.width=t,o.height=e},draw:function(t,e){var n,r,i=e(s);c.clearRect(t,0,5,o.height),i&&(n=t,r=i,c.beginPath(),c.fillStyle=a,c.arc(n,r,u,0,2*Math.PI,!1),c.closePath(),c.fill())},set:function(t){s=t}}}function h(){var s=-100,u=0,n=0,r=[],f=document.createElement("canvas");f.className="signalgraph",f.height=200;var l=f.getContext("2d");function t(){f.width=f.clientWidth,r.forEach(function(t){t.resize(f.width,f.height)})}function i(){if(0!==f.clientWidth){f.width!==f.clientWidth&&t(),l.clearRect(0,0,f.width,f.height);var e=!1;r.forEach(function(t){t.highlight&&(e=!0)}),l.save(),r.forEach(function(t){e&&(l.globalAlpha=.2),t.highlight&&(l.globalAlpha=1),t.draw(n,function(t){return e=t,n=s,r=u,i=f.height,(1-(e-n)/(r-n))*i;var e,n,r,i}),l.drawImage(t.canvas,0,0)}),l.restore(),l.save(),l.beginPath(),l.strokeStyle="rgba(255, 180, 0, 0.15)",l.lineWidth=5,l.moveTo(n+2.5,0),l.lineTo(n+2.5,f.height),l.stroke(),function(){var t,e,n,r,i=Math.floor(f.height/40);l.save(),l.lineWidth=.5,l.strokeStyle="rgba(0, 0, 0, 0.25)",l.fillStyle="rgba(0, 0, 0, 0.5)",l.textAlign="end",l.textBaseline="bottom",l.beginPath();for(var a=0;a<i;a++){var o=f.height-40*a;l.moveTo(0,o-.5),l.lineTo(f.width,o-.5);var c=Math.round((t=o,e=s,n=u,r=f.height,(e*t+n*(r-t))/r))+" dBm";l.save(),l.strokeStyle="rgba(255, 255, 255, 0.9)",l.lineWidth=4,l.miterLimit=2,l.strokeText(c,f.width-5,o-2.5),l.fillText(c,f.width-5,o-2.5),l.restore()}l.stroke(),l.strokeStyle="rgba(0, 0, 0, 0.83)",l.lineWidth=1.5,l.strokeRect(.5,.5,f.width-1,f.height-1),l.restore()}()}}t(),window.addEventListener("resize",i);var a=0;return window.requestAnimationFrame(function t(e){40<e-a&&(i(),n=(n+1)%f.width,a=e),window.requestAnimationFrame(t)}),{el:f,addSignal:function(t){r.push(t),t.resize(f.width,f.height)},removeSignal:function(t){r.splice(r.indexOf(t),1)}}}function d(t,e,n,r){var i=t.table.firstElementChild,a=t.table.insertRow(),o=a.insertCell();if(t.wireless){var c=document.createElement("span");c.textContent="",c.style.color=n,o.appendChild(c)}var h=document.createElement("span");h.textContent=e,o.appendChild(h);var s,d,u,f,l,v={};function g(t){var e=t.getAttribute("data-key");if(e){var n=t.getAttribute("data-suffix")||"",r=a.insertCell();r.textContent="-",v[e]={td:r,suffix:n}}}for(var m=0;m<i.children.length;m++)g(i.children[m]);function p(){l&&window.clearTimeout(l),l=window.setTimeout(function(){f&&t.signalgraph.removeSignal(f),a.parentNode.removeChild(a),r()},6e4)}function b(t){var e=function(t){"::"==t.slice(0,2)&&(t="0"+t),"::"==t.slice(-2)&&(t+="0");var e=t.split(":"),n=e.length,r=[];return e.forEach(function(t,e){if(""===t)for(;n++<=8;)r.push(0);else{if(!/^[a-f0-9]{1,4}$/i.test(t))return;r.push(parseInt(t,16))}}),r}(t);if(e){var n="";return e.forEach(function(t){n+=("0000000000000000"+t.toString(2)).slice(-16)}),n}}return t.wireless&&((s=a.insertCell()).textContent="-",(d=a.insertCell()).textContent="-",(u=a.insertCell()).textContent="-",f=w(n),t.signalgraph.addSignal(f)),a.onmouseenter=function(){a.classList.add("highlight"),f&&(f.highlight=!0)},a.onmouseleave=function(){a.classList.remove("highlight"),f&&(f.highlight=!1)},p(),{update_nodeinfo:function(t){var e,n,r,i,a,o,c,s,u=function(t){var r=b(C);if(t&&t[0]){(t=t.map(function(t){var e=b(t);if(!e)return[-1];var n=0;return r&&(n=function(t,e){var n;for(n=0;n<t.length&&n<e.length&&t[n]===e[n];n++);return n}(r,e)),[n,e,t]})).sort(function(t,e){return t[0]<e[0]?1:t[0]>e[0]?-1:t[1]<e[1]?-1:t[1]>e[1]?1:0});var e=t[0][2];return e&&!/^fe80:/i.test(e)?e:void 0}}(t.network.addresses);if(u){if("span"===h.nodeName.toLowerCase()){var f=h;h=document.createElement("a"),f.parentNode.replaceChild(h,f)}h.href="http://["+u+"]/"}if(h.textContent=t.hostname,y&&t.location){var l=(e=y.latitude,n=y.longitude,r=t.location.latitude,i=t.location.longitude,a=Math.PI/180,o=(r*=a)-(e*=a),c=(i*=a)-(n*=a),s=Math.sin(o/2)*Math.sin(o/2)+Math.sin(c/2)*Math.sin(c/2)*Math.cos(e)*Math.cos(r),2*Math.asin(Math.sqrt(s))*6372.8);d.textContent=Math.round(1e3*l)+" m"}p()},update_mesh:function(n){Object.keys(v).forEach(function(t){var e=v[t];e.td.textContent=n[t]+e.suffix}),p()},update_wifi:function(t){s.textContent=t.signal,u.textContent=Math.round(t.inactive/1e3)+" s",a.classList.toggle("inactive",200<t.inactive),f.set(200<t.inactive?null:t.signal),p()}}}function s(t,e,n){var r,a={};n&&(r=h(),t.appendChild(r.el));var i={table:t.firstElementChild,signalgraph:r,ifname:e,wireless:n},o=!1,c={},s=[];function u(){if(!o){o=!0;var t=new EventSource("/cgi-bin/dyn/neighbours-nodeinfo?"+encodeURIComponent(e));t.addEventListener("neighbour",function(t){try{var n=JSON.parse(t.data);(e=n,r=[],i=e.network.mesh,Object.keys(i).forEach(function(t){var e=i[t].interfaces;Object.keys(e).forEach(function(t){e[t].forEach(function(t){r.push(t)})})}),r).forEach(function(t){var e=a[t];if(e){delete c[t];try{e.update_nodeinfo(n)}catch(t){console.error(t)}}})}catch(t){console.error(t)}var e,r,i},!1),t.onerror=function(){t.close(),o=!1,Object.keys(c).forEach(function(t){0<c[t]&&(c[t]--,u())})}}}function f(t){var e=a[t];return e||(c[t]=3,e=a[t]=d(i,t,(s[0]||(s=["#396AB1","#DA7C30","#3E9651","#CC2529","#535154","#6B4C9A","#922428","#948B3D"]),s.shift()),function(){delete c[t],delete a[t]}),u()),e}return n&&l("/cgi-bin/dyn/stations?"+encodeURIComponent(e),function(n){Object.keys(n).forEach(function(t){var e=n[t];f(t).update_wifi(e)})}),{get_neigh:f}}document.querySelectorAll("[data-interface]").forEach(function(t){var e=t.getAttribute("data-interface"),n=(t.getAttribute("data-interface-address"),!!t.getAttribute("data-interface-wireless"));c[e]=s(t,e,n)});var e=document.body.getAttribute("data-mesh-provider");e&&l(e,function(r){Object.keys(r).forEach(function(t){var e=r[t],n=c[e.ifname];n&&n.get_neigh(t).update_mesh(e)})})}(); "use strict";!function(){var a=JSON.parse(document.body.getAttribute("data-translations"));function r(t,e){return t.toFixed(e).replace(/\./,a["."])}function o(t,e){e--;for(var n=t;10<=n&&0<e;n/=10)e--;return r(t,e)}function i(t){return function(t,e,n){var i=0;if(void 0===n)return"- ";for(;e<n&&i<t.length-1;)n/=e,i++;return(n=o(n,3))+" "+t[i]}(["","K","M","G","T"],1024,t)}String.prototype.sprintf=function(){var t=0,e=arguments;return this.replace(/%s/g,function(){return e[t++]})};var u={id:function(t){return t},decimal:function(t){return r(t,2)},percent:function(t){return a["%s used"].sprintf(o(100*t,3)+"%")},memory:function(t){var e=1-t.available/t.total;return u.percent(e)},time:function(t){var e=Math.round(t/60),n=Math.floor(e/1440),i=Math.floor(e%1440/60);e=Math.floor(e%60);var r="";return 1===n?r+=a["1 day"]+", ":1<n&&(r+=a["%s days"].sprintf(n)+", "),r+=i+":",e<10&&(r+="0"),r+=e},packetsDiff:function(t,e,n){if(0<n)return i=(t-e)/n,a["%s packets/s"].sprintf(r(i,0));var i},bytesDiff:function(t,e,n){if(0<n)return i(8*((t-e)/n))+"bps"},bytes:function(t){return i(t)+"B"}};function l(e,t){return t.split("/").forEach(function(t){e&&(e=e[t])}),e}function f(t,n){var e=new EventSource(t),i={};e.onmessage=function(t){var e=JSON.parse(t.data);n(e,i),i=e},e.onerror=function(){e.close(),window.setTimeout(function(){f(t,n)},3e3)}}var y,C=document.body.getAttribute("data-node-address");try{y=JSON.parse(document.body.getAttribute("data-node-location"))}catch(t){}var t=document.querySelectorAll("[data-statistics]");f("/cgi-bin/dyn/statistics",function(o,c){var s=o.uptime-c.uptime;t.forEach(function(t){var e=t.getAttribute("data-statistics"),n=t.getAttribute("data-format"),i=l(c,e),r=l(o,e);try{var a=u[n](r,i,s);void 0!==a&&(t.textContent=a)}catch(t){console.error(t)}});try{!function(t){var e=document.getElementById("mesh-vpn");if(t){e.style.display="";for(var r=document.getElementById("mesh-vpn-peers");r.lastChild;)r.removeChild(r.lastChild);var n=function e(n,i){return Object.keys(i.peers||{}).forEach(function(t){n.push([t,i.peers[t]])}),Object.keys(i.groups||{}).forEach(function(t){e(n,i.groups[t])}),n}([],t);n.sort(),n.forEach(function(t){var e=document.createElement("tr"),n=document.createElement("th");n.textContent=t[0],e.appendChild(n);var i=document.createElement("td");t[1]?i.textContent=a.connected+" ("+u.time(t[1].established)+")":i.textContent=a["not connected"],e.appendChild(i),r.appendChild(e)})}else e.style.display="none"}(o.mesh_vpn)}catch(t){console.error(t)}});var c={};function w(a){var o=document.createElement("canvas"),c=o.getContext("2d"),s=null;return{canvas:o,highlight:!1,resize:function(t,e){try{c.getImageData(0,0,t,e)}catch(t){}o.width=t,o.height=e},draw:function(t,e){var n,i,r=e(s);c.clearRect(t,0,5,o.height),r&&(n=t,i=r,c.beginPath(),c.fillStyle=a,c.arc(n,i,1.2,0,2*Math.PI,!1),c.closePath(),c.fill())},set:function(t){s=t}}}function h(){var s=-100,u=0,n=0,i=[],l=document.createElement("canvas");l.className="signalgraph",l.height=200;var f=l.getContext("2d");function t(){l.width=l.clientWidth,i.forEach(function(t){t.resize(l.width,l.height)})}function r(){if(0!==l.clientWidth){l.width!==l.clientWidth&&t(),f.clearRect(0,0,l.width,l.height);var e=!1;i.forEach(function(t){t.highlight&&(e=!0)}),f.save(),i.forEach(function(t){e&&(f.globalAlpha=.2),t.highlight&&(f.globalAlpha=1),t.draw(n,function(t){return e=t,n=s,i=u,r=l.height,(1-(e-n)/(i-n))*r;var e,n,i,r}),f.drawImage(t.canvas,0,0)}),f.restore(),f.save(),f.beginPath(),f.strokeStyle="rgba(255, 180, 0, 0.15)",f.lineWidth=5,f.moveTo(n+2.5,0),f.lineTo(n+2.5,l.height),f.stroke(),function(){var t,e,n,i,r=Math.floor(l.height/40);f.save(),f.lineWidth=.5,f.strokeStyle="rgba(0, 0, 0, 0.25)",f.fillStyle="rgba(0, 0, 0, 0.5)",f.textAlign="end",f.textBaseline="bottom",f.beginPath();for(var a=0;a<r;a++){var o=l.height-40*a;f.moveTo(0,o-.5),f.lineTo(l.width,o-.5);var c=Math.round((t=o,e=s,n=u,i=l.height,(e*t+n*(i-t))/i))+" dBm";f.save(),f.strokeStyle="rgba(255, 255, 255, 0.9)",f.lineWidth=4,f.miterLimit=2,f.strokeText(c,l.width-5,o-2.5),f.fillText(c,l.width-5,o-2.5),f.restore()}f.stroke(),f.strokeStyle="rgba(0, 0, 0, 0.83)",f.lineWidth=1.5,f.strokeRect(.5,.5,l.width-1,l.height-1),f.restore()}()}}t(),window.addEventListener("resize",r);var a=0;return window.requestAnimationFrame(function t(e){40<e-a&&(r(),n=(n+1)%l.width,a=e),window.requestAnimationFrame(t)}),{el:l,addSignal:function(t){i.push(t),t.resize(l.width,l.height)},removeSignal:function(t){i.splice(i.indexOf(t),1)}}}function d(t,e,n,i){var r=t.table.firstElementChild,a=t.table.insertRow(),o=a.insertCell();if(t.wireless){var c=document.createElement("span");c.textContent="",c.style.color=n,o.appendChild(c)}var h=document.createElement("span");h.textContent=e,o.appendChild(h);var s,d,u,l,f,v={};function g(t){var e=t.getAttribute("data-key");if(e){var n=t.getAttribute("data-suffix")||"",i=a.insertCell();i.textContent="-",v[e]={td:i,suffix:n}}}for(var m=0;m<r.children.length;m++)g(r.children[m]);function p(){f&&window.clearTimeout(f),f=window.setTimeout(function(){l&&t.signalgraph.removeSignal(l),a.parentNode.removeChild(a),i()},6e4)}function b(t){var e=function(t){"::"==t.slice(0,2)&&(t="0"+t),"::"==t.slice(-2)&&(t+="0");var e=t.split(":"),n=e.length,i=[];return e.forEach(function(t,e){if(""===t)for(;n++<=8;)i.push(0);else{if(!/^[a-f0-9]{1,4}$/i.test(t))return;i.push(parseInt(t,16))}}),i}(t);if(e){var n="";return e.forEach(function(t){n+=("0000000000000000"+t.toString(2)).slice(-16)}),n}}return t.wireless&&((s=a.insertCell()).textContent="-",(d=a.insertCell()).textContent="-",(u=a.insertCell()).textContent="-",l=w(n),t.signalgraph.addSignal(l)),a.onmouseenter=function(){a.classList.add("highlight"),l&&(l.highlight=!0)},a.onmouseleave=function(){a.classList.remove("highlight"),l&&(l.highlight=!1)},p(),{update_nodeinfo:function(t){var e,n,i,r,a,o,c,s,u=function(t){var i=b(C);if(t&&t[0]){(t=t.map(function(t){var e=b(t);if(!e)return[-1];var n=0;return i&&(n=function(t,e){var n;for(n=0;n<t.length&&n<e.length&&t[n]===e[n];n++);return n}(i,e)),[n,e,t]})).sort(function(t,e){return t[0]<e[0]?1:t[0]>e[0]?-1:t[1]<e[1]?-1:t[1]>e[1]?1:0});var e=t[0][2];return e&&!/^fe80:/i.test(e)?e:void 0}}(t.network.addresses);if(u){if("span"===h.nodeName.toLowerCase()){var l=h;h=document.createElement("a"),l.parentNode.replaceChild(h,l)}h.href="http://["+u+"]/"}if(h.textContent=t.hostname,y&&t.location){var f=(e=y.latitude,n=y.longitude,i=t.location.latitude,r=t.location.longitude,a=Math.PI/180,o=(i*=a)-(e*=a),c=(r*=a)-(n*=a),s=Math.sin(o/2)*Math.sin(o/2)+Math.sin(c/2)*Math.sin(c/2)*Math.cos(e)*Math.cos(i),2*Math.asin(Math.sqrt(s))*6372.8);d.textContent=Math.round(1e3*f)+" m"}p()},update_mesh:function(n){Object.keys(v).forEach(function(t){var e=v[t];e.td.textContent=n[t]+e.suffix}),p()},update_wifi:function(t){s.textContent=t.signal,u.textContent=Math.round(t.inactive/1e3)+" s",a.classList.toggle("inactive",200<t.inactive),l.set(200<t.inactive?null:t.signal),p()}}}function s(t,e,n){var i,a={};n&&(i=h(),t.appendChild(i.el));var r={table:t.firstElementChild,signalgraph:i,ifname:e,wireless:n},o=!1,c={},s=[];function u(){if(!o){o=!0;var t=new EventSource("/cgi-bin/dyn/neighbours-nodeinfo?"+encodeURIComponent(e));t.addEventListener("neighbour",function(t){try{var n=JSON.parse(t.data);(e=n,i=[],r=e.network.mesh,Object.keys(r).forEach(function(t){var e=r[t].interfaces;Object.keys(e).forEach(function(t){e[t].forEach(function(t){i.push(t)})})}),i).forEach(function(t){var e=a[t];if(e){delete c[t];try{e.update_nodeinfo(n)}catch(t){console.error(t)}}})}catch(t){console.error(t)}var e,i,r},!1),t.onerror=function(){t.close(),o=!1,Object.keys(c).forEach(function(t){0<c[t]&&(c[t]--,u())})}}}function l(t){var e=a[t];return e||(c[t]=3,e=a[t]=d(r,t,(s[0]||(s=["#396AB1","#DA7C30","#3E9651","#CC2529","#535154","#6B4C9A","#922428","#948B3D"]),s.shift()),function(){delete c[t],delete a[t]}),u()),e}return n&&f("/cgi-bin/dyn/stations?"+encodeURIComponent(e),function(n){Object.keys(n).forEach(function(t){var e=n[t];l(t).update_wifi(e)})}),{get_neigh:l}}document.querySelectorAll("[data-interface]").forEach(function(t){var e=t.getAttribute("data-interface"),n=(t.getAttribute("data-interface-address"),!!t.getAttribute("data-interface-wireless"));c[e]=s(t,e,n)});var e=document.body.getAttribute("data-mesh-provider");e&&f(e,function(i){Object.keys(i).forEach(function(t){var e=i[t],n=c[e.ifname];n&&n.get_neigh(t).update_mesh(e)})})}();
\ No newline at end of file \ No newline at end of file
...@@ -10,18 +10,18 @@ msgstr "" ...@@ -10,18 +10,18 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgid "Node role"
msgstr "Verwendungszweck"
msgid "Role"
msgstr "Rolle"
msgid "" msgid ""
"If this node has a special role within the mesh network you can specify this " "If this node has a special role within the mesh network you can specify this "
"role here. Please find out about the available roles and their impact first. " "role here. Please find out about the available roles and their impact first. "
"Only change the role if you know what you are doing." "Only change the role if you know what you are doing."
msgstr "" msgstr ""
"Wenn dein Knoten eine besondere Rolle im Mesh-Netzwerk einnimmt, " "Wenn dein Knoten eine besondere Rolle im Mesh-Netzwerk einnimmt, kannst du "
"kannst du diese hier angeben. Bringe bitte zuvor in Erfahrung, welche " "diese hier angeben. Bringe bitte zuvor in Erfahrung, welche Bedeutung die "
"Bedeutung die zur Verfügung stehenden Rollen haben. " "zur Verfügung stehenden Rollen haben. Setze die Rolle nur, wenn du weißt, "
"Setze die Rolle nur, wenn du weißt, was du tust." "was du tust."
msgid "Node role"
msgstr "Verwendungszweck"
msgid "Role"
msgstr "Rolle"
...@@ -10,18 +10,18 @@ msgstr "" ...@@ -10,18 +10,18 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgid "Node role"
msgstr "Rôle du nœud"
msgid "Role"
msgstr "Rôle"
msgid "" msgid ""
"If this node has a special role within the mesh network you can specify this " "If this node has a special role within the mesh network you can specify this "
"role here. Please find out about the available roles and their impact first. " "role here. Please find out about the available roles and their impact first. "
"Only change the role if you know what you are doing." "Only change the role if you know what you are doing."
msgstr "" msgstr ""
"Si votre nœud a un rôle spécial dans le réseau MESH, vous pouvez " "Si votre nœud a un rôle spécial dans le réseau MESH, vous pouvez spécifier "
"spécifier ce rôle ici. Avant de changer, informez vous sur les rôles " "ce rôle ici. Avant de changer, informez vous sur les rôles disponibles et "
"disponibles et sur leur impacts. Changez de rôle uniquement si vous " "sur leur impacts. Changez de rôle uniquement si vous comprenez ce que vous "
"comprenez ce que vous faites." "faites."
msgid "Node role"
msgstr "Rôle du nœud"
msgid "Role"
msgstr "Rôle"
msgid "" msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8" msgstr "Content-Type: text/plain; charset=UTF-8"
msgid "Node role" msgid ""
"If this node has a special role within the mesh network you can specify this "
"role here. Please find out about the available roles and their impact first. "
"Only change the role if you know what you are doing."
msgstr "" msgstr ""
msgid "Role" msgid "Node role"
msgstr "" msgstr ""
msgid "" msgid "Role"
"If this node has a special role within the mesh network you can specify this role here. "
"Please find out about the available roles and their impact first. "
"Only change the role if you know what you are doing."
msgstr "" msgstr ""
local f, s, o local f, s, o
local site = require 'gluon.site' local site = require 'gluon.site'
local site_i18n = i18n 'gluon-site'
local uci = require("simple-uci").cursor() local uci = require("simple-uci").cursor()
local config = 'gluon-node-info' local config = 'gluon-node-info'
...@@ -9,7 +10,7 @@ local role = uci:get(config, uci:get_first(config, "system"), "role") ...@@ -9,7 +10,7 @@ local role = uci:get(config, uci:get_first(config, "system"), "role")
f = Form(translate("Node role")) f = Form(translate("Node role"))
s = f:section(Section, nil, translate( s = f:section(Section, nil, translate(
"If this node has a special role within the freifunk network you can specify this role here. " "If this node has a special role within the mesh network you can specify this role here. "
.. "Please find out about the available roles and their impact first. " .. "Please find out about the available roles and their impact first. "
.. "Only change the role if you know what you are doing." .. "Only change the role if you know what you are doing."
)) ))
...@@ -17,7 +18,7 @@ s = f:section(Section, nil, translate( ...@@ -17,7 +18,7 @@ s = f:section(Section, nil, translate(
o = s:option(ListValue, "role", translate("Role")) o = s:option(ListValue, "role", translate("Role"))
o.default = role o.default = role
for _, role in ipairs(site.roles.list()) do for _, role in ipairs(site.roles.list()) do
o:value(role, translate('gluon-web-node-role:role:' .. role)) o:value(role, site_i18n.translate('gluon-web-node-role:role:' .. role))
end end
function o:write(data) function o:write(data)
......
...@@ -17,7 +17,7 @@ msgid "Not Found" ...@@ -17,7 +17,7 @@ msgid "Not Found"
msgstr "Nicht Gefunden" msgstr "Nicht Gefunden"
msgid "Sorry, the object you requested was not found." msgid "Sorry, the object you requested was not found."
msgstr "Entschuldigung, das anfgeforderte Objekt wurde nicht gefunden." msgstr "Entschuldigung, das angeforderte Objekt wurde nicht gefunden."
msgid "Sorry, the server encountered an unexpected error." msgid "Sorry, the server encountered an unexpected error."
msgstr "" msgstr ""
......
...@@ -103,13 +103,13 @@ end ...@@ -103,13 +103,13 @@ end
-- Content-Type. Stores all extracted data associated with its parameter name -- Content-Type. Stores all extracted data associated with its parameter name
-- in the params table withing the given message object. Multiple parameter -- in the params table withing the given message object. Multiple parameter
-- values are stored as tables, ordinary ones as strings. -- values are stored as tables, ordinary ones as strings.
-- If an optional file callback function is given then it is feeded with the -- If an optional file callback function is given then it is fed with the
-- file contents chunk by chunk and only the extracted file name is stored -- file contents chunk by chunk and only the extracted file name is stored
-- within the params table. The callback function will be called subsequently -- within the params table. The callback function will be called subsequently
-- with three arguments: -- with three arguments:
-- o Table containing decoded (name, file) and raw (headers) mime header data -- o Table containing decoded (name, file) and raw (headers) mime header data
-- o String value containing a chunk of the file data -- o String value containing a chunk of the file data
-- o Boolean which indicates wheather the current chunk is the last one (eof) -- o Boolean which indicates whether the current chunk is the last one (eof)
function mimedecode_message_body(src, msg, filecb) function mimedecode_message_body(src, msg, filecb)
if msg and msg.env.CONTENT_TYPE then if msg and msg.env.CONTENT_TYPE then
......
...@@ -58,7 +58,7 @@ return function(config, env) ...@@ -58,7 +58,7 @@ return function(config, env)
-- Now finally render the thing -- Now finally render the thing
local stat, err = pcall(template) local stat, err = pcall(template)
assert(stat, "Failed to execute template '" .. name .. "'.\n" .. assert(stat, "Failed to execute template '" .. name .. "'.\n" ..
"A runtime error occured: " .. tostring(err or "(nil)")) "A runtime error occurred: " .. tostring(err or "(nil)"))
end end
--- Render a certain template. --- Render a certain template.
......
...@@ -235,7 +235,7 @@ static size_t validate_utf8(const unsigned char **s, size_t l, struct template_b ...@@ -235,7 +235,7 @@ static size_t validate_utf8(const unsigned char **s, size_t l, struct template_b
break; break;
} }
/* advance beyound the last found valid continuation char */ /* advance beyond the last found valid continuation char */
o = v; o = v;
ptr += v; ptr += v;
} }
......
...@@ -182,10 +182,10 @@ index 0000000000000000000000000000000000000000..b38b9977bca192eafe9a0d9b8c36a120 ...@@ -182,10 +182,10 @@ index 0000000000000000000000000000000000000000..b38b9977bca192eafe9a0d9b8c36a120
+ +
diff --git a/target/linux/generic/backport-4.9/095-0003-vxlan-fix-snooping-for-link-local-IPv6-addresses.patch b/target/linux/generic/backport-4.9/095-0003-vxlan-fix-snooping-for-link-local-IPv6-addresses.patch diff --git a/target/linux/generic/backport-4.9/095-0003-vxlan-fix-snooping-for-link-local-IPv6-addresses.patch b/target/linux/generic/backport-4.9/095-0003-vxlan-fix-snooping-for-link-local-IPv6-addresses.patch
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..dcfd1ce7c2f015354d21a65f12f6ebd00331b629 index 0000000000000000000000000000000000000000..89523ac027b227a9f84b1130db06a7fc67ff68ce
--- /dev/null --- /dev/null
+++ b/target/linux/generic/backport-4.9/095-0003-vxlan-fix-snooping-for-link-local-IPv6-addresses.patch +++ b/target/linux/generic/backport-4.9/095-0003-vxlan-fix-snooping-for-link-local-IPv6-addresses.patch
@@ -0,0 +1,93 @@ @@ -0,0 +1,88 @@
+From 010b2b541d958e12d78ba1c79734c700f169610b Mon Sep 17 00:00:00 2001 +From 010b2b541d958e12d78ba1c79734c700f169610b Mon Sep 17 00:00:00 2001
+Message-Id: <010b2b541d958e12d78ba1c79734c700f169610b.1515533863.git.mschiffer@universe-factory.net> +Message-Id: <010b2b541d958e12d78ba1c79734c700f169610b.1515533863.git.mschiffer@universe-factory.net>
+In-Reply-To: <f45ba82cd83d27b5d44d3dc417e0e480ba0d3703.1515533863.git.mschiffer@universe-factory.net> +In-Reply-To: <f45ba82cd83d27b5d44d3dc417e0e480ba0d3703.1515533863.git.mschiffer@universe-factory.net>
...@@ -209,11 +209,9 @@ index 0000000000000000000000000000000000000000..dcfd1ce7c2f015354d21a65f12f6ebd0 ...@@ -209,11 +209,9 @@ index 0000000000000000000000000000000000000000..dcfd1ce7c2f015354d21a65f12f6ebd0
+ drivers/net/vxlan.c | 20 +++++++++++++++----- + drivers/net/vxlan.c | 20 +++++++++++++++-----
+ 1 file changed, 15 insertions(+), 5 deletions(-) + 1 file changed, 15 insertions(+), 5 deletions(-)
+ +
+diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c
+index 863d9528b900..c28c6f34b3b3 100644
+--- a/drivers/net/vxlan.c +--- a/drivers/net/vxlan.c
++++ b/drivers/net/vxlan.c ++++ b/drivers/net/vxlan.c
+@@ -917,16 +917,25 @@ static int vxlan_fdb_dump(struct sk_buff *skb, struct netlink_callback *cb, +@@ -917,16 +917,25 @@ out:
+ * Return true if packet is bogus and should be dropped. + * Return true if packet is bogus and should be dropped.
+ */ + */
+ static bool vxlan_snoop(struct net_device *dev, + static bool vxlan_snoop(struct net_device *dev,
...@@ -241,7 +239,7 @@ index 0000000000000000000000000000000000000000..dcfd1ce7c2f015354d21a65f12f6ebd0 ...@@ -241,7 +239,7 @@ index 0000000000000000000000000000000000000000..dcfd1ce7c2f015354d21a65f12f6ebd0
+ return false; + return false;
+ +
+ /* Don't migrate static entries, drop packets */ + /* Don't migrate static entries, drop packets */
+@@ -952,7 +961,7 @@ static bool vxlan_snoop(struct net_device *dev, +@@ -952,7 +961,7 @@ static bool vxlan_snoop(struct net_devic
+ NLM_F_EXCL|NLM_F_CREATE, + NLM_F_EXCL|NLM_F_CREATE,
+ vxlan->cfg.dst_port, + vxlan->cfg.dst_port,
+ vxlan->default_dst.remote_vni, + vxlan->default_dst.remote_vni,
...@@ -250,7 +248,7 @@ index 0000000000000000000000000000000000000000..dcfd1ce7c2f015354d21a65f12f6ebd0 ...@@ -250,7 +248,7 @@ index 0000000000000000000000000000000000000000..dcfd1ce7c2f015354d21a65f12f6ebd0
+ spin_unlock(&vxlan->hash_lock); + spin_unlock(&vxlan->hash_lock);
+ } + }
+ +
+@@ -1223,6 +1232,7 @@ static bool vxlan_set_mac(struct vxlan_dev *vxlan, +@@ -1223,6 +1232,7 @@ static bool vxlan_set_mac(struct vxlan_d
+ struct sk_buff *skb) + struct sk_buff *skb)
+ { + {
+ union vxlan_addr saddr; + union vxlan_addr saddr;
...@@ -258,7 +256,7 @@ index 0000000000000000000000000000000000000000..dcfd1ce7c2f015354d21a65f12f6ebd0 ...@@ -258,7 +256,7 @@ index 0000000000000000000000000000000000000000..dcfd1ce7c2f015354d21a65f12f6ebd0
+ +
+ skb_reset_mac_header(skb); + skb_reset_mac_header(skb);
+ skb->protocol = eth_type_trans(skb, vxlan->dev); + skb->protocol = eth_type_trans(skb, vxlan->dev);
+@@ -1244,7 +1254,7 @@ static bool vxlan_set_mac(struct vxlan_dev *vxlan, +@@ -1244,7 +1254,7 @@ static bool vxlan_set_mac(struct vxlan_d
+ } + }
+ +
+ if ((vxlan->flags & VXLAN_F_LEARN) && + if ((vxlan->flags & VXLAN_F_LEARN) &&
...@@ -267,18 +265,15 @@ index 0000000000000000000000000000000000000000..dcfd1ce7c2f015354d21a65f12f6ebd0 ...@@ -267,18 +265,15 @@ index 0000000000000000000000000000000000000000..dcfd1ce7c2f015354d21a65f12f6ebd0
+ return false; + return false;
+ +
+ return true; + return true;
+@@ -1932,7 +1942,7 @@ static void vxlan_encap_bypass(struct sk_buff *skb, struct vxlan_dev *src_vxlan, +@@ -1939,7 +1949,7 @@ static void vxlan_encap_bypass(struct sk
+ } + }
+ +
+ if (dst_vxlan->flags & VXLAN_F_LEARN) + if (dst_vxlan->flags & VXLAN_F_LEARN)
+- vxlan_snoop(skb->dev, &loopback, eth_hdr(skb)->h_source); +- vxlan_snoop(dev, &loopback, eth_hdr(skb)->h_source);
++ vxlan_snoop(skb->dev, &loopback, eth_hdr(skb)->h_source, 0); ++ vxlan_snoop(dev, &loopback, eth_hdr(skb)->h_source, 0);
+ +
+ u64_stats_update_begin(&tx_stats->syncp); + u64_stats_update_begin(&tx_stats->syncp);
+ tx_stats->tx_packets++; + tx_stats->tx_packets++;
+--
+2.15.1
+
diff --git a/target/linux/generic/backport-4.9/095-0004-vxlan-allow-multiple-VXLANs-with-same-VNI-for-IPv6-l.patch b/target/linux/generic/backport-4.9/095-0004-vxlan-allow-multiple-VXLANs-with-same-VNI-for-IPv6-l.patch diff --git a/target/linux/generic/backport-4.9/095-0004-vxlan-allow-multiple-VXLANs-with-same-VNI-for-IPv6-l.patch b/target/linux/generic/backport-4.9/095-0004-vxlan-allow-multiple-VXLANs-with-same-VNI-for-IPv6-l.patch
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..18ae230a3b04d2b57184109fa14f9533f0fb7192 index 0000000000000000000000000000000000000000..18ae230a3b04d2b57184109fa14f9533f0fb7192
......
...@@ -891,7 +891,7 @@ index 0000000000000000000000000000000000000000..d7f8c5955caee15d373a342b75c8c194 ...@@ -891,7 +891,7 @@ index 0000000000000000000000000000000000000000..d7f8c5955caee15d373a342b75c8c194
+ status = "okay"; + status = "okay";
+}; +};
diff --git a/target/linux/ipq40xx/image/Makefile b/target/linux/ipq40xx/image/Makefile diff --git a/target/linux/ipq40xx/image/Makefile b/target/linux/ipq40xx/image/Makefile
index 38600cf979242142aa08c30163e63d911f0ddb63..d1ee1004fddce6cf6007259229d8eee5b5b2ea3b 100644 index 90d9dfeff0c228765ac24247ce72dec497dc63f0..cb79baccd21b3fa7f35df543bfca1a7d6ba8f83f 100644
--- a/target/linux/ipq40xx/image/Makefile --- a/target/linux/ipq40xx/image/Makefile
+++ b/target/linux/ipq40xx/image/Makefile +++ b/target/linux/ipq40xx/image/Makefile
@@ -1,6 +1,8 @@ @@ -1,6 +1,8 @@
......
...@@ -267,7 +267,7 @@ index 640557532c8a02f37bc6f84ade8cb34e7172162d..4568b656219419e9ca1156c6716bd212 ...@@ -267,7 +267,7 @@ index 640557532c8a02f37bc6f84ade8cb34e7172162d..4568b656219419e9ca1156c6716bd212
# We cannot currently build a factory image. It is the sysupgrade image # We cannot currently build a factory image. It is the sysupgrade image
# prefixed with a header (which is actually written into the MTD device). # prefixed with a header (which is actually written into the MTD device).
diff --git a/target/linux/ipq40xx/image/Makefile b/target/linux/ipq40xx/image/Makefile diff --git a/target/linux/ipq40xx/image/Makefile b/target/linux/ipq40xx/image/Makefile
index d1ee1004fddce6cf6007259229d8eee5b5b2ea3b..5cd11cae237b4658906652967d8120bd0dc080a8 100644 index cb79baccd21b3fa7f35df543bfca1a7d6ba8f83f..a0f81f7d631b6c53a5612dee172e752a9fecd06d 100644
--- a/target/linux/ipq40xx/image/Makefile --- a/target/linux/ipq40xx/image/Makefile
+++ b/target/linux/ipq40xx/image/Makefile +++ b/target/linux/ipq40xx/image/Makefile
@@ -221,7 +221,7 @@ define Device/zyxel_nbg6617 @@ -221,7 +221,7 @@ define Device/zyxel_nbg6617
......
From: Andreas Ziegler <dev@andreas-ziegler.de>
Date: Thu, 27 Dec 2018 15:02:41 +0100
Subject: ramips: mt7621: fix 5GHz WiFi LED on ZBT WG3526
This fixes the 5GHz WiFi LED which was previously not working.
Signed-off-by: Andreas Ziegler <dev@andreas-ziegler.de>
diff --git a/target/linux/ramips/dts/ZBT-WG3526.dtsi b/target/linux/ramips/dts/ZBT-WG3526.dtsi
index 104a51f8de7110c0f65f760af70033853f3da745..e42ec5e33de7fb69a9c668406f876f6443d2912b 100644
--- a/target/linux/ramips/dts/ZBT-WG3526.dtsi
+++ b/target/linux/ramips/dts/ZBT-WG3526.dtsi
@@ -101,6 +101,10 @@
mediatek,mtd-eeprom = <&factory 0x8000>;
ieee80211-freq-limit = <5000000 6000000>;
};
+
+ led {
+ led-sources = <2>;
+ };
};
};