Project

General

Profile

Feature #2308

prepare GPRS for osmo-gsm-tester: try to use ofono to connect to an osmocom GPRS service

Added by neels 5 months ago. Updated about 1 month ago.

Status:
In Progress
Priority:
Urgent
Assignee:
Target version:
-
Start date:
05/30/2017
Due date:
% Done:

0%

Spec Reference:

Description

To prepare adding GPRS to the osmo-gsm-tester, manually run a local GSM network with data services and try querying some URL using ofono and a modem (e.g. the Sierra Wireless model, then the EC20 and Gobi). Does ofono work?


Related issues

Related to OsmoGSMTester - Feature #2202: osmo-gsm-tester: add GPRS data services In Progress 04/26/2017

History

#1 Updated by pespin 5 months ago

  • Assignee set to osmo-gsm-tester

#2 Updated by pespin 4 months ago

  • Status changed from New to In Progress
  • Assignee changed from osmo-gsm-tester to pespin

#3 Updated by pespin 4 months ago

I have a Sysmobts+network setup on my desktop (gsm+gprs), and a Sierra Wireless modem.

I power on the modem correct, and register to the bts successfully:

mdbus2 -s org.ofono /sierra_1 org.ofono.Modem.SetProperty Powered true
mdbus2 -s org.ofono /sierra_1 org.ofono.Modem.SetProperty Online true
sleep 3
mdbus2 -s org.ofono /sierra_1 org.ofono.NetworkRegistration.Scan
mdbus2 -s org.ofono /sierra_1 org.ofono.NetworkRegistration.Register
sleep 5
mdbus2 -s org.ofono /sierra_1 org.ofono.NetworkRegistration.Getproperties

After that, I check that the GPRS side is powered, attached and roaming is allowed (Powered=true, Attached=true, RoamingAllowed=true):

mdbus2 -s org.ofono /sierra_1 org.ofono.ConnectionManager.GetProperties
({'Attached': <true>, 'Bearer': <'none'>, 'RoamingAllowed': <true>, 'Powered': <true>, 'Suspended': <false>},)

Then I get the GPRS contexts:

mdbus2 -s org.ofono /sierra_1 org.ofono.ConnectionManager.GetContexts
([('/sierra_1/context1', {'Name': <'Internet'>, 'Active': <false>, 'Type': <'internet'>, 'Protocol': <'ip'>, 'AccessPointName': <''>, 'Username': <''>, 'Password': <''>, 'AuthenticationMethod': <'chap'>, 'Settings': <@a{sv} {}>, 'IPv6.Settings': <@a{sv} {}>})],)

To manage the context, you use the path retrieve in GetContexts: /sierra_1/context1
To Active the context, I then use the following, which fails. While failing the modem is advertised to the kernel as a new device:

mdbus2 -s org.ofono /sierra_3/context1 org.ofono.ConnectionContext.SetProperty Active true
[ERR]: GDBus.Error:org.ofono.Error.Failed: Operation failed

This is what dmesg shows up while calling the failing Active method (usb disconnects + re-connects as new device):

