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 8cbe9e97e7..4aadd57813 100755 | |
--- a/package/network/utils/uqmi/files/lib/netifd/proto/qmi.sh | |
+++ b/package/network/utils/uqmi/files/lib/netifd/proto/qmi.sh | |
@@ -19,6 +19,7 @@ proto_qmi_init_config() { | |
proto_config_add_string modes | |
proto_config_add_string pdptype | |
proto_config_add_int profile | |
+ proto_config_add_boolean dhcp | |
proto_config_add_boolean dhcpv6 | |
proto_config_add_boolean autoconnect | |
proto_config_add_int plmn | |
@@ -31,13 +32,14 @@ proto_qmi_setup() { | |
local interface="$1" | |
local dataformat connstat | |
local device apn auth username password pincode delay modes pdptype | |
- local profile dhcpv6 autoconnect plmn timeout mtu $PROTO_DEFAULT_OPTIONS | |
- local ip4table ip6table | |
+ local profile dhcp dhcpv6 autoconnect plmn timeout mtu | |
+ local $PROTO_DEFAULT_OPTIONS ip4table ip6table | |
local cid_4 pdh_4 cid_6 pdh_6 | |
+ local ip subnet gateway dns1 dns2 | |
local ip_6 ip_prefix_length gateway_6 dns1_6 dns2_6 | |
json_get_vars device apn auth username password pincode delay modes | |
- json_get_vars pdptype profile dhcpv6 autoconnect plmn ip4table | |
+ json_get_vars pdptype profile dhcp dhcpv6 autoconnect plmn ip4table | |
json_get_vars ip6table timeout mtu $PROTO_DEFAULT_OPTIONS | |
[ "$timeout" = "" ] && timeout="10" | |
@@ -353,15 +355,36 @@ proto_qmi_setup() { | |
} | |
[ -n "$pdh_4" ] && { | |
- json_init | |
- json_add_string name "${interface}_4" | |
- json_add_string ifname "@$interface" | |
- json_add_string proto "dhcp" | |
- [ -n "$ip4table" ] && json_add_string ip4table "$ip4table" | |
- proto_add_dynamic_defaults | |
- [ -n "$zone" ] && json_add_string zone "$zone" | |
- json_close_object | |
- ubus call network add_dynamic "$(json_dump)" | |
+ if [ "$dhcp" = 0 ]; then | |
+ json_load "$(uqmi -s -d $device --set-client-id wds,$cid_4 --get-current-settings)" | |
+ json_select ipv4 | |
+ json_get_vars ip subnet gateway dns1 dns2 | |
+ | |
+ proto_init_update "$ifname" 1 | |
+ proto_set_keep 1 | |
+ proto_add_ipv4_address "$ip" "$subnet" | |
+ [ "$defaultroute" = 0 ] || proto_add_ipv4_route "0.0.0.0" 0 "$gateway" | |
+ [ "$peerdns" = 0 ] || { | |
+ proto_add_dns_server "$dns1" | |
+ proto_add_dns_server "$dns2" | |
+ } | |
+ [ -n "$zone" ] && { | |
+ proto_add_data | |
+ json_add_string zone "$zone" | |
+ proto_close_data | |
+ } | |
+ proto_send_update "$interface" | |
+ else | |
+ json_init | |
+ json_add_string name "${interface}_4" | |
+ json_add_string ifname "@$interface" | |
+ json_add_string proto "dhcp" | |
+ [ -n "$ip4table" ] && json_add_string ip4table "$ip4table" | |
+ proto_add_dynamic_defaults | |
+ [ -n "$zone" ] && json_add_string zone "$zone" | |
+ json_close_object | |
+ ubus call network add_dynamic "$(json_dump)" | |
+ fi | |
} | |
} | |
These changes are working?
Yes, they're what I use on my own 4G router for the farm. They're a diff against an OpenWRT snapshot from Dec 2019 though, so there may be upstream updates that conflict by now. At some point I should build a new version and update…
The diff would be easy to recreate if it's outdated/broken against newer versions. The two arms of the if [ "$dhcp" = 0 ]
are (respectively) the non-dhcpv6 version of the pdh_6 setup ported to ipv4, and the existing dhcp4 code.
This line json_load "$(uqmi -s -d $device --set-client-id wds,$cid_4 --get-current-settings)" return below json output
{
"pdp-type": "ipv4-or-ipv6",
"ip-family": "ipv4",
"mtu": 263644,
"ipv4": {
"ip": "0.84.112.109",
"dns1": "0.4.21.46",
"dns2": "0.4.160.7",
"gateway": "100.84.112.110",
"subnet": "0.4.33.252"
},
"ipv6": {
},
"domain-names": {
}
}
The ip addresses are incorrect and the interface is not able to ping outer network.
Interesting, for my Quectel EP06-E card, uqmi --get-current-settings
does give the correct network config, which is why I'm able to use it.
# uqmi -d /dev/cdc-wdm0 --get-current-settings
{
"pdp-type": "ipv4",
"ip-family": "ipv4",
"mtu": 1500,
"ipv4": {
"ip": "10.25.110.223",
"dns1": "10.206.128.1",
"dns2": "10.206.128.1",
"gateway": "10.25.110.224",
"subnet": "255.255.255.192"
},
"ipv6": {
},
"domain-names": {
}
}
If you get nonsense values back from uqmi --get-current-settings
, you're right that you won't be able to use it to avoid the need for a dhcp client.
Even this page is saying that it should get correct ip address.
http://trac.gateworks.com/wiki/wireless/modem
On my device with callbox sim card i am able to fetch proper ip addresses.
uqmi -d /dev/cdc-wdm0 --get-current-settings
{
"pdp-type": "ipv4",
"ip-family": "ipv4",
"mtu": 1500,
"ipv4": {
"ip": "192.168.2.6",
"dns1": "8.8.8.8",
"gateway": "192.168.2.5",
"subnet": "255.255.255.252"
},
"ipv6": {
},
"domain-names": {
}
}
But with live operator sim card its weird output. I think its class A ip network.
A brief follow-up: I've just rebuilt my router firmware using the openwrt-22.03 branch (the most recent tag at the time of writing is v22.03.0-rc5), and this patch is no longer needed after 21.02 as 9ebbb551 reintroduces ipv4 qmi autoconf in exactly the same way as my patch.
These changes are working?