Message ID | 20210420144902.12350-1-thomas.richard@kontron.com |
---|---|
State | Accepted |
Headers | show |
Series | [v2] uqmi: fix network registration loop | expand |
On 2021-04-20 16:49, thomas.richard@kontron.com wrote: > From: Thomas Richard <thomas.richard@kontron.com> > > With some debug in qmi.sh using following patch, some errors are > visible > in the registration step > @@ -29,6 +29,7 @@ proto_qmi_init_config() { > } > > proto_qmi_setup() { > + set -x > local interface="$1" > local dataformat connstat plmn_mode mcc mnc > local device apn auth username password pincode delay modes > pdptype > @@ -224,6 +225,8 @@ proto_qmi_setup() { > fi > done > > + registration=$(uqmi -s -d "$device" --get-serving-system) > + > [ -n "$modes" ] && uqmi -s -d "$device" --set-network-modes > "$modes" > /dev/null 2>&1 > > echo "Starting network $interface" > > During the boot of the system, modem could not start automatically its > network registration. > netifd: wan (9235): + echo 'Waiting for network registration' > netifd: wan (9235): Waiting for network registration > netifd: wan (9235): + local 'registration_timeout=0' > netifd: wan (9235): + uqmi -s -d /dev/cdc-wdm1 --get-serving-system > netifd: wan (9235): + grep '"searching"' > netifd: wan (9235): + uqmi -s -d /dev/cdc-wdm1 --get-serving-system > netifd: wan (9235): + > registration='{"registration":"not_registered","plmn_mcc":208,"plmn_mnc":20,"plmn_description":"","roaming":true}' > netifd: wan (9235): + '[' -n ] > netifd: wan (9235): + echo 'Starting network wan' > > As the while loop checks only "searching" pattern, uqmi.sh script quits > searching loop and continues whereas the modem is not registered > > Other issue, after X seconds modem stops searching. > netifd: wan (9213): + uqmi -s -d /dev/cdc-wdm0 --get-serving-system > netifd: wan (9213): + grep '"searching"' > netifd: wan (9213): + '[' -e /dev/cdc-wdm0 ] > netifd: wan (9213): + '[' 3 -lt 0 -o 0 '=' 0 ] > netifd: wan (9213): + let registration_timeout++ > netifd: wan (9213): + sleep 1 > netifd: wan (9213): + uqmi -s -d /dev/cdc-wdm0 --get-serving-system > netifd: wan (9213): + grep '"searching"' > netifd: wan (9213): + uqmi -s -d /dev/cdc-wdm0 --get-serving-system > netifd: wan (9213): + registration='{"registration":"not_registered"}' > netifd: wan (9213): + '[' -n ] > netifd: wan (9213): + echo 'Starting network wan' > netifd: wan (9213): Starting network wan > > If registration_timeout is not expired, registration can be restarted > > Signed-off-by: Thomas Richard <thomas.richard@kontron.com> Tested-by: Florian Eckert <fe@dev.tdt.de> Works as expected. Thanks!
Applied, thanks. Does this need to be backported to 21.02 or even 19.07? Baptiste On 20-04-21, thomas.richard@kontron.com wrote: > From: Thomas Richard <thomas.richard@kontron.com> > > With some debug in qmi.sh using following patch, some errors are visible > in the registration step > @@ -29,6 +29,7 @@ proto_qmi_init_config() { > } > > proto_qmi_setup() { > + set -x > local interface="$1" > local dataformat connstat plmn_mode mcc mnc > local device apn auth username password pincode delay modes pdptype > @@ -224,6 +225,8 @@ proto_qmi_setup() { > fi > done > > + registration=$(uqmi -s -d "$device" --get-serving-system) > + > [ -n "$modes" ] && uqmi -s -d "$device" --set-network-modes "$modes" > /dev/null 2>&1 > > echo "Starting network $interface" > > During the boot of the system, modem could not start automatically its > network registration. > netifd: wan (9235): + echo 'Waiting for network registration' > netifd: wan (9235): Waiting for network registration > netifd: wan (9235): + local 'registration_timeout=0' > netifd: wan (9235): + uqmi -s -d /dev/cdc-wdm1 --get-serving-system > netifd: wan (9235): + grep '"searching"' > netifd: wan (9235): + uqmi -s -d /dev/cdc-wdm1 --get-serving-system > netifd: wan (9235): + registration='{"registration":"not_registered","plmn_mcc":208,"plmn_mnc":20,"plmn_description":"","roaming":true}' > netifd: wan (9235): + '[' -n ] > netifd: wan (9235): + echo 'Starting network wan' > > As the while loop checks only "searching" pattern, uqmi.sh script quits > searching loop and continues whereas the modem is not registered > > Other issue, after X seconds modem stops searching. > netifd: wan (9213): + uqmi -s -d /dev/cdc-wdm0 --get-serving-system > netifd: wan (9213): + grep '"searching"' > netifd: wan (9213): + '[' -e /dev/cdc-wdm0 ] > netifd: wan (9213): + '[' 3 -lt 0 -o 0 '=' 0 ] > netifd: wan (9213): + let registration_timeout++ > netifd: wan (9213): + sleep 1 > netifd: wan (9213): + uqmi -s -d /dev/cdc-wdm0 --get-serving-system > netifd: wan (9213): + grep '"searching"' > netifd: wan (9213): + uqmi -s -d /dev/cdc-wdm0 --get-serving-system > netifd: wan (9213): + registration='{"registration":"not_registered"}' > netifd: wan (9213): + '[' -n ] > netifd: wan (9213): + echo 'Starting network wan' > netifd: wan (9213): Starting network wan > > If registration_timeout is not expired, registration can be restarted > > Signed-off-by: Thomas Richard <thomas.richard@kontron.com> > --- > package/network/utils/uqmi/Makefile | 2 +- > .../utils/uqmi/files/lib/netifd/proto/qmi.sh | 35 ++++++++++++++++------ > 2 files changed, 27 insertions(+), 10 deletions(-) > > diff --git a/package/network/utils/uqmi/Makefile b/package/network/utils/uqmi/Makefile > index 68958a3729..da54ba0f46 100644 > --- a/package/network/utils/uqmi/Makefile > +++ b/package/network/utils/uqmi/Makefile > @@ -1,7 +1,7 @@ > include $(TOPDIR)/rules.mk > > PKG_NAME:=uqmi > -PKG_RELEASE:=2 > +PKG_RELEASE:=3 > > PKG_SOURCE_PROTO:=git > PKG_SOURCE_URL=$(PROJECT_GIT)/project/uqmi.git > diff --git a/package/network/utils/uqmi/files/lib/netifd/proto/qmi.sh b/package/network/utils/uqmi/files/lib/netifd/proto/qmi.sh > index a6c785eb56..c0134f44dd 100755 > --- a/package/network/utils/uqmi/files/lib/netifd/proto/qmi.sh > +++ b/package/network/utils/uqmi/files/lib/netifd/proto/qmi.sh > @@ -209,19 +209,36 @@ proto_qmi_setup() { > > uqmi -s -d "$device" --sync > /dev/null 2>&1 > > + uqmi -s -d "$device" --network-register > /dev/null 2>&1 > + > echo "Waiting for network registration" > + sleep 1 > local registration_timeout=0 > - while uqmi -s -d "$device" --get-serving-system | grep '"searching"' > /dev/null; do > - [ -e "$device" ] || return 1 > - if [ "$registration_timeout" -lt "$timeout" -o "$timeout" = "0" ]; then > - let registration_timeout++ > - sleep 1; > + local registration_state="" > + while true; do > + registration_state=$(uqmi -s -d "$device" --get-serving-system 2>/dev/null | jsonfilter -e "@.registration" 2>/dev/null) > + > + [ "$registration_state" = "registered" ] && break > + > + if [ "$registration_state" = "searching" ] || [ "$registration_state" = "not_registered" ]; then > + if [ "$registration_timeout" -lt "$timeout" ] || [ "$timeout" = "0" ]; then > + [ "$registration_state" = "searching" ] || { > + echo "Device stopped network registration. Restart network registration" > + uqmi -s -d "$device" --network-register > /dev/null 2>&1 > + } > + let registration_timeout++ > + sleep 1 > + continue > + fi > + echo "Network registration failed, registration timeout reached" > else > - echo "Network registration failed" > - proto_notify_error "$interface" NETWORK_REGISTRATION_FAILED > - proto_block_restart "$interface" > - return 1 > + # registration_state is 'registration_denied' or 'unknown' or '' > + echo "Network registration failed (reason: '$registration_state')" > fi > + > + proto_notify_error "$interface" NETWORK_REGISTRATION_FAILED > + proto_block_restart "$interface" > + return 1 > done > > [ -n "$modes" ] && uqmi -s -d "$device" --set-network-modes "$modes" > /dev/null 2>&1
On 2021-05-08 12:33, Baptiste Jonglez wrote: > Applied, thanks. > > Does this need to be backported to 21.02 or even 19.07? yes that would not be bad at least for openwrt-21.02 On openwrt-19.07 there are additional commits needed. Thanks for take care > > Baptiste > > On 20-04-21, thomas.richard@kontron.com wrote: >> From: Thomas Richard <thomas.richard@kontron.com> >> >> With some debug in qmi.sh using following patch, some errors are >> visible >> in the registration step >> @@ -29,6 +29,7 @@ proto_qmi_init_config() { >> } >> >> proto_qmi_setup() { >> + set -x >> local interface="$1" >> local dataformat connstat plmn_mode mcc mnc >> local device apn auth username password pincode delay modes >> pdptype >> @@ -224,6 +225,8 @@ proto_qmi_setup() { >> fi >> done >> >> + registration=$(uqmi -s -d "$device" --get-serving-system) >> + >> [ -n "$modes" ] && uqmi -s -d "$device" --set-network-modes >> "$modes" > /dev/null 2>&1 >> >> echo "Starting network $interface" >> >> During the boot of the system, modem could not start automatically its >> network registration. >> netifd: wan (9235): + echo 'Waiting for network registration' >> netifd: wan (9235): Waiting for network registration >> netifd: wan (9235): + local 'registration_timeout=0' >> netifd: wan (9235): + uqmi -s -d /dev/cdc-wdm1 --get-serving-system >> netifd: wan (9235): + grep '"searching"' >> netifd: wan (9235): + uqmi -s -d /dev/cdc-wdm1 --get-serving-system >> netifd: wan (9235): + >> registration='{"registration":"not_registered","plmn_mcc":208,"plmn_mnc":20,"plmn_description":"","roaming":true}' >> netifd: wan (9235): + '[' -n ] >> netifd: wan (9235): + echo 'Starting network wan' >> >> As the while loop checks only "searching" pattern, uqmi.sh script >> quits >> searching loop and continues whereas the modem is not registered >> >> Other issue, after X seconds modem stops searching. >> netifd: wan (9213): + uqmi -s -d /dev/cdc-wdm0 --get-serving-system >> netifd: wan (9213): + grep '"searching"' >> netifd: wan (9213): + '[' -e /dev/cdc-wdm0 ] >> netifd: wan (9213): + '[' 3 -lt 0 -o 0 '=' 0 ] >> netifd: wan (9213): + let registration_timeout++ >> netifd: wan (9213): + sleep 1 >> netifd: wan (9213): + uqmi -s -d /dev/cdc-wdm0 --get-serving-system >> netifd: wan (9213): + grep '"searching"' >> netifd: wan (9213): + uqmi -s -d /dev/cdc-wdm0 --get-serving-system >> netifd: wan (9213): + registration='{"registration":"not_registered"}' >> netifd: wan (9213): + '[' -n ] >> netifd: wan (9213): + echo 'Starting network wan' >> netifd: wan (9213): Starting network wan >> >> If registration_timeout is not expired, registration can be restarted >> >> Signed-off-by: Thomas Richard <thomas.richard@kontron.com> >> --- >> package/network/utils/uqmi/Makefile | 2 +- >> .../utils/uqmi/files/lib/netifd/proto/qmi.sh | 35 >> ++++++++++++++++------ >> 2 files changed, 27 insertions(+), 10 deletions(-) >> >> diff --git a/package/network/utils/uqmi/Makefile >> b/package/network/utils/uqmi/Makefile >> index 68958a3729..da54ba0f46 100644 >> --- a/package/network/utils/uqmi/Makefile >> +++ b/package/network/utils/uqmi/Makefile >> @@ -1,7 +1,7 @@ >> include $(TOPDIR)/rules.mk >> >> PKG_NAME:=uqmi >> -PKG_RELEASE:=2 >> +PKG_RELEASE:=3 >> >> PKG_SOURCE_PROTO:=git >> PKG_SOURCE_URL=$(PROJECT_GIT)/project/uqmi.git >> diff --git a/package/network/utils/uqmi/files/lib/netifd/proto/qmi.sh >> b/package/network/utils/uqmi/files/lib/netifd/proto/qmi.sh >> index a6c785eb56..c0134f44dd 100755 >> --- a/package/network/utils/uqmi/files/lib/netifd/proto/qmi.sh >> +++ b/package/network/utils/uqmi/files/lib/netifd/proto/qmi.sh >> @@ -209,19 +209,36 @@ proto_qmi_setup() { >> >> uqmi -s -d "$device" --sync > /dev/null 2>&1 >> >> + uqmi -s -d "$device" --network-register > /dev/null 2>&1 >> + >> echo "Waiting for network registration" >> + sleep 1 >> local registration_timeout=0 >> - while uqmi -s -d "$device" --get-serving-system | grep '"searching"' >> > /dev/null; do >> - [ -e "$device" ] || return 1 >> - if [ "$registration_timeout" -lt "$timeout" -o "$timeout" = "0" ]; >> then >> - let registration_timeout++ >> - sleep 1; >> + local registration_state="" >> + while true; do >> + registration_state=$(uqmi -s -d "$device" --get-serving-system >> 2>/dev/null | jsonfilter -e "@.registration" 2>/dev/null) >> + >> + [ "$registration_state" = "registered" ] && break >> + >> + if [ "$registration_state" = "searching" ] || [ >> "$registration_state" = "not_registered" ]; then >> + if [ "$registration_timeout" -lt "$timeout" ] || [ "$timeout" = >> "0" ]; then >> + [ "$registration_state" = "searching" ] || { >> + echo "Device stopped network registration. Restart network >> registration" >> + uqmi -s -d "$device" --network-register > /dev/null 2>&1 >> + } >> + let registration_timeout++ >> + sleep 1 >> + continue >> + fi >> + echo "Network registration failed, registration timeout reached" >> else >> - echo "Network registration failed" >> - proto_notify_error "$interface" NETWORK_REGISTRATION_FAILED >> - proto_block_restart "$interface" >> - return 1 >> + # registration_state is 'registration_denied' or 'unknown' or '' >> + echo "Network registration failed (reason: '$registration_state')" >> fi >> + >> + proto_notify_error "$interface" NETWORK_REGISTRATION_FAILED >> + proto_block_restart "$interface" >> + return 1 >> done >> >> [ -n "$modes" ] && uqmi -s -d "$device" --set-network-modes "$modes" >> > /dev/null 2>&1 > > _______________________________________________ > openwrt-devel mailing list > openwrt-devel@lists.openwrt.org > https://lists.openwrt.org/mailman/listinfo/openwrt-devel
On 10-05-21, Florian Eckert wrote: > > > On 2021-05-08 12:33, Baptiste Jonglez wrote: > > Applied, thanks. > > > > Does this need to be backported to 21.02 or even 19.07? > > yes that would not be bad at least for openwrt-21.02 > On openwrt-19.07 there are additional commits needed. Ok, then I won't touch 19.07, unless uqmi support is really broken. I've backported this patch to 21.02. > Thanks for take care > > > > > Baptiste > > > > On 20-04-21, thomas.richard@kontron.com wrote: > > > From: Thomas Richard <thomas.richard@kontron.com> > > > > > > With some debug in qmi.sh using following patch, some errors are > > > visible > > > in the registration step > > > @@ -29,6 +29,7 @@ proto_qmi_init_config() { > > > } > > > > > > proto_qmi_setup() { > > > + set -x > > > local interface="$1" > > > local dataformat connstat plmn_mode mcc mnc > > > local device apn auth username password pincode delay modes > > > pdptype > > > @@ -224,6 +225,8 @@ proto_qmi_setup() { > > > fi > > > done > > > > > > + registration=$(uqmi -s -d "$device" --get-serving-system) > > > + > > > [ -n "$modes" ] && uqmi -s -d "$device" --set-network-modes > > > "$modes" > /dev/null 2>&1 > > > > > > echo "Starting network $interface" > > > > > > During the boot of the system, modem could not start automatically its > > > network registration. > > > netifd: wan (9235): + echo 'Waiting for network registration' > > > netifd: wan (9235): Waiting for network registration > > > netifd: wan (9235): + local 'registration_timeout=0' > > > netifd: wan (9235): + uqmi -s -d /dev/cdc-wdm1 --get-serving-system > > > netifd: wan (9235): + grep '"searching"' > > > netifd: wan (9235): + uqmi -s -d /dev/cdc-wdm1 --get-serving-system > > > netifd: wan (9235): + registration='{"registration":"not_registered","plmn_mcc":208,"plmn_mnc":20,"plmn_description":"","roaming":true}' > > > netifd: wan (9235): + '[' -n ] > > > netifd: wan (9235): + echo 'Starting network wan' > > > > > > As the while loop checks only "searching" pattern, uqmi.sh script > > > quits > > > searching loop and continues whereas the modem is not registered > > > > > > Other issue, after X seconds modem stops searching. > > > netifd: wan (9213): + uqmi -s -d /dev/cdc-wdm0 --get-serving-system > > > netifd: wan (9213): + grep '"searching"' > > > netifd: wan (9213): + '[' -e /dev/cdc-wdm0 ] > > > netifd: wan (9213): + '[' 3 -lt 0 -o 0 '=' 0 ] > > > netifd: wan (9213): + let registration_timeout++ > > > netifd: wan (9213): + sleep 1 > > > netifd: wan (9213): + uqmi -s -d /dev/cdc-wdm0 --get-serving-system > > > netifd: wan (9213): + grep '"searching"' > > > netifd: wan (9213): + uqmi -s -d /dev/cdc-wdm0 --get-serving-system > > > netifd: wan (9213): + registration='{"registration":"not_registered"}' > > > netifd: wan (9213): + '[' -n ] > > > netifd: wan (9213): + echo 'Starting network wan' > > > netifd: wan (9213): Starting network wan > > > > > > If registration_timeout is not expired, registration can be restarted > > > > > > Signed-off-by: Thomas Richard <thomas.richard@kontron.com> > > > --- > > > package/network/utils/uqmi/Makefile | 2 +- > > > .../utils/uqmi/files/lib/netifd/proto/qmi.sh | 35 > > > ++++++++++++++++------ > > > 2 files changed, 27 insertions(+), 10 deletions(-) > > > > > > diff --git a/package/network/utils/uqmi/Makefile > > > b/package/network/utils/uqmi/Makefile > > > index 68958a3729..da54ba0f46 100644 > > > --- a/package/network/utils/uqmi/Makefile > > > +++ b/package/network/utils/uqmi/Makefile > > > @@ -1,7 +1,7 @@ > > > include $(TOPDIR)/rules.mk > > > > > > PKG_NAME:=uqmi > > > -PKG_RELEASE:=2 > > > +PKG_RELEASE:=3 > > > > > > PKG_SOURCE_PROTO:=git > > > PKG_SOURCE_URL=$(PROJECT_GIT)/project/uqmi.git > > > diff --git > > > a/package/network/utils/uqmi/files/lib/netifd/proto/qmi.sh > > > b/package/network/utils/uqmi/files/lib/netifd/proto/qmi.sh > > > index a6c785eb56..c0134f44dd 100755 > > > --- a/package/network/utils/uqmi/files/lib/netifd/proto/qmi.sh > > > +++ b/package/network/utils/uqmi/files/lib/netifd/proto/qmi.sh > > > @@ -209,19 +209,36 @@ proto_qmi_setup() { > > > > > > uqmi -s -d "$device" --sync > /dev/null 2>&1 > > > > > > + uqmi -s -d "$device" --network-register > /dev/null 2>&1 > > > + > > > echo "Waiting for network registration" > > > + sleep 1 > > > local registration_timeout=0 > > > - while uqmi -s -d "$device" --get-serving-system | grep > > > '"searching"' > /dev/null; do > > > - [ -e "$device" ] || return 1 > > > - if [ "$registration_timeout" -lt "$timeout" -o "$timeout" = "0" > > > ]; then > > > - let registration_timeout++ > > > - sleep 1; > > > + local registration_state="" > > > + while true; do > > > + registration_state=$(uqmi -s -d "$device" --get-serving-system > > > 2>/dev/null | jsonfilter -e "@.registration" 2>/dev/null) > > > + > > > + [ "$registration_state" = "registered" ] && break > > > + > > > + if [ "$registration_state" = "searching" ] || [ > > > "$registration_state" = "not_registered" ]; then > > > + if [ "$registration_timeout" -lt "$timeout" ] || [ "$timeout" = > > > "0" ]; then > > > + [ "$registration_state" = "searching" ] || { > > > + echo "Device stopped network registration. Restart network > > > registration" > > > + uqmi -s -d "$device" --network-register > /dev/null 2>&1 > > > + } > > > + let registration_timeout++ > > > + sleep 1 > > > + continue > > > + fi > > > + echo "Network registration failed, registration timeout reached" > > > else > > > - echo "Network registration failed" > > > - proto_notify_error "$interface" NETWORK_REGISTRATION_FAILED > > > - proto_block_restart "$interface" > > > - return 1 > > > + # registration_state is 'registration_denied' or 'unknown' or '' > > > + echo "Network registration failed (reason: '$registration_state')" > > > fi > > > + > > > + proto_notify_error "$interface" NETWORK_REGISTRATION_FAILED > > > + proto_block_restart "$interface" > > > + return 1 > > > done > > > > > > [ -n "$modes" ] && uqmi -s -d "$device" --set-network-modes > > > "$modes" > /dev/null 2>&1 > > > > _______________________________________________ > > openwrt-devel mailing list > > openwrt-devel@lists.openwrt.org > > https://lists.openwrt.org/mailman/listinfo/openwrt-devel > > _______________________________________________ > openwrt-devel mailing list > openwrt-devel@lists.openwrt.org > https://lists.openwrt.org/mailman/listinfo/openwrt-devel
diff --git a/package/network/utils/uqmi/Makefile b/package/network/utils/uqmi/Makefile index 68958a3729..da54ba0f46 100644 --- a/package/network/utils/uqmi/Makefile +++ b/package/network/utils/uqmi/Makefile @@ -1,7 +1,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=uqmi -PKG_RELEASE:=2 +PKG_RELEASE:=3 PKG_SOURCE_PROTO:=git PKG_SOURCE_URL=$(PROJECT_GIT)/project/uqmi.git diff --git a/package/network/utils/uqmi/files/lib/netifd/proto/qmi.sh b/package/network/utils/uqmi/files/lib/netifd/proto/qmi.sh index a6c785eb56..c0134f44dd 100755 --- a/package/network/utils/uqmi/files/lib/netifd/proto/qmi.sh +++ b/package/network/utils/uqmi/files/lib/netifd/proto/qmi.sh @@ -209,19 +209,36 @@ proto_qmi_setup() { uqmi -s -d "$device" --sync > /dev/null 2>&1 + uqmi -s -d "$device" --network-register > /dev/null 2>&1 + echo "Waiting for network registration" + sleep 1 local registration_timeout=0 - while uqmi -s -d "$device" --get-serving-system | grep '"searching"' > /dev/null; do - [ -e "$device" ] || return 1 - if [ "$registration_timeout" -lt "$timeout" -o "$timeout" = "0" ]; then - let registration_timeout++ - sleep 1; + local registration_state="" + while true; do + registration_state=$(uqmi -s -d "$device" --get-serving-system 2>/dev/null | jsonfilter -e "@.registration" 2>/dev/null) + + [ "$registration_state" = "registered" ] && break + + if [ "$registration_state" = "searching" ] || [ "$registration_state" = "not_registered" ]; then + if [ "$registration_timeout" -lt "$timeout" ] || [ "$timeout" = "0" ]; then + [ "$registration_state" = "searching" ] || { + echo "Device stopped network registration. Restart network registration" + uqmi -s -d "$device" --network-register > /dev/null 2>&1 + } + let registration_timeout++ + sleep 1 + continue + fi + echo "Network registration failed, registration timeout reached" else - echo "Network registration failed" - proto_notify_error "$interface" NETWORK_REGISTRATION_FAILED - proto_block_restart "$interface" - return 1 + # registration_state is 'registration_denied' or 'unknown' or '' + echo "Network registration failed (reason: '$registration_state')" fi + + proto_notify_error "$interface" NETWORK_REGISTRATION_FAILED + proto_block_restart "$interface" + return 1 done [ -n "$modes" ] && uqmi -s -d "$device" --set-network-modes "$modes" > /dev/null 2>&1