[27027.512675] usb 4-1.2: USB disconnect, device number 8
[27027.513972] qcserial ttyUSB1: Qualcomm USB modem converter now disconnected from ttyUSB1
[27027.514017] qcserial 4-1.2:1.0: device disconnected
[27027.514457] qcserial ttyUSB2: Qualcomm USB modem converter now disconnected from ttyUSB2
[27027.514495] qcserial 4-1.2:1.2: device disconnected
[27027.514881] qcserial ttyUSB3: Qualcomm USB modem converter now disconnected from ttyUSB3
[27027.514919] qcserial 4-1.2:1.3: device disconnected
[27027.515140] qmi_wwan 4-1.2:1.8 wwp0s29u1u2i8: unregister 'qmi_wwan' usb-0000:00:1d.0-1.2, WWAN/QMI device
[27027.541988] qmi_wwan 4-1.2:1.10 wwp0s29u1u2i10: unregister 'qmi_wwan' usb-0000:00:1d.0-1.2, WWAN/QMI device
[27038.726981] usb 4-1.2: new high-speed USB device number 9 using ehci-pci
[27038.827876] usb 4-1.2: config 1 has an invalid interface number: 8 but max is 5
[27038.827881] usb 4-1.2: config 1 has an invalid interface number: 10 but max is 5
[27038.827884] usb 4-1.2: config 1 has an invalid interface number: 11 but max is 5
[27038.827887] usb 4-1.2: config 1 has no interface number 1
[27038.827889] usb 4-1.2: config 1 has no interface number 4
[27038.827891] usb 4-1.2: config 1 has no interface number 5
[27038.830329] qcserial 4-1.2:1.0: Qualcomm USB modem converter detected
[27038.830655] usb 4-1.2: Qualcomm USB modem converter now attached to ttyUSB1
[27038.831138] qcserial 4-1.2:1.2: Qualcomm USB modem converter detected
[27038.831285] usb 4-1.2: Qualcomm USB modem converter now attached to ttyUSB2
[27038.831698] qcserial 4-1.2:1.3: Qualcomm USB modem converter detected
[27038.831863] usb 4-1.2: Qualcomm USB modem converter now attached to ttyUSB3
[27038.832544] qmi_wwan 4-1.2:1.8: cdc-wdm0: USB WDM device
[27038.832960] qmi_wwan 4-1.2:1.8 wwan0: register 'qmi_wwan' at usb-0000:00:1d.0-1.2, WWAN/QMI device, 5a:83:ee:4d:06:f3
[27038.836286] qmi_wwan 4-1.2:1.10: cdc-wdm3: USB WDM device
[27038.836774] qmi_wwan 4-1.2:1.10 wwan1: register 'qmi_wwan' at usb-0000:00:1d.0-1.2, WWAN/QMI device, 5a:83:ee:4d:06:f3

This is what I get in ofonod -d -n while calling that method (basically udev telling ofono that the device is no longer available and that a new one is available):

ofonod[15404]: drivers/qmimodem/gprs-context.c:qmi_activate_primary() cid 1

ofonod[15404]: plugins/udevng.c:remove_device() /sys/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.2/4-1.2
:1.0/ttyUSB1/tty/ttyUSB1
ofonod[15404]: plugins/udevng.c:destroy_modem() /sys/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.2
ofonod[15404]: src/modem.c:ofono_modem_remove() 0x1f98850
ofonod[15404]: src/modem.c:modem_unregister() 0x1f98850
ofonod[15404]: src/modem.c:modem_change_state() old state: 3, new state: 0
ofonod[15404]: src/modem.c:flush_atoms()
ofonod[15404]: src/gprs.c:gprs_context_unregister() 0x1f700d0, 0x1f6fdc0
ofonod[15404]: src/gprs.c:gprs_context_remove() atom: 0x1f70140
ofonod[15404]: drivers/qmimodem/gprs-context.c:qmi_gprs_context_remove()
ofonod[15404]: plugins/bluez5.c:bt_unregister_profile() Bluetooth: Unregistering profile /bluetooth/profi
le/dun_gw
ofonod[15404]: src/gprs.c:gprs_unregister() 0x1f6fdc0
ofonod[15404]: src/network.c:__ofono_netreg_remove_status_watch() 0x1f95b00
ofonod[15404]: src/gprs.c:gprs_remove() atom: 0x1f6fe70
ofonod[15404]: drivers/qmimodem/gprs.c:qmi_gprs_remove()
ofonod[15404]: src/ussd.c:ussd_remove() atom: 0x1f98bb0
ofonod[15404]: drivers/qmimodem/ussd.c:qmi_ussd_remove()
ofonod[15404]: src/sim.c:ofono_sim_remove_spn_watch() 0x1f98580
ofonod[15404]: src/network.c:netreg_remove() atom: 0x1f981b0
ofonod[15404]: drivers/qmimodem/network-registration.c:qmi_netreg_remove()
ofonod[15404]: plugins/push-notification.c:push_notification_cleanup() 0x1f6dbb0
ofonod[15404]: plugins/smart-messaging.c:smart_messaging_cleanup() 0x1f98950
ofonod[15404]: src/sms.c:sms_remove() atom: 0x1f1a2c0
ofonod[15404]: drivers/qmimodem/sms.c:qmi_sms_remove()
ofonod[15404]: src/radio-settings.c:radio_settings_remove() atom: 0x1f739f0
ofonod[15404]: drivers/qmimodem/radio-settings.c:qmi_radio_settings_remove()
ofonod[15404]: src/phonebook.c:phonebook_remove() atom: 0x1f739c0
ofonod[15404]: src/stk.c:stk_remove() atom: 0x1f73950
ofonod[15404]: src/location-reporting.c:location_reporting_remove() atom: 0x1f421d0
ofonod[15404]: drivers/qmimodem/location-reporting.c:qmi_location_reporting_remove()
ofonod[15404]: src/voicecall.c:voicecall_remove() atom: 0x1f6bc30
ofonod[15404]: drivers/qmimodem/voicecall.c:qmi_voicecall_remove()
ofonod[15404]: plugins/bluez5.c:bt_unregister_profile() Bluetooth: Unregistering profile /bluetooth/profi
le/hfp_ag
ofonod[15404]: src/sim.c:sim_remove() atom: 0x1f6d860
ofonod[15404]: drivers/qmimodem/sim.c:qmi_sim_remove()
ofonod[15404]: src/modem.c:devinfo_remove() atom: 0x1f6ed80
ofonod[15404]: drivers/qmimodem/devinfo.c:qmi_devinfo_remove()
ofonod[15404]: plugins/gobi.c:gobi_disable() 0x1f98850
ofonod[15404]: src/modem.c:get_modem_property() modem 0x1f98850 property AlwaysOnline
ofonod[15404]: plugins/gobi.c:gobi_remove() 0x1f98850
ofonod[15404]: src/modem.c:unregister_property() property 0x1f1e110
ofonod[15404]: src/modem.c:unregister_property() property 0x1f951e0
ofonod[15404]: src/modem.c:unregister_property() property 0x1f6db40
ofonod[15404]: src/modem.c:unregister_property() property 0x1f6ee50
ofonod[15404]: src/modem.c:unregister_property() property 0x1f6eb50
ofonod[15404]: src/modem.c:emit_modem_removed() 0x1f98850
ofonod[15404]: src/modem.c:call_modemwatches() 0x1f98850 added:0
ofonod[15404]: plugins/dun_gw_bluez5.c:modem_watch() modem: 0x1f98850, added: 0
ofonod[15404]: plugins/hfp_ag_bluez5.c:modem_watch() modem: 0x1f98850, added: 0
ofonod[15404]: plugins/smart-messaging.c:modem_watch() modem: 0x1f98850, added: 0
ofonod[15404]: plugins/push-notification.c:modem_watch() modem: 0x1f98850, added: 0
ofonod[15404]: plugins/udevng.c:destroy_modem() /dev/ttyUSB1
ofonod[15404]: plugins/udevng.c:destroy_modem() /dev/ttyUSB2
ofonod[15404]: plugins/udevng.c:destroy_modem() /dev/ttyUSB3
ofonod[15404]: plugins/udevng.c:destroy_modem() wwp0s29u1u2i8
ofonod[15404]: plugins/udevng.c:destroy_modem() /dev/cdc-wdm0
ofonod[15404]: plugins/udevng.c:destroy_modem() wwp0s29u1u2i10
ofonod[15404]: plugins/udevng.c:destroy_modem() /dev/cdc-wdm3
ofonod[15404]: plugins/udevng.c:remove_device() /sys/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.2/4-1.2
:1.3/ttyUSB3/tty/ttyUSB3
ofonod[15404]: plugins/udevng.c:remove_device() /sys/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.2/4-1.2
:1.0
ofonod[15404]: plugins/udevng.c:remove_device() /sys/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.2/4-1.2
:1.2/ttyUSB2/tty/ttyUSB2
ofonod[15404]: plugins/udevng.c:remove_device() /sys/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.2/4-1.2
:1.2
ofonod[15404]: plugins/udevng.c:remove_device() /sys/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.2/4-1.2
:1.3
ofonod[15404]: plugins/udevng.c:remove_device() /sys/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.2/4-1.2
:1.8/net/wwp0s29u1u2i8
ofonod[15404]: plugins/udevng.c:remove_device() /sys/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.2/4-1.2
:1.8/usbmisc/cdc-wdm0
ofonod[15404]: plugins/udevng.c:remove_device() /sys/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.2/4-1.2
:1.8
ofonod[15404]: plugins/udevng.c:remove_device() /sys/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.2/4-1.2
:1.10/net/wwp0s29u1u2i10
ofonod[15404]: plugins/bluez5.c:unregister_profile_cb()
ofonod[15404]: plugins/bluez5.c:unregister_profile_cb()
ofonod[15404]: plugins/udevng.c:remove_device() /sys/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.2/4-1.2
:1.10/usbmisc/cdc-wdm3
ofonod[15404]: plugins/udevng.c:remove_device() /sys/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.2/4-1.2
:1.11
ofonod[15404]: plugins/udevng.c:remove_device() /sys/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.2/4-1.2
:1.10
ofonod[15404]: plugins/udevng.c:remove_device() /sys/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.2
ofonod[15404]: plugins/udevng.c:check_usb_device() usb [8087:0024]
ofonod[15404]: plugins/udevng.c:check_usb_device() qcserial [1199:68c0]
ofonod[15404]: plugins/udevng.c:check_usb_device() qcserial [1199:68c0]
ofonod[15404]: plugins/udevng.c:check_usb_device() qcserial [1199:68c0]
ofonod[15404]: plugins/udevng.c:add_device() /sys/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.2
ofonod[15404]: plugins/udevng.c:add_device() /sys/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.2/4-1.2:1.
3/ttyUSB3/tty/ttyUSB3
ofonod[15404]: plugins/udevng.c:add_device() /dev/ttyUSB3 (sierra) 255/0/0 [03] ==> (null) (null)
ofonod[15404]: plugins/udevng.c:check_usb_device() qcserial [1199:68c0]
ofonod[15404]: plugins/udevng.c:check_usb_device() qcserial [1199:68c0]
ofonod[15404]: plugins/udevng.c:add_device() /sys/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.2
ofonod[15404]: plugins/udevng.c:add_device() /sys/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.2/4-1.2:1.
0/ttyUSB1/tty/ttyUSB1
ofonod[15404]: plugins/udevng.c:add_device() /dev/ttyUSB1 (sierra) 255/255/255 [00] ==> (null) (null)
ofonod[15404]: plugins/udevng.c:check_usb_device() usb [1199:68c0]
ofonod[15404]: plugins/udevng.c:check_usb_device() qmi_wwan [1199:68c0]
ofonod[15404]: plugins/udevng.c:check_usb_device() qcserial [1199:68c0]
ofonod[15404]: plugins/udevng.c:add_device() /sys/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.2
ofonod[15404]: plugins/udevng.c:add_device() /sys/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.2/4-1.2:1.
2/ttyUSB2/tty/ttyUSB2
ofonod[15404]: plugins/udevng.c:add_device() /dev/ttyUSB2 (sierra) 255/0/0 [02] ==> (null) (null)
ofonod[15404]: plugins/udevng.c:check_usb_device() qmi_wwan [1199:68c0]
ofonod[15404]: plugins/udevng.c:check_usb_device() qmi_wwan [1199:68c0]
ofonod[15404]: plugins/udevng.c:add_device() /sys/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.2
ofonod[15404]: plugins/udevng.c:add_device() /sys/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.2/4-1.2:1.
10/usbmisc/cdc-wdm3
ofonod[15404]: plugins/udevng.c:add_device() /dev/cdc-wdm3 (sierra) 255/255/255 [0a] ==> (null) (null)
ofonod[15404]: plugins/udevng.c:check_usb_device() qmi_wwan [1199:68c0]
ofonod[15404]: plugins/udevng.c:add_device() /sys/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.2
ofonod[15404]: plugins/udevng.c:add_device() /sys/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.2/4-1.2:1.
8/usbmisc/cdc-wdm0
ofonod[15404]: plugins/udevng.c:add_device() /dev/cdc-wdm0 (sierra) 255/255/255 [08] ==> (null) (null)
ofonod[15404]: plugins/udevng.c:check_usb_device() qmi_wwan [1199:68c0]
ofonod[15404]: plugins/udevng.c:add_device() /sys/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.2
ofonod[15404]: plugins/udevng.c:add_device() /sys/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.2/4-1.2:1.10/net/wwp0s29u1u2i10
ofonod[15404]: plugins/udevng.c:add_device() wwp0s29u1u2i10 (sierra) 255/255/255 [0a] ==> (null) (null)
ofonod[15404]: plugins/udevng.c:check_usb_device() qmi_wwan [1199:68c0]
ofonod[15404]: plugins/udevng.c:add_device() /sys/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.2
ofonod[15404]: plugins/udevng.c:add_device() /sys/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.2/4-1.2:1.8/net/wwp0s29u1u2i8
ofonod[15404]: plugins/udevng.c:add_device() wwp0s29u1u2i8 (sierra) 255/255/255 [08] ==> (null) (null)
ofonod[15404]: plugins/udevng.c:check_modem_list()
ofonod[15404]: plugins/udevng.c:create_modem() /sys/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.2
ofonod[15404]: plugins/udevng.c:create_modem() driver=sierra
ofonod[15404]: src/modem.c:ofono_modem_create() name: (null), type: sierra
ofonod[15404]: plugins/udevng.c:setup_sierra() /sys/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.2
ofonod[15404]: plugins/udevng.c:setup_sierra() /dev/ttyUSB1 255/255/255 00 (null) tty
ofonod[15404]: plugins/udevng.c:setup_sierra() /dev/ttyUSB2 255/0/0 02 (null) tty
ofonod[15404]: plugins/udevng.c:setup_sierra() /dev/ttyUSB3 255/0/0 03 (null) tty
ofonod[15404]: plugins/udevng.c:setup_sierra() wwp0s29u1u2i8 255/255/255 08 (null) net
ofonod[15404]: plugins/udevng.c:setup_sierra() /dev/cdc-wdm0 255/255/255 08 (null) usbmisc
ofonod[15404]: plugins/udevng.c:setup_sierra() wwp0s29u1u2i10 255/255/255 0a (null) net
ofonod[15404]: plugins/udevng.c:setup_sierra() /dev/cdc-wdm3 255/255/255 0a (null) usbmisc
ofonod[15404]: src/modem.c:ofono_modem_set_driver() type: gobi
ofonod[15404]: plugins/udevng.c:setup_sierra() modem=(null) app=(null) net=wwp0s29u1u2i10 diag=(null) qmi=/dev/cdc-wdm3
ofonod[15404]: src/modem.c:set_modem_property() modem 0x1f73800 property Device
ofonod[15404]: src/modem.c:set_modem_property() modem 0x1f73800 property Modem
ofonod[15404]: src/modem.c:set_modem_property() modem 0x1f73800 property App
ofonod[15404]: src/modem.c:set_modem_property() modem 0x1f73800 property Diag
ofonod[15404]: src/modem.c:set_modem_property() modem 0x1f73800 property NetworkInterface
ofonod[15404]: src/modem.c:ofono_modem_register() 0x1f73800
ofonod[15404]: plugins/gobi.c:gobi_probe() 0x1f73800
ofonod[15404]: src/modem.c:emit_modem_added() 0x1f73800
ofonod[15404]: src/modem.c:call_modemwatches() 0x1f73800 added:1
ofonod[15404]: plugins/dun_gw_bluez5.c:modem_watch() modem: 0x1f73800, added: 1
ofonod[15404]: plugins/hfp_ag_bluez5.c:modem_watch() modem: 0x1f73800, added: 1
ofonod[15404]: plugins/smart-messaging.c:modem_watch() modem: 0x1f73800, added: 1
ofonod[15404]: plugins/push-notification.c:modem_watch() modem: 0x1f73800, added: 1

#4 Updated by neels 4 months ago

  • Priority changed from Normal to Urgent

#5 Updated by neels 4 months ago

I remember someone has found a weird situation trying to use 3G data services with a UMTS stick. Might be completely unrelated, but worth a look: http://lists.osmocom.org/pipermail/openbsc/2017-April/010506.html

#6 Updated by neels 3 months ago

  • Related to Feature #2202: osmo-gsm-tester: add GPRS data services added

#7 Updated by lynxis 3 months ago

with a public operator using an EC20 it works for me. I guess it's a firmware problems within the Sierra modems. I've have to look with QMI traces.

@pespin: better try a gobi2000 or an ec20

#8 Updated by pespin about 2 months ago

For reference, mdbus2 crashes when trying to SetProperty on $MODEM/contex1. I had to use busctl, and the syntax is a bit more cumbersome:

pespin ~/dev/git/ofono $ busctl --system call org.ofono /gobi_0/context1 org.ofono.ConnectionContext SetProperty sv "AccessPointName" s "apnbla" 
pespin ~/dev/git/ofono $ busctl --system call org.ofono /gobi_0/context1 org.ofono.ConnectionContext SetProperty sv "Username" s "apnuser" 

#9 Updated by pespin about 2 months ago

Activating the context works with gobi, and I can successfully reach internet. Ofono only creates the network device, but doesn't configure it. It is responsibility of the user to set up the network as desired. Information required can be gathered using the following:

$ mdbus2 -s org.ofono /gobi_0 org.ofono.ConnectionManager.GetProperties
({'Attached': <false>, 'RoamingAllowed': <true>, 'Powered': <true>},)
$ mdbus2 -s org.ofono /gobi_0 org.ofono.ConnectionManager.SetProperty RoamingAllowed true
()
$ mdbus2 -s org.ofono /gobi_0 org.ofono.ConnectionManager.GetContexts
([('/gobi_0/context1', {'Name': <'Internet'>, 'Active': <false>, 'Type': <'internet'>, 'Protocol': <'ip'>, 'AccessPointName': <'apnbla'>, 'Username': <'apnuser'>, 'Password': <''>, 'AuthenticationMethod': <'chap'>, 'Settings': <@a{sv} {}>, 'IPv6.Settings': <@a{sv} {}>})],)
$ mdbus2 -s org.ofono /gobi_0/context1 org.ofono.ConnectionContext.GetProperties
({'Name': <'Internet'>, 'Active': <false>, 'Type': <'internet'>, 'Protocol': <'ip'>, 'AccessPointName': <'apnbla'>, 'Username': <'apnuser'>, 'Password': <''>, 'AuthenticationMethod': <'chap'>, 'Settings': <@a{sv} {}>, 'IPv6.Settings': <@a{sv} {}>},)
$ mdbus2 -s org.ofono /gobi_0/context1 org.ofono.ConnectionContext.SetProperty Active true
$ mdbus2 -s org.ofono /gobi_0/context1 org.ofono.ConnectionContext.GetProperties
({'Name': <'Internet'>, 'Active': <true>, 'Type': <'internet'>, 'Protocol': <'ip'>, 'AccessPointName': <'apnbla'>, 'Username': <'apnuser'>, 'Password': <''>, 'AuthenticationMethod': <'chap'>, 'Settings': <{'Interface': <'wwp0s29u1u2'>, 'Method': <'static'>, 'Address': <'10.23.42.4'>, 'Netmask': <'255.255.255.252'>, 'Gateway': <'10.23.42.5'>, 'DomainNameServers': <['8.8.8.4', '8.8.8.4']>}>, 'IPv6.Settings': <@a{sv} {}>},)

So, in this case user needs to set up ip 10.23.42.4 for device wwp0s29u1u2, and set up routing manually to work with it.

The main problem here is how to do the routing correctly. The routing path in my case is the following:

PC:wwp0s29u1u2 --> modem ---> Um:BTS:Gb ---> enp0s25:SGSN:tun0(lo) --> tun0(lo):GGSN:enp14s0u1 --> Internet

Which means packets sent to the modem (wwp0s29u1u2) must and will have IP addr 10.23.42.4. Once the packet gets out in GGSN, it will still have that IP and will try to send it again to wwp0s29u1u2 instead of enp14s0u1. I still need to check if I can play with iif and oof and ip rule to make it work.

I first tried moving the modem interface to its own net namespace with specific route to use modem as default route. This way I can run commands inside the netns which route traffic through the modem and as GGSN runs in the default namespace with different routing, everything works nice. Here's the script:

#!/bin/bash
set -x
MODEM_IFACE=wwp0s29u1u2 #known from ofono API
MODEM_IP=10.23.42.3 #known from ofono API
MODEM_NETMASK=24 #known from ofono API
GGSN_TUN_IP=10.23.42.1 #known from osmo-gsm-tester API
NS=myns # random ns

run_ns() {
        ip netns exec $NS $@
}

ip netns add $NS
ip link set dev $MODEM_IFACE netns $NS

run_ns ip link set $MODEM_IFACE up
run_ns ip addr add $MODEM_IP/$MODEM_NETMASK dev $MODEM_IFACE
run_ns ip route add default via $GGSN_TUN_IP dev $MODEM_IFACE
run_ns ip route get 8.8.8.8
run_ns ping -c 10 8.8.8.8
run_ns wget -O wget -O - http://google.com

However, as soon as we move the modem device to another namespace that the one ofono is running in (ip link set dev $MODEM_IFACE netns $NS), then udev notified ofono that the interface is gone and then ofono considers the modem is gone, and the modem cannot be reached anymore through ofono API:

ofonod[1981]: plugins/udevng.c:remove_device() /sys/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.2/4-1.2:1.0/net/wwp0s29u1u2
ofonod[1981]: plugins/udevng.c:destroy_modem() /sys/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.2
ofonod[1981]: src/modem.c:ofono_modem_remove() 0x55a39d14ebc0
ofonod[1981]: src/modem.c:modem_unregister() 0x55a39d14ebc0
ofonod[1981]: src/modem.c:modem_change_state() old state: 3, new state: 0
ofonod[1981]: src/modem.c:flush_atoms()
ofonod[1981]: src/gprs.c:gprs_context_unregister() 0x55a39d160db0, 0x55a39d161000
ofonod[1981]: src/gprs.c:gprs_context_remove() atom: 0x55a39d149800
ofonod[1981]: drivers/qmimodem/gprs-context.c:qmi_gprs_context_remove()
ofonod[1981]: plugins/bluez5.c:bt_unregister_profile() Bluetooth: Unregistering profile /bluetooth/profile/dun_gw
ofonod[1981]: src/gprs.c:gprs_unregister() 0x55a39d161000
ofonod[1981]: src/network.c:__ofono_netreg_remove_status_watch() 0x55a39d152340
ofonod[1981]: src/gprs.c:gprs_remove() atom: 0x55a39d1610b0
ofonod[1981]: drivers/qmimodem/gprs.c:qmi_gprs_remove()
ofonod[1981]: src/sim.c:ofono_sim_remove_spn_watch() 0x55a39d161900
ofonod[1981]: src/network.c:netreg_remove() atom: 0x55a39d14abe0
ofonod[1981]: drivers/qmimodem/network-registration.c:qmi_netreg_remove()
ofonod[1981]: plugins/push-notification.c:push_notification_cleanup() 0x55a39d13bc60
ofonod[1981]: plugins/smart-messaging.c:smart_messaging_cleanup() 0x55a39d13bc00
ofonod[1981]: src/sms.c:sms_remove() atom: 0x55a39d14a060
ofonod[1981]: drivers/qmimodem/sms.c:qmi_sms_remove()
ofonod[1981]: src/radio-settings.c:radio_settings_remove() atom: 0x55a39d1645a0
ofonod[1981]: drivers/qmimodem/radio-settings.c:qmi_radio_settings_remove()
ofonod[1981]: src/stk.c:stk_remove() atom: 0x55a39d164570
ofonod[1981]: src/location-reporting.c:location_reporting_remove() atom: 0x55a39d1614e0
ofonod[1981]: drivers/qmimodem/location-reporting.c:qmi_location_reporting_remove()
ofonod[1981]: src/sim.c:sim_remove() atom: 0x55a39d161ab0
ofonod[1981]: drivers/qmimodem/sim-legacy.c:qmi_sim_remove()
ofonod[1981]: src/modem.c:devinfo_remove() atom: 0x55a39d125800
ofonod[1981]: drivers/qmimodem/devinfo.c:qmi_devinfo_remove()
ofonod[1981]: plugins/gobi.c:gobi_disable() 0x55a39d14ebc0
ofonod[1981]: src/modem.c:get_modem_property() modem 0x55a39d14ebc0 property AlwaysOnline
ofonod[1981]: plugins/gobi.c:gobi_remove() 0x55a39d14ebc0
ofonod[1981]: src/modem.c:unregister_property() property 0x55a39d126b30
ofonod[1981]: src/modem.c:unregister_property() property 0x55a39d143160
ofonod[1981]: src/modem.c:unregister_property() property 0x55a39d14eda0
ofonod[1981]: src/modem.c:unregister_property() property 0x55a39d14ed10
ofonod[1981]: src/modem.c:emit_modem_removed() 0x55a39d14ebc0
ofonod[1981]: src/modem.c:call_modemwatches() 0x55a39d14ebc0 added:0
ofonod[1981]: plugins/dun_gw_bluez5.c:modem_watch() modem: 0x55a39d14ebc0, added: 0
ofonod[1981]: plugins/hfp_ag_bluez5.c:modem_watch() modem: 0x55a39d14ebc0, added: 0
ofonod[1981]: plugins/smart-messaging.c:modem_watch() modem: 0x55a39d14ebc0, added: 0
ofonod[1981]: plugins/push-notification.c:modem_watch() modem: 0x55a39d14ebc0, added: 0
ofonod[1981]: plugins/udevng.c:destroy_modem() /dev/cdc-wdm0
ofonod[1981]: plugins/udevng.c:destroy_modem() wwp0s29u1u2
ofonod[1981]: plugins/udevng.c:destroy_modem() /dev/ttyUSB1
ofonod[1981]: plugins/udevng.c:destroy_modem() /dev/ttyUSB2
ofonod[1981]: plugins/udevng.c:destroy_modem() /dev/ttyUSB3
ofonod[1981]: plugins/bluez5.c:unregister_profile_cb()

Which adds a new constraint: Ofono must run in the same netnamespace as the devices it created. Which also means that all modems must run in the same net namespace.

#10 Updated by pespin about 2 months ago

It seems ofono cannot run in a netns due to issues with libudev when trying to find the device.

I opened a bug report in systemd to track the issue: https://github.com/systemd/systemd/issues/6713

summary: systemd-udev (running in default netns) tracks state in /run/udev/data/ files. When the iface is moved to the netns, they remove a file associated with that iface in that directory. Then, ofono runs inside the netns and uses libgudev (->libudev) to find the net device, and althrough /sys/* stuff is correct, libudev fails because it also uses its own (/run/udev/data/) file which is not there.

As a result, modem is not detected when ofono runs inside a netns and the modem interface is modem inside that netns too.

#11 Updated by pespin about 2 months ago

For now it seems the best idea is to have:
- osmo-gsm-tester process + ofono process + modem interfaces in default netns
- Move at least OpenGGSn process created from osmo-gsm-tester into its own temporary netns.
- Have a "Server" object class inside osmo-gsm-tester which will handle different server services (eg http server), and that will be spawned in the same temporary netns (non-default one).
- For each modem interface available, allocate an extra IP for the server and assign it to the server network interface, eg: 5 modem network devices --> 5 IPS: 1.1.1.1, 1.1.1.2, 1.1.1.3, 1.1.1.4, 1.1.1.5
- When ofono provides us with PDP context information (ie. IP to set for the modem net device + gw), set a route rule on the default netns to match one of the IPs of the server with the modem interface, eg:

ip route add 1.1.1.1 via modem1_gateway device modem1_iface src modem1_ip
ip route add 1.1.1.2 via modem2_gateway device modem2_iface src modem2_ip
ip route add 1.1.1.3 via modem3_gateway device modem3_iface src modem3_ip
... where modemX_* is provided by ofono API.

this way:
ping 1.1.1.1 --> traffic goes through modem1_iface and modem1_ip is set as src IP by the kernel.
ping 1.1.1.2 --> traffic goes through modem2_iface and modem2_ip is set as src IP by the kernel.
ping 1.1.1.3 --> traffic goes through modem3_iface and modem3_ip is set as src IP by the kernel.
...

Then, when packets get out of the GGSN, as it is on a different netns, those routes are not there, which means other routing can apply. In essence, we want to route all traffic 1.1.1.X to the server running in the same namespace.

#12 Updated by pespin about 1 month ago

Speaking with Harald it seems to be possible to run stuff into a new net namespace without need to be root by using user namespaces with unishare. This are the required steps:

$ echo "1" > /proc/sys/kernel/unprivileged_userns_clone
$ unshare -n -U -r "/bin/bash"

If required, persistent namespace with a name (similar to what ip netns does) can be created using the value for -n parameter:

       -n, --net[=file]
              Unshare the network namespace.  If file is specified, then a persistent namespace is created by a bind mount.

Also available in: Atom PDF