From c447d84164186a4690000e3a097c65a734bb25bb Mon Sep 17 00:00:00 2001 From: Lorn Potter Date: Sat, 12 Apr 2014 13:23:07 +1000 Subject: [PATCH] Squashed 'connman/' changes from 075e1bb..97c3189 97c3189 Release 1.22 86373b4 dnsproxy: Check split routing when creating a server 27dba28 gdbus: Add g_dbus_client_set_ready_watch() 8bc2a4e dnsproxy: Destroy list using g_list_free_full a33522d AUTHORS: Mention Maneesh's contributions 5ecc2a1 doc: Add API documentation about WiFi P2P Peer 48d43a8 test: Add method related to P2P services 73f8579 gsupplicant: Fix WPS sync-up error with wpa_supplicant e5c6a34 session: Set state to disconnected when deactivating a session ee485f6 service: Use connect reason from the failed service 90334bf session: Don't sent disconnects to sessions when updating 9d727fd session: Disconnect on configuration or session change dd3492f session: Allow Session Connect and Disconnect be called multiple times 3b6f9c2 client: Allow Session Connect and Disconnect be called multiple times e377722 session: Remove session, not service, from session list 2dba966 session: Do not remove non existing policy routing tables aae5825 session: Do no create two instances of struct connman_service_info 76cb209 session: Update active sessions only on Session Connect and Disconnect ddf176a nfacct: Remove support for NFACCT fa4176b session: Remove unused NFACCT rules 32e260c session_policy_local: Do not use NULL as key to do a hash table lookup 404c4a4 stats: Use bool type instead integer 47b56b8 session: Update session state only after activation has been tried 3cf2e18 session: Expand '*' to all bearer types 027cbb0 AUTHORS: Mention Andrew's contributions 844286e doc: Update connection managment algorithm 4990bf7 test: Add a script to test P2P through wpa_supplicant DBus if a1d11b7 test: Remove useless supplicant's old DBus interface test script 095a8f7 gdhcp: Refactor renew/rebind method cd2c5c5 gdbus: Replace g_timeout_add with g_idle_add c42a5f9 gdbus: Fix incorrect DBusConnection reference counting 72cc087 gdbus: Fix memory leak 12aad90 ntp: Exponential backoff when timeouting a sent message eef5afa ntp: Support Kiss-of-Death packet aed46d8 service: Check session policy before autoconnect is run. 0f76471 session: Add session policy autoconnect support 0e8b339 session: Make session policy global 1f7f926 session: Assign a service to sessions d4cadd8 service: Disconnect on when last session is deactivated 5280685 service: Add connect reason to debug out in auto connnect 1a24280 service: Add connect reason to __connman_serice_auto_connect() afd8f2d service: Add connect reason to __connman_service_connect() 88b837e session: Mark session active or inactive 470013d session: Remove service selection implementation ec09003 Add Gadget session and weighting support. 1a831b6 AUTHORS: Mention Glenn's and Jonathan's contributions 996cbf1 src: Let systemd unmount remote filesystems before stopping connman a587af9 src: Add D-Bus autostart configuration file 6ad4048 plugins: Add networking support to gadget plugin. c09371c src: Introduce define for CONNMAN_NETWORK_TYPE_GADGET. 9abdf5f plugins: Refactor Gadget into separate plugin and file. 1e4e965 AUTHORS: Mention Hannu's contributions 30e16a1 ntp: Only accept NTP packets from the defined time server a29da8c wispr: Handle wispr redirect properly 23fdeed inet: Eliminate misleading error logging cb88f96 AUTHORS: Mention Philippe's contributions 089e52f README: Update recommended wpa_supplicant version and web page info 3bb94d4 gdhcp: Factor out DHCP Request sending bd37ce0 Add REBOOTING state support for dhcp client 289c7fc gsupplicant: Rely on wpa_supplicant retry mechanism 9e59cc8 AUTHORS: Mention Alban's contributions 82ad017 config: add ifb in NetworkInterfaceBlacklist default 63aeaf6 src: Add Eduroam network .config file 0d7ad08 doc: Fix formatting 2ca6fb4 dnsproxy: Enable added DNS servers only for the default service 4f04f75 service: Add helper function for detecting a default service index 7b415b9 test: Add script for setting timezone fefd145 client: Add initial completion for config and session commands bd03493 client: Add support for monitor command completion 12c6a7a client: Add completion for tether command f27040c client: Add on/off completion support for agent modes 95d42a7 client: Complete only one service or technology where appropriate bee4ba8 client: Add helper function for ending readline completion 27088b9 client: Remove extra string duplication when completing commands 0f1dee2 client: Export command line word count function git-subtree-dir: connman git-subtree-split: 97c31890592867cc047154bc385d97620c3bb2f0 --- connman/.gitignore => .gitignore | 0 .gitmodules | 3 - connman/.mailmap => .mailmap | 0 connman/AUTHORS => AUTHORS | 7 + connman/COPYING => COPYING | 0 connman/ChangeLog => ChangeLog | 8 + connman/HACKING => HACKING | 0 connman/INSTALL => INSTALL | 0 connman/Makefile.am => Makefile.am | 11 +- connman/Makefile.plugins => Makefile.plugins | 5 + connman/NEWS => NEWS | 0 connman/README => README | 12 +- connman/TODO => TODO | 0 connman/acinclude.m4 => acinclude.m4 | 0 connman/bootstrap => bootstrap | 0 ...bootstrap-configure => bootstrap-configure | 0 {connman/client => client}/agent.c | 0 {connman/client => client}/agent.h | 0 {connman/client => client}/commands.c | 173 ++- {connman/client => client}/commands.h | 0 {connman/client => client}/dbus_helpers.c | 0 {connman/client => client}/dbus_helpers.h | 0 {connman/client => client}/input.c | 29 +- {connman/client => client}/input.h | 2 + {connman/client => client}/main.c | 0 {connman/client => client}/services.c | 0 {connman/client => client}/services.h | 0 connman/configure.ac => configure.ac | 16 +- connman/connman.pc.in => connman.pc.in | 0 connman/.build-timestamp | 0 connman/doc/session-overview.txt | 145 -- connman/src/connman.service.in | 15 - connman/test/test-supplicant | 71 - .../doc => doc}/advanced-configuration.txt | 0 {connman/doc => doc}/agent-api.txt | 0 {connman/doc => doc}/backtrace.txt | 0 {connman/doc => doc}/behavior-api.txt | 0 {connman/doc => doc}/clock-api.txt | 0 {connman/doc => doc}/coding-style.txt | 0 {connman/doc => doc}/config-format.txt | 11 +- {connman/doc => doc}/connman.8 | 0 {connman/doc => doc}/connman.conf.5 | 2 +- {connman/doc => doc}/connmanctl.1 | 0 {connman/doc => doc}/counter-api.txt | 0 {connman/doc => doc}/ipconfig-api.txt | 0 {connman/doc => doc}/manager-api.txt | 29 + {connman/doc => doc}/overview-api.txt | 0 doc/peer-api.txt | 49 + {connman/doc => doc}/plugin-api.txt | 0 {connman/doc => doc}/service-api.txt | 0 {connman/doc => doc}/session-api.txt | 0 doc/session-overview.txt | 94 ++ {connman/doc => doc}/technology-api.txt | 4 + {connman/doc => doc}/valgrind.suppressions | 0 {connman/doc => doc}/vpn-agent-api.txt | 0 {connman/doc => doc}/vpn-config-format.txt | 0 {connman/doc => doc}/vpn-connection-api.txt | 0 {connman/doc => doc}/vpn-manager-api.txt | 0 {connman/doc => doc}/vpn-overview.txt | 0 {connman/gdbus => gdbus}/client.c | 17 + {connman/gdbus => gdbus}/gdbus.h | 4 +- {connman/gdbus => gdbus}/mainloop.c | 15 +- {connman/gdbus => gdbus}/object.c | 2 + {connman/gdbus => gdbus}/polkit.c | 0 {connman/gdbus => gdbus}/watch.c | 0 {connman/gdhcp => gdhcp}/client.c | 303 ++-- {connman/gdhcp => gdhcp}/common.c | 0 {connman/gdhcp => gdhcp}/common.h | 0 {connman/gdhcp => gdhcp}/gdhcp.h | 0 {connman/gdhcp => gdhcp}/ipv4ll.c | 0 {connman/gdhcp => gdhcp}/ipv4ll.h | 0 {connman/gdhcp => gdhcp}/server.c | 0 {connman/gdhcp => gdhcp}/unaligned.h | 0 {connman/gsupplicant => gsupplicant}/dbus.c | 0 {connman/gsupplicant => gsupplicant}/dbus.h | 0 .../gsupplicant => gsupplicant}/gsupplicant.h | 0 .../gsupplicant => gsupplicant}/supplicant.c | 2 +- {connman/gweb => gweb}/giognutls.c | 0 {connman/gweb => gweb}/giognutls.h | 0 {connman/gweb => gweb}/gionotls.c | 0 {connman/gweb => gweb}/gresolv.c | 0 {connman/gweb => gweb}/gresolv.h | 0 {connman/gweb => gweb}/gweb.c | 0 {connman/gweb => gweb}/gweb.h | 0 {connman/include => include}/agent.h | 0 {connman/include => include}/dbus.h | 0 {connman/include => include}/device.h | 0 {connman/include => include}/inet.h | 0 {connman/include => include}/inotify.h | 0 {connman/include => include}/ipaddress.h | 0 {connman/include => include}/ipconfig.h | 0 {connman/include => include}/log.h | 0 {connman/include => include}/network.h | 1 + {connman/include => include}/notifier.h | 0 {connman/include => include}/option.h | 0 {connman/include => include}/plugin.h | 0 {connman/include => include}/provider.h | 0 {connman/include => include}/provision.h | 0 {connman/include => include}/proxy.h | 0 {connman/include => include}/resolver.h | 0 {connman/include => include}/rtnl.h | 0 {connman/include => include}/service.h | 8 +- {connman/include => include}/session.h | 2 + {connman/include => include}/setting.h | 3 - {connman/include => include}/storage.h | 0 {connman/include => include}/task.h | 0 {connman/include => include}/technology.h | 1 - {connman/include => include}/timeserver.h | 0 {connman/include => include}/utsname.h | 0 {connman/include => include}/version.h.in | 0 {connman/include => include}/vpn-dbus.h | 0 {connman/plugins => plugins}/bluetooth.c | 0 .../plugins => plugins}/bluetooth_legacy.c | 0 .../plugins => plugins}/connman-nmcompat.conf | 0 {connman/plugins => plugins}/dundee.c | 0 {connman/plugins => plugins}/ethernet.c | 219 +-- plugins/gadget.c | 349 +++++ {connman/plugins => plugins}/hh2serial-gps.c | 0 {connman/plugins => plugins}/iospm.c | 0 {connman/plugins => plugins}/loopback.c | 0 {connman/plugins => plugins}/mcc.h | 0 {connman/plugins => plugins}/neard.c | 0 {connman/plugins => plugins}/nmcompat.c | 0 {connman/plugins => plugins}/ofono.c | 21 +- {connman/plugins => plugins}/pacrunner.c | 0 {connman/plugins => plugins}/polkit.c | 0 {connman/plugins => plugins}/polkit.policy | 0 .../session_policy_local.c | 4 +- {connman/plugins => plugins}/tist.c | 0 {connman/plugins => plugins}/vpn.c | 0 {connman/plugins => plugins}/wifi.c | 6 +- rpm/connman.spec | 179 --- rpm/connman.tracing | 1 - rpm/main.conf | 4 - {connman/scripts => scripts}/connman.in | 0 {connman/scripts => scripts}/libppp-plugin.c | 0 .../scripts => scripts}/openconnect-script.c | 0 {connman/scripts => scripts}/openvpn-script.c | 0 {connman/src => src}/6to4.c | 6 +- {connman/src => src}/agent-connman.c | 99 -- {connman/src => src}/agent.c | 18 +- {connman/src => src}/bridge.c | 0 {connman/src => src}/clock.c | 0 {connman/src => src}/config.c | 28 +- {connman/src => src}/connection.c | 0 {connman/src => src}/connman-dbus.conf | 3 - {connman/src => src}/connman-polkit.conf | 0 {connman/src => src}/connman.h | 52 +- src/connman.service.in | 14 + {connman/src => src}/connman.ver | 0 {connman/src => src}/counter.c | 2 - {connman/src => src}/dbus.c | 0 {connman/src => src}/detect.c | 0 {connman/src => src}/device.c | 4 +- {connman/src => src}/dhcp.c | 0 {connman/src => src}/dhcpv6.c | 0 {connman/src => src}/dnsproxy.c | 55 +- src/eduroam.config | 5 + {connman/src => src}/error.c | 0 {connman/src => src}/firewall.c | 0 {connman/src => src}/genbuiltin | 0 {connman/src => src}/inet.c | 5 +- {connman/src => src}/inotify.c | 0 {connman/src => src}/ipaddress.c | 0 {connman/src => src}/ipconfig.c | 26 +- {connman/src => src}/ippool.c | 0 {connman/src => src}/iptables.c | 0 {connman/src => src}/log.c | 4 +- {connman/src => src}/main.c | 66 +- {connman/src => src}/main.conf | 8 +- {connman/src => src}/manager.c | 57 - {connman/src => src}/nat.c | 0 src/net.connman.service.in | 5 + {connman/src => src}/network.c | 11 +- src/nfacct.c | 379 ----- {connman/src => src}/notifier.c | 4 +- {connman/src => src}/ntp.c | 39 +- {connman/src => src}/plugin.c | 0 {connman/src => src}/provider.c | 0 {connman/src => src}/proxy.c | 0 {connman/src => src}/resolver.c | 0 {connman/src => src}/rfkill.c | 0 {connman/src => src}/rtnl.c | 19 +- {connman/src => src}/service.c | 661 +++------ {connman/src => src}/session.c | 1309 +++++------------ {connman/src => src}/shared/debugfs.c | 0 {connman/src => src}/shared/debugfs.h | 0 src/shared/nfacct.c | 352 ----- src/shared/nfacct.h | 47 - src/shared/nfnetlink_acct_copy.h | 39 - {connman/src => src}/shared/sha1.c | 0 {connman/src => src}/shared/sha1.h | 0 {connman/src => src}/shared/util.c | 0 {connman/src => src}/shared/util.h | 0 {connman/src => src}/stats.c | 219 +-- {connman/src => src}/storage.c | 0 {connman/src => src}/task.c | 0 {connman/src => src}/technology.c | 25 +- {connman/src => src}/tethering.c | 0 {connman/src => src}/timeserver.c | 0 {connman/src => src}/timezone.c | 0 {connman/src => src}/utsname.c | 0 {connman/src => src}/wispr.c | 12 +- {connman/src => src}/wpad.c | 0 {connman/test => test}/backtrace | 0 {connman/test => test}/connect-provider | 0 {connman/test => test}/disable-tethering | 0 {connman/test => test}/enable-tethering | 0 {connman/test => test}/get-global-timeservers | 0 {connman/test => test}/get-proxy-autoconfig | 0 {connman/test => test}/get-services | 0 {connman/test => test}/get-state | 0 {connman/test => test}/list-services | 0 {connman/test => test}/monitor-connman | 0 {connman/test => test}/monitor-services | 0 {connman/test => test}/monitor-vpn | 0 test/p2p-on-supplicant | 396 +++++ {connman/test => test}/remove-provider | 0 {connman/test => test}/service-move-before | 0 {connman/test => test}/set-clock | 0 {connman/test => test}/set-domains | 0 {connman/test => test}/set-global-timeservers | 0 {connman/test => test}/set-ipv4-method | 0 {connman/test => test}/set-ipv6-method | 0 {connman/test => test}/set-nameservers | 0 {connman/test => test}/set-proxy | 0 {connman/test => test}/set-timeservers | 0 test/set-timezone | 21 + {connman/test => test}/show-introspection | 0 {connman/test => test}/simple-agent | 0 {connman/test => test}/test-clock | 0 {connman/test => test}/test-compat | 0 {connman/test => test}/test-connman | 0 {connman/test => test}/test-counter | 0 {connman/test => test}/test-manager | 0 {connman/test => test}/test-new-supplicant | 0 {connman/test => test}/test-session | 0 {connman/test => test}/vpn-connect | 0 {connman/test => test}/vpn-disconnect | 0 {connman/test => test}/vpn-get | 0 {connman/test => test}/vpn-property | 0 {connman/tools => tools}/addr-test.c | 0 {connman/tools => tools}/dbus-test.c | 0 {connman/tools => tools}/dhcp-server-test.c | 0 {connman/tools => tools}/dhcp-test.c | 0 {connman/tools => tools}/dnsproxy-test.c | 0 {connman/tools => tools}/iptables-test.c | 0 {connman/tools => tools}/iptables-unit.c | 0 {connman/tools => tools}/manager-api.c | 0 tools/netlink-test.c | 240 --- {connman/tools => tools}/polkit-test.c | 0 .../tools => tools}/private-network-test.c | 0 {connman/tools => tools}/resolv-test.c | 0 {connman/tools => tools}/session-api.c | 0 {connman/tools => tools}/session-test.c | 0 {connman/tools => tools}/session-test.h | 0 {connman/tools => tools}/session-utils.c | 0 {connman/tools => tools}/stats-tool.c | 37 +- {connman/tools => tools}/supplicant-dbus.c | 0 {connman/tools => tools}/supplicant-dbus.h | 0 {connman/tools => tools}/supplicant-test.c | 0 {connman/tools => tools}/supplicant.c | 0 {connman/tools => tools}/supplicant.h | 0 {connman/tools => tools}/tap-test.c | 0 {connman/tools => tools}/web-test.c | 0 {connman/tools => tools}/wispr.c | 0 {connman/tools => tools}/wpad-test.c | 0 {connman/unit => unit}/test-ippool.c | 0 {connman/unit => unit}/test-pbkdf2-sha1.c | 0 {connman/unit => unit}/test-prf-sha1.c | 0 upstream | 1 - {connman/vpn => vpn}/connman-task.te | 0 {connman/vpn => vpn}/connman-vpn.conf | 0 {connman/vpn => vpn}/connman-vpn.service.in | 0 {connman/vpn => vpn}/main.c | 0 .../vpn => vpn}/net.connman.vpn.service.in | 0 {connman/vpn => vpn}/plugins/l2tp.c | 0 {connman/vpn => vpn}/plugins/openconnect.c | 0 {connman/vpn => vpn}/plugins/openvpn.c | 0 {connman/vpn => vpn}/plugins/pptp.c | 0 {connman/vpn => vpn}/plugins/vpn.c | 0 {connman/vpn => vpn}/plugins/vpn.h | 0 {connman/vpn => vpn}/plugins/vpnc.c | 0 {connman/vpn => vpn}/vpn-agent.c | 0 {connman/vpn => vpn}/vpn-agent.h | 0 {connman/vpn => vpn}/vpn-config.c | 0 {connman/vpn => vpn}/vpn-dbus.conf | 0 {connman/vpn => vpn}/vpn-ipconfig.c | 4 +- {connman/vpn => vpn}/vpn-manager.c | 0 {connman/vpn => vpn}/vpn-polkit.conf | 0 {connman/vpn => vpn}/vpn-polkit.policy | 0 {connman/vpn => vpn}/vpn-provider.c | 0 {connman/vpn => vpn}/vpn-provider.h | 0 {connman/vpn => vpn}/vpn-rtnl.c | 14 +- {connman/vpn => vpn}/vpn-rtnl.h | 0 {connman/vpn => vpn}/vpn.h | 6 +- {connman/vpn => vpn}/vpn.ver | 0 297 files changed, 2193 insertions(+), 3926 deletions(-) rename connman/.gitignore => .gitignore (100%) delete mode 100644 .gitmodules rename connman/.mailmap => .mailmap (100%) rename connman/AUTHORS => AUTHORS (89%) rename connman/COPYING => COPYING (100%) rename connman/ChangeLog => ChangeLog (99%) rename connman/HACKING => HACKING (100%) rename connman/INSTALL => INSTALL (100%) rename connman/Makefile.am => Makefile.am (98%) rename connman/Makefile.plugins => Makefile.plugins (98%) rename connman/NEWS => NEWS (100%) rename connman/README => README (97%) rename connman/TODO => TODO (100%) rename connman/acinclude.m4 => acinclude.m4 (100%) rename connman/bootstrap => bootstrap (100%) rename connman/bootstrap-configure => bootstrap-configure (100%) rename {connman/client => client}/agent.c (100%) rename {connman/client => client}/agent.h (100%) rename {connman/client => client}/commands.c (94%) rename {connman/client => client}/commands.h (100%) rename {connman/client => client}/dbus_helpers.c (100%) rename {connman/client => client}/dbus_helpers.h (100%) rename {connman/client => client}/input.c (92%) rename {connman/client => client}/input.h (94%) rename {connman/client => client}/main.c (100%) rename {connman/client => client}/services.c (100%) rename {connman/client => client}/services.h (100%) rename connman/configure.ac => configure.ac (97%) rename connman/connman.pc.in => connman.pc.in (100%) delete mode 100644 connman/.build-timestamp delete mode 100644 connman/doc/session-overview.txt delete mode 100644 connman/src/connman.service.in delete mode 100755 connman/test/test-supplicant rename {connman/doc => doc}/advanced-configuration.txt (100%) rename {connman/doc => doc}/agent-api.txt (100%) rename {connman/doc => doc}/backtrace.txt (100%) rename {connman/doc => doc}/behavior-api.txt (100%) rename {connman/doc => doc}/clock-api.txt (100%) rename {connman/doc => doc}/coding-style.txt (100%) rename {connman/doc => doc}/config-format.txt (97%) rename {connman/doc => doc}/connman.8 (100%) rename {connman/doc => doc}/connman.conf.5 (99%) rename {connman/doc => doc}/connmanctl.1 (100%) rename {connman/doc => doc}/counter-api.txt (100%) rename {connman/doc => doc}/ipconfig-api.txt (100%) rename {connman/doc => doc}/manager-api.txt (88%) rename {connman/doc => doc}/overview-api.txt (100%) create mode 100644 doc/peer-api.txt rename {connman/doc => doc}/plugin-api.txt (100%) rename {connman/doc => doc}/service-api.txt (100%) rename {connman/doc => doc}/session-api.txt (100%) create mode 100644 doc/session-overview.txt rename {connman/doc => doc}/technology-api.txt (95%) rename {connman/doc => doc}/valgrind.suppressions (100%) rename {connman/doc => doc}/vpn-agent-api.txt (100%) rename {connman/doc => doc}/vpn-config-format.txt (100%) rename {connman/doc => doc}/vpn-connection-api.txt (100%) rename {connman/doc => doc}/vpn-manager-api.txt (100%) rename {connman/doc => doc}/vpn-overview.txt (100%) rename {connman/gdbus => gdbus}/client.c (98%) rename {connman/gdbus => gdbus}/gdbus.h (98%) rename {connman/gdbus => gdbus}/mainloop.c (96%) rename {connman/gdbus => gdbus}/object.c (99%) rename {connman/gdbus => gdbus}/polkit.c (100%) rename {connman/gdbus => gdbus}/watch.c (100%) rename {connman/gdhcp => gdhcp}/client.c (93%) rename {connman/gdhcp => gdhcp}/common.c (100%) rename {connman/gdhcp => gdhcp}/common.h (100%) rename {connman/gdhcp => gdhcp}/gdhcp.h (100%) rename {connman/gdhcp => gdhcp}/ipv4ll.c (100%) rename {connman/gdhcp => gdhcp}/ipv4ll.h (100%) rename {connman/gdhcp => gdhcp}/server.c (100%) rename {connman/gdhcp => gdhcp}/unaligned.h (100%) rename {connman/gsupplicant => gsupplicant}/dbus.c (100%) rename {connman/gsupplicant => gsupplicant}/dbus.h (100%) rename {connman/gsupplicant => gsupplicant}/gsupplicant.h (100%) rename {connman/gsupplicant => gsupplicant}/supplicant.c (99%) rename {connman/gweb => gweb}/giognutls.c (100%) rename {connman/gweb => gweb}/giognutls.h (100%) rename {connman/gweb => gweb}/gionotls.c (100%) rename {connman/gweb => gweb}/gresolv.c (100%) rename {connman/gweb => gweb}/gresolv.h (100%) rename {connman/gweb => gweb}/gweb.c (100%) rename {connman/gweb => gweb}/gweb.h (100%) rename {connman/include => include}/agent.h (100%) rename {connman/include => include}/dbus.h (100%) rename {connman/include => include}/device.h (100%) rename {connman/include => include}/inet.h (100%) rename {connman/include => include}/inotify.h (100%) rename {connman/include => include}/ipaddress.h (100%) rename {connman/include => include}/ipconfig.h (100%) rename {connman/include => include}/log.h (100%) rename {connman/include => include}/network.h (99%) rename {connman/include => include}/notifier.h (100%) rename {connman/include => include}/option.h (100%) rename {connman/include => include}/plugin.h (100%) rename {connman/include => include}/provider.h (100%) rename {connman/include => include}/provision.h (100%) rename {connman/include => include}/proxy.h (100%) rename {connman/include => include}/resolver.h (100%) rename {connman/include => include}/rtnl.h (100%) rename {connman/include => include}/service.h (95%) rename {connman/include => include}/session.h (97%) rename {connman/include => include}/setting.h (91%) rename {connman/include => include}/storage.h (100%) rename {connman/include => include}/task.h (100%) rename {connman/include => include}/technology.h (97%) rename {connman/include => include}/timeserver.h (100%) rename {connman/include => include}/utsname.h (100%) rename {connman/include => include}/version.h.in (100%) rename {connman/include => include}/vpn-dbus.h (100%) rename {connman/plugins => plugins}/bluetooth.c (100%) rename {connman/plugins => plugins}/bluetooth_legacy.c (100%) rename {connman/plugins => plugins}/connman-nmcompat.conf (100%) rename {connman/plugins => plugins}/dundee.c (100%) rename {connman/plugins => plugins}/ethernet.c (55%) create mode 100644 plugins/gadget.c rename {connman/plugins => plugins}/hh2serial-gps.c (100%) rename {connman/plugins => plugins}/iospm.c (100%) rename {connman/plugins => plugins}/loopback.c (100%) rename {connman/plugins => plugins}/mcc.h (100%) rename {connman/plugins => plugins}/neard.c (100%) rename {connman/plugins => plugins}/nmcompat.c (100%) rename {connman/plugins => plugins}/ofono.c (99%) rename {connman/plugins => plugins}/pacrunner.c (100%) rename {connman/plugins => plugins}/polkit.c (100%) rename {connman/plugins => plugins}/polkit.policy (100%) rename {connman/plugins => plugins}/session_policy_local.c (99%) rename {connman/plugins => plugins}/tist.c (100%) rename {connman/plugins => plugins}/vpn.c (100%) rename {connman/plugins => plugins}/wifi.c (99%) delete mode 100644 rpm/connman.spec delete mode 100644 rpm/connman.tracing delete mode 100644 rpm/main.conf rename {connman/scripts => scripts}/connman.in (100%) rename {connman/scripts => scripts}/libppp-plugin.c (100%) rename {connman/scripts => scripts}/openconnect-script.c (100%) rename {connman/scripts => scripts}/openvpn-script.c (100%) rename {connman/src => src}/6to4.c (98%) rename {connman/src => src}/agent-connman.c (85%) rename {connman/src => src}/agent.c (98%) rename {connman/src => src}/bridge.c (100%) rename {connman/src => src}/clock.c (100%) rename {connman/src => src}/config.c (97%) rename {connman/src => src}/connection.c (100%) rename {connman/src => src}/connman-dbus.conf (87%) rename {connman/src => src}/connman-polkit.conf (100%) rename {connman/src => src}/connman.h (97%) create mode 100644 src/connman.service.in rename {connman/src => src}/connman.ver (100%) rename {connman/src => src}/counter.c (98%) rename {connman/src => src}/dbus.c (100%) rename {connman/src => src}/detect.c (100%) rename {connman/src => src}/device.c (99%) rename {connman/src => src}/dhcp.c (100%) rename {connman/src => src}/dhcpv6.c (100%) rename {connman/src => src}/dnsproxy.c (98%) create mode 100644 src/eduroam.config rename {connman/src => src}/error.c (100%) rename {connman/src => src}/firewall.c (100%) rename {connman/src => src}/genbuiltin (100%) rename {connman/src => src}/inet.c (99%) rename {connman/src => src}/inotify.c (100%) rename {connman/src => src}/ipaddress.c (100%) rename {connman/src => src}/ipconfig.c (99%) rename {connman/src => src}/ippool.c (100%) rename {connman/src => src}/iptables.c (100%) rename {connman/src => src}/log.c (99%) rename {connman/src => src}/main.c (90%) rename {connman/src => src}/main.conf (95%) rename {connman/src => src}/manager.c (87%) rename {connman/src => src}/nat.c (100%) create mode 100644 src/net.connman.service.in rename {connman/src => src}/network.c (99%) delete mode 100644 src/nfacct.c rename {connman/src => src}/notifier.c (100%) rename {connman/src => src}/ntp.c (90%) rename {connman/src => src}/plugin.c (100%) rename {connman/src => src}/provider.c (100%) rename {connman/src => src}/proxy.c (100%) rename {connman/src => src}/resolver.c (100%) rename {connman/src => src}/rfkill.c (100%) rename {connman/src => src}/rtnl.c (99%) rename {connman/src => src}/service.c (92%) rename {connman/src => src}/session.c (64%) rename {connman/src => src}/shared/debugfs.c (100%) rename {connman/src => src}/shared/debugfs.h (100%) delete mode 100644 src/shared/nfacct.c delete mode 100644 src/shared/nfacct.h delete mode 100644 src/shared/nfnetlink_acct_copy.h rename {connman/src => src}/shared/sha1.c (100%) rename {connman/src => src}/shared/sha1.h (100%) rename {connman/src => src}/shared/util.c (100%) rename {connman/src => src}/shared/util.h (100%) rename {connman/src => src}/stats.c (77%) rename {connman/src => src}/storage.c (100%) rename {connman/src => src}/task.c (100%) rename {connman/src => src}/technology.c (98%) rename {connman/src => src}/tethering.c (100%) rename {connman/src => src}/timeserver.c (100%) rename {connman/src => src}/timezone.c (100%) rename {connman/src => src}/utsname.c (100%) rename {connman/src => src}/wispr.c (99%) rename {connman/src => src}/wpad.c (100%) rename {connman/test => test}/backtrace (100%) rename {connman/test => test}/connect-provider (100%) rename {connman/test => test}/disable-tethering (100%) rename {connman/test => test}/enable-tethering (100%) rename {connman/test => test}/get-global-timeservers (100%) rename {connman/test => test}/get-proxy-autoconfig (100%) rename {connman/test => test}/get-services (100%) rename {connman/test => test}/get-state (100%) rename {connman/test => test}/list-services (100%) rename {connman/test => test}/monitor-connman (100%) rename {connman/test => test}/monitor-services (100%) rename {connman/test => test}/monitor-vpn (100%) create mode 100755 test/p2p-on-supplicant rename {connman/test => test}/remove-provider (100%) rename {connman/test => test}/service-move-before (100%) rename {connman/test => test}/set-clock (100%) rename {connman/test => test}/set-domains (100%) rename {connman/test => test}/set-global-timeservers (100%) rename {connman/test => test}/set-ipv4-method (100%) rename {connman/test => test}/set-ipv6-method (100%) rename {connman/test => test}/set-nameservers (100%) rename {connman/test => test}/set-proxy (100%) rename {connman/test => test}/set-timeservers (100%) create mode 100755 test/set-timezone rename {connman/test => test}/show-introspection (100%) rename {connman/test => test}/simple-agent (100%) rename {connman/test => test}/test-clock (100%) rename {connman/test => test}/test-compat (100%) rename {connman/test => test}/test-connman (100%) rename {connman/test => test}/test-counter (100%) rename {connman/test => test}/test-manager (100%) rename {connman/test => test}/test-new-supplicant (100%) rename {connman/test => test}/test-session (100%) rename {connman/test => test}/vpn-connect (100%) rename {connman/test => test}/vpn-disconnect (100%) rename {connman/test => test}/vpn-get (100%) rename {connman/test => test}/vpn-property (100%) rename {connman/tools => tools}/addr-test.c (100%) rename {connman/tools => tools}/dbus-test.c (100%) rename {connman/tools => tools}/dhcp-server-test.c (100%) rename {connman/tools => tools}/dhcp-test.c (100%) rename {connman/tools => tools}/dnsproxy-test.c (100%) rename {connman/tools => tools}/iptables-test.c (100%) rename {connman/tools => tools}/iptables-unit.c (100%) rename {connman/tools => tools}/manager-api.c (100%) rename {connman/tools => tools}/polkit-test.c (100%) rename {connman/tools => tools}/private-network-test.c (100%) rename {connman/tools => tools}/resolv-test.c (100%) rename {connman/tools => tools}/session-api.c (100%) rename {connman/tools => tools}/session-test.c (100%) rename {connman/tools => tools}/session-test.h (100%) rename {connman/tools => tools}/session-utils.c (100%) rename {connman/tools => tools}/stats-tool.c (97%) rename {connman/tools => tools}/supplicant-dbus.c (100%) rename {connman/tools => tools}/supplicant-dbus.h (100%) rename {connman/tools => tools}/supplicant-test.c (100%) rename {connman/tools => tools}/supplicant.c (100%) rename {connman/tools => tools}/supplicant.h (100%) rename {connman/tools => tools}/tap-test.c (100%) rename {connman/tools => tools}/web-test.c (100%) rename {connman/tools => tools}/wispr.c (100%) rename {connman/tools => tools}/wpad-test.c (100%) rename {connman/unit => unit}/test-ippool.c (100%) rename {connman/unit => unit}/test-pbkdf2-sha1.c (100%) rename {connman/unit => unit}/test-prf-sha1.c (100%) delete mode 160000 upstream rename {connman/vpn => vpn}/connman-task.te (100%) rename {connman/vpn => vpn}/connman-vpn.conf (100%) rename {connman/vpn => vpn}/connman-vpn.service.in (100%) rename {connman/vpn => vpn}/main.c (100%) rename {connman/vpn => vpn}/net.connman.vpn.service.in (100%) rename {connman/vpn => vpn}/plugins/l2tp.c (100%) rename {connman/vpn => vpn}/plugins/openconnect.c (100%) rename {connman/vpn => vpn}/plugins/openvpn.c (100%) rename {connman/vpn => vpn}/plugins/pptp.c (100%) rename {connman/vpn => vpn}/plugins/vpn.c (100%) rename {connman/vpn => vpn}/plugins/vpn.h (100%) rename {connman/vpn => vpn}/plugins/vpnc.c (100%) rename {connman/vpn => vpn}/vpn-agent.c (100%) rename {connman/vpn => vpn}/vpn-agent.h (100%) rename {connman/vpn => vpn}/vpn-config.c (100%) rename {connman/vpn => vpn}/vpn-dbus.conf (100%) rename {connman/vpn => vpn}/vpn-ipconfig.c (98%) rename {connman/vpn => vpn}/vpn-manager.c (100%) rename {connman/vpn => vpn}/vpn-polkit.conf (100%) rename {connman/vpn => vpn}/vpn-polkit.policy (100%) rename {connman/vpn => vpn}/vpn-provider.c (100%) rename {connman/vpn => vpn}/vpn-provider.h (100%) rename {connman/vpn => vpn}/vpn-rtnl.c (99%) rename {connman/vpn => vpn}/vpn-rtnl.h (100%) rename {connman/vpn => vpn}/vpn.h (97%) rename {connman/vpn => vpn}/vpn.ver (100%) diff --git a/connman/.gitignore b/.gitignore similarity index 100% rename from connman/.gitignore rename to .gitignore diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index f36ed981f..000000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "upstream"] - path = upstream - url = git://git.kernel.org/pub/scm/network/connman/connman.git diff --git a/connman/.mailmap b/.mailmap similarity index 100% rename from connman/.mailmap rename to .mailmap diff --git a/connman/AUTHORS b/AUTHORS similarity index 89% rename from connman/AUTHORS rename to AUTHORS index d0327494e..56cdd511f 100644 --- a/connman/AUTHORS +++ b/AUTHORS @@ -64,3 +64,10 @@ Mateusz Potrola Jaehyun Kim Zhang Zhengguang Sjoerd Simons +Alban Crequy +Philippe Coval +Hannu Mallat +Glenn Schmottlach +Jonathan Liu +Andrew LeCain +Maneesh Jain diff --git a/connman/COPYING b/COPYING similarity index 100% rename from connman/COPYING rename to COPYING diff --git a/connman/ChangeLog b/ChangeLog similarity index 99% rename from connman/ChangeLog rename to ChangeLog index 591c827ea..4de85f31e 100644 --- a/connman/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +ver 1.22: + Fix issue with WPS state synchronization. + Fix issue with DNS servers and default service. + Fix issue with DHCP client and rebooting state. + Add support for NTP exponential backoff handling. + Add support for NTP kiss-of-death packet handling. + Add support for Ethernet gadget networking. + ver 1.21: Fix issue with WiFi networks and zero SSID length. Fix issue with security details for hidden WiFi networks. diff --git a/connman/HACKING b/HACKING similarity index 100% rename from connman/HACKING rename to HACKING diff --git a/connman/INSTALL b/INSTALL similarity index 100% rename from connman/INSTALL rename to INSTALL diff --git a/connman/Makefile.am b/Makefile.am similarity index 98% rename from connman/Makefile.am rename to Makefile.am index 283e32437..b2778cc6a 100644 --- a/connman/Makefile.am +++ b/Makefile.am @@ -43,9 +43,7 @@ gweb_sources += gweb/giognutls.h gweb/gionotls.c endif shared_sources = src/shared/util.h src/shared/util.c \ - src/shared/netlink.h src/shared/netlink.c \ - src/shared/nfacct.h src/shared/nfacct.c \ - src/shared/nfnetlink_acct_copy.h + src/shared/netlink.h src/shared/netlink.c if DATAFILES @@ -107,7 +105,7 @@ src_connmand_SOURCES = $(gdhcp_sources) $(gweb_sources) \ src/session.c src/tethering.c src/wpad.c src/wispr.c \ src/stats.c src/iptables.c src/dnsproxy.c src/6to4.c \ src/ippool.c src/bridge.c src/nat.c src/ipaddress.c \ - src/inotify.c src/firewall.c src/nfacct.c src/ipv6pd.c + src/inotify.c src/firewall.c src/ipv6pd.c src_connmand_LDADD = gdbus/libgdbus-internal.la $(builtin_libadd) \ @GLIB_LIBS@ @DBUS_LIBS@ @XTABLES_LIBS@ @GNUTLS_LIBS@ \ @@ -347,7 +345,7 @@ test_scripts = test/get-state test/list-services \ test/test-counter test/set-ipv4-method test/set-ipv6-method \ test/get-services test/get-proxy-autoconfig test/set-proxy \ test/enable-tethering test/disable-tethering test/backtrace \ - test/test-session test/test-supplicant \ + test/test-session test/p2p-on-supplicant \ test/test-new-supplicant test/service-move-before \ test/set-global-timeservers test/get-global-timeservers \ test/set-nameservers test/set-domains test/set-timeservers \ @@ -375,7 +373,8 @@ EXTRA_DIST += doc/overview-api.txt doc/behavior-api.txt \ doc/vpn-manager-api.txt doc/vpn-overview.txt \ doc/session-policy-format.txt -EXTRA_DIST += src/main.conf +EXTRA_DIST += src/main.conf \ + src/eduroam.config MANUAL_PAGES += doc/connman.8 doc/connman.conf.5 diff --git a/connman/Makefile.plugins b/Makefile.plugins similarity index 98% rename from connman/Makefile.plugins rename to Makefile.plugins index ce5089d67..cf0f9a822 100644 --- a/connman/Makefile.plugins +++ b/Makefile.plugins @@ -16,6 +16,11 @@ builtin_modules += ethernet builtin_sources += plugins/ethernet.c endif +if GADGET +builtin_modules += gadget +builtin_sources += plugins/gadget.c +endif + gsupplicant_sources = gsupplicant/gsupplicant.h gsupplicant/dbus.h \ gsupplicant/supplicant.c gsupplicant/dbus.c diff --git a/connman/NEWS b/NEWS similarity index 100% rename from connman/NEWS rename to NEWS diff --git a/connman/README b/README similarity index 97% rename from connman/README rename to README index 513b94fe4..9361287c6 100644 --- a/connman/README +++ b/README @@ -71,6 +71,14 @@ For a working system, certain configuration options need to be enabled: enabled. This option can be used to build a small daemon for a specific system if Ethernet support is not required. + --disable-gadget + + Disable support for USB Ethernet Gadget devices + + By default USB Ethernet Gadget technology support is built-in and + enabled. This option can be used to build a small daemon + for a specific system if USB Ethernet Gadget support is not required. + --disable-wifi Disable support for WiFi devices @@ -286,6 +294,7 @@ options need to be enabled: CONFIG_USB_GADGET CONFIG_USB_ETH + wpa_supplicant configuration ============================ @@ -310,7 +319,7 @@ CONFIG_AUTOSCAN_EXPONENTIAL=y This will enable the exact same function as bgscan but while being disconnected. -It is recommended to use wpa_supplicant 1.x or later. +It is recommended to use wpa_supplicant 2.x or later. If wpa_supplicant is configured to D-Bus autostart, then ConnMan will trigger the autostart of wpa_supplicant. However please keep in mind @@ -351,6 +360,7 @@ Mailing list: connman@connman.net For additional information about the project visit ConnMan web site: + https://01.org/connman http://www.connman.net You can report bugs at https://01.org/jira/browse/CM diff --git a/connman/TODO b/TODO similarity index 100% rename from connman/TODO rename to TODO diff --git a/connman/acinclude.m4 b/acinclude.m4 similarity index 100% rename from connman/acinclude.m4 rename to acinclude.m4 diff --git a/connman/bootstrap b/bootstrap similarity index 100% rename from connman/bootstrap rename to bootstrap diff --git a/connman/bootstrap-configure b/bootstrap-configure similarity index 100% rename from connman/bootstrap-configure rename to bootstrap-configure diff --git a/connman/client/agent.c b/client/agent.c similarity index 100% rename from connman/client/agent.c rename to client/agent.c diff --git a/connman/client/agent.h b/client/agent.h similarity index 100% rename from connman/client/agent.h rename to client/agent.h diff --git a/connman/client/commands.c b/client/commands.c similarity index 94% rename from connman/client/commands.c rename to client/commands.c index 57a72e8b9..14c92decd 100644 --- a/connman/client/commands.c +++ b/client/commands.c @@ -1733,11 +1733,6 @@ static int cmd_session(char *args[], int num, struct connman_option *options) if (!session_path) return session_create(TRUE); - if (session_connected == true) { - fprintf(stdout, "Session already connected\n"); - return 0; - } - return session_connect(); } else if (!strcmp(command, "disconnect")) { @@ -1747,12 +1742,6 @@ static int cmd_session(char *args[], int num, struct connman_option *options) return 0; } - if (session_connected == false) { - fprintf(stdout, "Session already " - "disconnected\n"); - return 0; - } - return session_disconnect(); } else if (!strcmp(command, "config")) { if (!session_path) { @@ -1796,6 +1785,16 @@ static char *lookup_service(const char *text, int state) return NULL; } +static char *lookup_service_arg(const char *text, int state) +{ + if (__connmanctl_input_calc_level() > 1) { + __connmanctl_input_lookup_end(); + return NULL; + } + + return lookup_service(text, state); +} + static char *lookup_technology(const char *text, int state) { static int len = 0; @@ -1816,12 +1815,27 @@ static char *lookup_technology(const char *text, int state) return NULL; } +static char *lookup_technology_arg(const char *text, int state) +{ + if (__connmanctl_input_calc_level() > 1) { + __connmanctl_input_lookup_end(); + return NULL; + } + + return lookup_technology(text, state); +} + static char *lookup_technology_offline(const char *text, int state) { static int len = 0; static bool end = false; char *str; + if (__connmanctl_input_calc_level() > 1) { + __connmanctl_input_lookup_end(); + return NULL; + } + if (state == 0) { len = strlen(text); end = false; @@ -1842,6 +1856,56 @@ static char *lookup_technology_offline(const char *text, int state) return NULL; } +static char *lookup_on_off(const char *text, int state) +{ + char *onoff[] = { "on", "off", NULL }; + static int idx = 0; + static int len = 0; + + char *str; + + if (!state) { + idx = 0; + len = strlen(text); + } + + while (onoff[idx]) { + str = onoff[idx]; + idx++; + + if (!strncmp(text, str, len)) + return strdup(str); + } + + return NULL; +} + +static char *lookup_tether(const char *text, int state) +{ + int level; + + level = __connmanctl_input_calc_level(); + if (level < 2) + return lookup_technology(text, state); + + if (level == 2) + return lookup_on_off(text, state); + + __connmanctl_input_lookup_end(); + + return NULL; +} + +static char *lookup_agent(const char *text, int state) +{ + if (__connmanctl_input_calc_level() > 1) { + __connmanctl_input_lookup_end(); + return NULL; + } + + return lookup_on_off(text, state); +} + static struct connman_option service_options[] = { {"properties", 'p', "[] (obsolete)"}, { NULL, } @@ -1878,6 +1942,58 @@ static struct connman_option session_options[] = { { NULL, } }; +static char *lookup_options(struct connman_option *options, const char *text, + int state) +{ + static int idx = 0; + static int len = 0; + const char *str; + + if (state == 0) { + idx = 0; + len = strlen(text); + } + + while (options[idx].name) { + str = options[idx].name; + idx++; + + if (str && strncmp(text, str, len) == 0) + return strdup(str); + } + + return NULL; +} + +static char *lookup_monitor(const char *text, int state) +{ + int level; + + level = __connmanctl_input_calc_level(); + + if (level < 2) + return lookup_options(monitor_options, text, state); + + if (level == 2) + return lookup_on_off(text, state); + + __connmanctl_input_lookup_end(); + return NULL; +} + +static char *lookup_config(const char *text, int state) +{ + if (__connmanctl_input_calc_level() < 2) + return lookup_service(text, state); + + return lookup_options(config_options, text, state); +} + +static char *lookup_session(const char *text, int state) +{ + return lookup_options(session_options, text, state); +} + static const struct { const char *cmd; const char *argument; @@ -1900,27 +2016,28 @@ static const struct { " wifi [on|off] ", NULL, cmd_tether, "Enable, disable tethering, set SSID and passphrase for wifi", - lookup_technology }, + lookup_tether }, { "services", "[]", service_options, cmd_services, - "Display services", lookup_service }, + "Display services", lookup_service_arg }, { "scan", "", NULL, cmd_scan, - "Scans for new services for given technology", lookup_technology }, + "Scans for new services for given technology", + lookup_technology_arg }, { "connect", "", NULL, cmd_connect, - "Connect a given service", lookup_service }, + "Connect a given service", lookup_service_arg }, { "disconnect", "", NULL, cmd_disconnect, - "Disconnect a given service", lookup_service }, + "Disconnect a given service", lookup_service_arg }, { "config", "", config_options, cmd_config, - "Set service configuration options", lookup_service }, + "Set service configuration options", lookup_config }, { "monitor", "[off]", monitor_options, cmd_monitor, - "Monitor signals from interfaces", NULL }, + "Monitor signals from interfaces", lookup_monitor }, { "agent", "on|off", NULL, cmd_agent, - "Agent mode", NULL }, + "Agent mode", lookup_agent }, {"vpnconnections", "[]", NULL, cmd_vpnconnections, "Display VPN connections", NULL }, { "vpnagent", "on|off", NULL, cmd_vpnagent, - "VPN Agent mode", NULL }, + "VPN Agent mode", lookup_agent }, { "session", "on|off|connect|disconnect|config", session_options, - cmd_session, "Enable or disable a session", NULL }, + cmd_session, "Enable or disable a session", lookup_session }, { "help", NULL, NULL, cmd_help, "Show help", NULL }, { "exit", NULL, NULL, cmd_exit, @@ -1970,10 +2087,20 @@ static int cmd_help(char *args[], int num, struct connman_option *options) __connmanctl_lookup_cb __connmanctl_get_lookup_func(const char *text) { - int i; + int i, cmdlen, textlen; + + if (!text) + return NULL; + + textlen = strlen(text); for (i = 0; cmd_table[i].cmd; i++) { - if (g_strcmp0(cmd_table[i].cmd, text) == 0) + cmdlen = strlen(cmd_table[i].cmd); + + if (textlen > cmdlen && text[cmdlen] != ' ') + continue; + + if (strncmp(cmd_table[i].cmd, text, cmdlen) == 0) return cmd_table[i].cb; } diff --git a/connman/client/commands.h b/client/commands.h similarity index 100% rename from connman/client/commands.h rename to client/commands.h diff --git a/connman/client/dbus_helpers.c b/client/dbus_helpers.c similarity index 100% rename from connman/client/dbus_helpers.c rename to client/dbus_helpers.c diff --git a/connman/client/dbus_helpers.h b/client/dbus_helpers.h similarity index 100% rename from connman/client/dbus_helpers.h rename to client/dbus_helpers.h diff --git a/connman/client/input.c b/client/input.c similarity index 92% rename from connman/client/input.c rename to client/input.c index 719101db6..1470cb6bc 100644 --- a/connman/client/input.c +++ b/client/input.c @@ -136,10 +136,12 @@ static char **complete_agent(const char *text, int start, int end) } /* Return how many parameters we have typed */ -static int calc_level(char *line) +int __connmanctl_input_calc_level(void) { int count = 0; - char *ptr = line; + char *ptr; + + ptr = rl_line_buffer; while (*ptr) { if (*ptr == ' ') { @@ -155,16 +157,9 @@ static int calc_level(char *line) return count; } -static char *get_command_name(char *line) +void __connmanctl_input_lookup_end(void) { - char *start, *ptr; - - start = ptr = line; - - while (*ptr && *ptr != ' ') - ptr++; - - return g_strndup(start, ptr - start); + rl_attempted_completion_over = 1; } static char **complete_command(const char *text, int start, int end) @@ -175,24 +170,14 @@ static char **complete_command(const char *text, int start, int end) } else { __connmanctl_lookup_cb cb; - char *current_command; char **str = NULL; - if (calc_level(rl_line_buffer) > 1) { - rl_attempted_completion_over = 1; - return NULL; - } - - current_command = get_command_name(rl_line_buffer); - - cb = __connmanctl_get_lookup_func(current_command); + cb = __connmanctl_get_lookup_func(rl_line_buffer); if (cb) str = rl_completion_matches(text, cb); else rl_attempted_completion_over = 1; - g_free(current_command); - return str; } } diff --git a/connman/client/input.h b/client/input.h similarity index 94% rename from connman/client/input.h rename to client/input.h index fb8007790..a283e5148 100644 --- a/connman/client/input.h +++ b/client/input.h @@ -33,6 +33,8 @@ void __connmanctl_quit(void); bool __connmanctl_is_interactive(void); void __connmanctl_save_rl(void); void __connmanctl_redraw_rl(void); +int __connmanctl_input_calc_level(void); +void __connmanctl_input_lookup_end(void); typedef void (* connmanctl_input_func_t) (char *input, void *user_data); void __connmanctl_agent_mode(const char *prompt, connmanctl_input_func_t input_handler, void *user_data); diff --git a/connman/client/main.c b/client/main.c similarity index 100% rename from connman/client/main.c rename to client/main.c diff --git a/connman/client/services.c b/client/services.c similarity index 100% rename from connman/client/services.c rename to client/services.c diff --git a/connman/client/services.h b/client/services.h similarity index 100% rename from connman/client/services.h rename to client/services.h diff --git a/connman/configure.ac b/configure.ac similarity index 97% rename from connman/configure.ac rename to configure.ac index f273d73b4..230b49e52 100644 --- a/connman/configure.ac +++ b/configure.ac @@ -1,5 +1,5 @@ AC_PREREQ(2.60) -AC_INIT(connman, 1.21) +AC_INIT(connman, 1.22) AM_INIT_AUTOMAKE([foreign subdir-objects color-tests]) AC_CONFIG_HEADERS([config.h]) @@ -203,13 +203,6 @@ if (test -z "${stats_max_file_size}"); then stats_max_file_size="16 * 8 * 128" fi -AC_ARG_ENABLE(systemd, AC_HELP_STRING([--enable-systemd], - [enable systemd notify on start]), [ - if (test "${enableval}" = "yes"); then - CFLAGS="$CFLAGS -DSYSTEMD -lsystemd-daemon" - fi -]) - AC_DEFINE_UNQUOTED([STATS_MAX_FILE_SIZE], (${stats_max_file_size}), [Maximal size of a statistics round robin file]) PKG_CHECK_MODULES(GLIB, glib-2.0 >= 2.28, dummy=yes, @@ -293,6 +286,11 @@ AC_ARG_ENABLE(ethernet, AC_HELP_STRING([--disable-ethernet], [enable_ethernet=${enableval}]) AM_CONDITIONAL(ETHERNET, test "${enable_ethernet}" != "no") +AC_ARG_ENABLE(gadget, AC_HELP_STRING([--disable-gadget], + [disable USB Gadget support]), + [enable_gadget=${enableval}]) +AM_CONDITIONAL(GADGET, test "${enable_gadget}" != "no") + AC_ARG_ENABLE(wifi, AC_HELP_STRING([--disable-wifi], [disable WiFi support]), [enable_wifi=${enableval}]) @@ -388,4 +386,4 @@ AM_CONDITIONAL(VPN, test "${enable_openconnect}" != "no" -o \ AC_OUTPUT(Makefile include/version.h src/connman.service vpn/connman-vpn.service vpn/net.connman.vpn.service - scripts/connman connman.pc) + scripts/connman connman.pc src/net.connman.service) diff --git a/connman/connman.pc.in b/connman.pc.in similarity index 100% rename from connman/connman.pc.in rename to connman.pc.in diff --git a/connman/.build-timestamp b/connman/.build-timestamp deleted file mode 100644 index e69de29bb..000000000 diff --git a/connman/doc/session-overview.txt b/connman/doc/session-overview.txt deleted file mode 100644 index 6de2ec75d..000000000 --- a/connman/doc/session-overview.txt +++ /dev/null @@ -1,145 +0,0 @@ -Session API -*********** - - -Connection management algorithm basics -====================================== - -When a session is created, a sorted list of services is added to the -session. The services are filtered and sorted according AllowedBearers. - -There are two triggers which lead to evaluate the connect -algorithm: - - - Session.Connect() - - Offline - -Connect algorithm: - - Session.Connect() - | - +------+-------+ - +-----+ECall Session ?+-----+ - Yes| +--------------+ |No - | | - Connect to +--------------+ - first available +---+AvoidHandover?+---+ - Service | +--------------+ | - Yes| |No - +----------------+ | - +---+In service_list +---+ | - Yes| |and online? | |No | - | +----------------+ | | - | | | - Take that one Take first in - the service list - and try to connect - -Disconnect algorithm - - - Session.Disconnect() - -Disconnect algorithm: - - Session.Disconnect() - | - +--- Session.Change() - | -+-----------------+ Yes -|service not used +-------------+ -|by other session?| | -+------.----------+ | - |No | - | | - Service.Disconnect() Do nothing - -Session.Disconnect() will be blocked whenever a ongoing -emergency call is active. - - -Session States and Transitions -============================== - -There is only one state which is called Free Ride. - -The Free Ride state means that a session will go online if a matching -service goes online without calling Service.Connect() itself. The idea -behind this is that a session doesn't request a connection for itself -instead waits until another session actively requires to go online. -This is comparable to piggy-backing. - -Connnect() - +------+ - | v -+------------+ -| Free Ride | -+------------+ - | ^ - +-----+ - Disconnect() - - -If an application wants to stay offline it can set an empty -AllowedBearers list. - - -Session application identification -================================== - -Application using session can be identified through different means. - - - SELinux - - UID - - GID - -ConnMan will try to identify the application in the given order above. -If SELinux is not supported by the system or not configured, ConnMan -will ignore it and fallback asking the D-Bus daemon about the UID of -the application. - -The identification is only useful in combination with the policy plugin. - - -Policy Plugin -============= - -The policy plugin allows the administrator to provision/configure -sessions. Each policy needs an application identification in order to -match the policy to a session. - -See session-policy-format.txt for more details. - - -Per application routing and statistics -====================================== - -For each session a policy routing table is maintained. Each -policy routing table contains a default route to the -selected service. - -Furthermore a few iptables rules inserted into the kernel to gather -statistics via NFACCT. - -Per session iptables rules: - -iptables -t mangle -A OUTPUT -m owner [--uid-owner|--gid-owner] $OWNER \ - -j MARK --set-mark $MARK - -iptables -t filter -A INPUT -m mark --mark $MARK \ - -m nfacct --nfacct-name session-input-$MARK -iptables -t filter -A OUTPUT -m mark --mark $MARK \ - -m nfacct --nfacct-name session-output-$MARK - -Global rules for all sessions: - -iptables -t mangle -A INPUT -j CONNMARK --restore-mark -iptables -t mangle -A POSTROUTING -j CONNMARK --save-mark - -Per application routing and statistics is only available when policy -files are used. Without the policy plugin or a valid configuration, -the default session configuration is applied. - -The default session configuration does not enable the per application -routing and statistics. Sessions are still useful in this setup, -because the notification of sessions is still available, e.g. the -online/offline notification. diff --git a/connman/src/connman.service.in b/connman/src/connman.service.in deleted file mode 100644 index 3639d767e..000000000 --- a/connman/src/connman.service.in +++ /dev/null @@ -1,15 +0,0 @@ -[Unit] -Description=Connection service -Requires=dbus.service -After=dbus.service - -[Service] -Type=notify -Restart=on-failure -EnvironmentFile=-/etc/tracing/connman/connman.tracing -ExecStart=@prefix@/sbin/connmand -n --systemd $TRACING -StandardOutput=null -Restart=always - -[Install] -WantedBy=multi-user.target diff --git a/connman/test/test-supplicant b/connman/test/test-supplicant deleted file mode 100755 index 68ac66300..000000000 --- a/connman/test/test-supplicant +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/python - -import dbus -import time - -WPA_NAME='fi.epitest.hostap.WPASupplicant' -WPA_INTF='fi.epitest.hostap.WPASupplicant' -WPA_PATH='/fi/epitest/hostap/WPASupplicant' - -bus = dbus.SystemBus() - -dummy = dbus.Interface(bus.get_object(WPA_NAME, WPA_PATH), - 'org.freedesktop.DBus.Introspectable') - -#print dummy.Introspect() - -manager = dbus.Interface(bus.get_object(WPA_NAME, WPA_PATH), WPA_INTF) - -try: - path = manager.getInterface("wlan0") -except: - path = manager.addInterface("wlan0") - -interface = dbus.Interface(bus.get_object(WPA_NAME, path), - WPA_INTF + ".Interface") - -print "state = %s" % (interface.state()) - -try: - print "scanning = %s" % (interface.scanning()) -except: - pass - -print "[ %s ]" % (path) - -capabilities = interface.capabilities() - -for key in capabilities.keys(): - list = "" - for value in capabilities[key]: - list += " " + value - print " %s =%s" % (key, list) - -interface.scan() - -time.sleep(1) - -try: - print "scanning = %s" % (interface.scanning()) -except: - pass - -time.sleep(1) - -print "state = %s" % (interface.state()) - -results = interface.scanResults() - -print results - -path = results[0] - -print "[ %s ]" % (path) - -bssid = dbus.Interface(bus.get_object(WPA_NAME, path), - WPA_INTF + ".BSSID") - -properties = bssid.properties() - -for key in properties.keys(): - print " %s = %s" % (key, properties[key]) diff --git a/connman/doc/advanced-configuration.txt b/doc/advanced-configuration.txt similarity index 100% rename from connman/doc/advanced-configuration.txt rename to doc/advanced-configuration.txt diff --git a/connman/doc/agent-api.txt b/doc/agent-api.txt similarity index 100% rename from connman/doc/agent-api.txt rename to doc/agent-api.txt diff --git a/connman/doc/backtrace.txt b/doc/backtrace.txt similarity index 100% rename from connman/doc/backtrace.txt rename to doc/backtrace.txt diff --git a/connman/doc/behavior-api.txt b/doc/behavior-api.txt similarity index 100% rename from connman/doc/behavior-api.txt rename to doc/behavior-api.txt diff --git a/connman/doc/clock-api.txt b/doc/clock-api.txt similarity index 100% rename from connman/doc/clock-api.txt rename to doc/clock-api.txt diff --git a/connman/doc/coding-style.txt b/doc/coding-style.txt similarity index 100% rename from connman/doc/coding-style.txt rename to doc/coding-style.txt diff --git a/connman/doc/config-format.txt b/doc/config-format.txt similarity index 97% rename from connman/doc/config-format.txt rename to doc/config-format.txt index 9c8e113fd..d825070d3 100644 --- a/connman/doc/config-format.txt +++ b/doc/config-format.txt @@ -91,18 +91,17 @@ The following options are valid if Type is "wifi" then AP is not hidden. -Example -======= +Examples +======== This is a configuration file for a network providing EAP-TLS, EAP-TTLS and -EAP-PEAP services. -The respective SSIDs are tls_ssid, ttls_ssid and peap_ssid and the file name -is example.config. +EAP-PEAP services. The respective SSIDs are tls_ssid, ttls_ssid and peap_ssid +and the file name is example.config. + Please note that the SSID entry is for hexadecimal encoded SSID (e.g. "SSID = 746c735f73736964"). If your SSID does not contain any exotic character then you should use the Name entry instead (e.g. "Name = tls_ssid"). - example@example:[~]$ cat /var/lib/connman/example.config [global] Name = Example diff --git a/connman/doc/connman.8 b/doc/connman.8 similarity index 100% rename from connman/doc/connman.8 rename to doc/connman.8 diff --git a/connman/doc/connman.conf.5 b/doc/connman.conf.5 similarity index 99% rename from connman/doc/connman.conf.5 rename to doc/connman.conf.5 index 1a2446710..626edfd9e 100644 --- a/connman/doc/connman.conf.5 +++ b/doc/connman.conf.5 @@ -91,7 +91,7 @@ List of blacklisted network interfaces separated by ",". Found interfaces will be compared to the list and will not be handled by connman, if their first characters match any of the list entries. Default value is -vmnet,vboxnet,virbr. +vmnet,vboxnet,virbr,ifb. .TP .B AllowHostnameUpdates=\fPtrue|false\fP Allow connman to change the system hostname. This can diff --git a/connman/doc/connmanctl.1 b/doc/connmanctl.1 similarity index 100% rename from connman/doc/connmanctl.1 rename to doc/connmanctl.1 diff --git a/connman/doc/counter-api.txt b/doc/counter-api.txt similarity index 100% rename from connman/doc/counter-api.txt rename to doc/counter-api.txt diff --git a/connman/doc/ipconfig-api.txt b/doc/ipconfig-api.txt similarity index 100% rename from connman/doc/ipconfig-api.txt rename to doc/ipconfig-api.txt diff --git a/connman/doc/manager-api.txt b/doc/manager-api.txt similarity index 88% rename from connman/doc/manager-api.txt rename to doc/manager-api.txt index 8f1333c65..6cc368872 100644 --- a/connman/doc/manager-api.txt +++ b/doc/manager-api.txt @@ -39,6 +39,13 @@ Methods dict GetProperties() Possible Errors: [service].Error.InvalidArguments + array{object,dict} GetPeers() [experimental] + + Returns a sorted list of tuples with peer object path + and dictionary of peer properties + + Possible Errors: [peer].Error.InvalidArguments + object ConnectProvider(dict provider) [deprecated] Connect to a VPN specified by the given provider @@ -186,6 +193,28 @@ Signals TechnologyAdded(object path, dict properties) required to watch the PropertyChanged signal of the service object. + PeersChanged(array{object, dict}) [experimental] + + Signals a list of peers that have been changed via the + first array. And a list of peer that have been removed + via the second array. + + The list of changed peers is sorted. The dictionary + with the properties might be empty in case none of the + properties have changed. Or only contains the + properties that have changed. + + For newly added peers the whole set of properties will + be present. + + The list of removed peers can be empty. + + This signal will only be triggered when the sort order + of the peer list or the number of peers changes. It + will not be emitted if only a property of the peer + object changes. For that it is required to watch the + PropertyChanged signal of the peer object. + PropertyChanged(string name, variant value) This signal indicates a changed value of the given diff --git a/connman/doc/overview-api.txt b/doc/overview-api.txt similarity index 100% rename from connman/doc/overview-api.txt rename to doc/overview-api.txt diff --git a/doc/peer-api.txt b/doc/peer-api.txt new file mode 100644 index 000000000..c54d7858c --- /dev/null +++ b/doc/peer-api.txt @@ -0,0 +1,49 @@ +Peer hierarchy [EXPERIMENTAL] +============================= + +Service net.connman +Interface net.connman.Peer +Object path [variable prefix]/{peer0,peer1,...} + +Methods void Connect() [experimental] + + Connect this peer. + + This method call will only return in case of an error + or when the peer is fully connected. So setting a + longer D-Bus timeout might be a really good idea. + + Possible Errors: [service].Error.InvalidArguments + + void Disconnect() [experimental] + + Disconnect this peer. If the peer is not connected, an + error message will be generated. + + Possible Errors: [service].Error.InvalidArguments + +Signals PropertyChanged(string name, variant value) [experimental] + + This signal indicates a changed value of the given + property. + +Properties string State [readonly] [experimental] + + The peer state information. + + Valid state are "idle", "failure", "association", + "configuration", "ready" and "disconnect". + + string Name [readonly] [experimental] + + Name of the peer. + + dict IPv4 [readonly] [experimental] + + string Address [readonly] + + The current configured IPv4 address. + + string Netmask [readonly] + + The current configured IPv4 netmask. diff --git a/connman/doc/plugin-api.txt b/doc/plugin-api.txt similarity index 100% rename from connman/doc/plugin-api.txt rename to doc/plugin-api.txt diff --git a/connman/doc/service-api.txt b/doc/service-api.txt similarity index 100% rename from connman/doc/service-api.txt rename to doc/service-api.txt diff --git a/connman/doc/session-api.txt b/doc/session-api.txt similarity index 100% rename from connman/doc/session-api.txt rename to doc/session-api.txt diff --git a/doc/session-overview.txt b/doc/session-overview.txt new file mode 100644 index 000000000..9af6a675c --- /dev/null +++ b/doc/session-overview.txt @@ -0,0 +1,94 @@ +Session API +*********** + + +Connection management algorithm basics +====================================== + +The Session core uses the normal auto-connect algorithm for selecting +which services will be connected or disconnected. That means only +Services with AutoConnect to set to true will be used. The Session +core will assign a connected Service to a Session if the Service +is matching the AllowedBearer filter. + +By using the normal auto-connect algorithm, it is possible to +use the Session API and the Service API at the same time. + + +Session States and Transitions +============================== + +There is only one state which is called Free Ride. + +The Free Ride state means that a session will go online if a matching +service goes online without calling Service.Connect() itself. The idea +behind this is that a session doesn't request a connection for itself +instead waits until another session actively requires to go online. +This is comparable to piggy-backing. + +Connnect() + +------+ + | v ++------------+ +| Free Ride | ++------------+ + | ^ + +-----+ + Disconnect() + + +If an application wants to stay offline it can set an empty +AllowedBearers list. + + +Session application identification +================================== + +Application using session can be identified through different means. + + - SELinux + - UID + - GID + +ConnMan will try to identify the application in the given order above. +If SELinux is not supported by the system or not configured, ConnMan +will ignore it and fallback asking the D-Bus daemon about the UID of +the application. + +The identification is only useful in combination with the policy plugin. + + +Policy Plugin +============= + +The policy plugin allows the administrator to provision/configure +sessions. Each policy needs an application identification in order to +match the policy to a session. + +See session-policy-format.txt for more details. + + +Per application routing +======================= + +For each session a policy routing table is maintained. Each policy +routing table contains a default route to the selected service. + +Per session iptables rules: + +iptables -t mangle -A OUTPUT -m owner [--uid-owner|--gid-owner] $OWNER \ + -j MARK --set-mark $MARK + +Global rules for all sessions: + +iptables -t mangle -A INPUT -j CONNMARK --restore-mark +iptables -t mangle -A POSTROUTING -j CONNMARK --save-mark + +Per application routing is only available when policy files are +used. Without the policy plugin or a valid configuration, the default +session configuration is applied. + +The default session configuration does not enable the per application +routing. Sessions are still useful in this setup, because the +notification of sessions is still available, e.g. the online/offline +notification. diff --git a/connman/doc/technology-api.txt b/doc/technology-api.txt similarity index 95% rename from connman/doc/technology-api.txt rename to doc/technology-api.txt index 81adcbc7c..f97eac011 100644 --- a/connman/doc/technology-api.txt +++ b/doc/technology-api.txt @@ -36,6 +36,10 @@ Methods dict GetProperties() [deprecated] Results will be signaled via the ServicesChanged signal from the manager interface. + In case of P2P technology, results will be signaled + via the PeersChanged signal from the manager + interface. + Signals PropertyChanged(string name, variant value) This signal indicates a changed value of the given diff --git a/connman/doc/valgrind.suppressions b/doc/valgrind.suppressions similarity index 100% rename from connman/doc/valgrind.suppressions rename to doc/valgrind.suppressions diff --git a/connman/doc/vpn-agent-api.txt b/doc/vpn-agent-api.txt similarity index 100% rename from connman/doc/vpn-agent-api.txt rename to doc/vpn-agent-api.txt diff --git a/connman/doc/vpn-config-format.txt b/doc/vpn-config-format.txt similarity index 100% rename from connman/doc/vpn-config-format.txt rename to doc/vpn-config-format.txt diff --git a/connman/doc/vpn-connection-api.txt b/doc/vpn-connection-api.txt similarity index 100% rename from connman/doc/vpn-connection-api.txt rename to doc/vpn-connection-api.txt diff --git a/connman/doc/vpn-manager-api.txt b/doc/vpn-manager-api.txt similarity index 100% rename from connman/doc/vpn-manager-api.txt rename to doc/vpn-manager-api.txt diff --git a/connman/doc/vpn-overview.txt b/doc/vpn-overview.txt similarity index 100% rename from connman/doc/vpn-overview.txt rename to doc/vpn-overview.txt diff --git a/connman/gdbus/client.c b/gdbus/client.c similarity index 98% rename from connman/gdbus/client.c rename to gdbus/client.c index be8cc2960..5193b6c6b 100644 --- a/connman/gdbus/client.c +++ b/gdbus/client.c @@ -56,6 +56,8 @@ struct GDBusClient { void *signal_data; GDBusProxyFunction proxy_added; GDBusProxyFunction proxy_removed; + GDBusClientFunction ready; + void *ready_data; GDBusPropertyFunction property_changed; void *user_data; GList *proxy_list; @@ -982,6 +984,9 @@ static void parse_managed_objects(GDBusClient *client, DBusMessage *msg) dbus_message_iter_next(&dict); } + + if (client->ready) + client->ready(client, client->ready_data); } static void get_managed_objects_reply(DBusPendingCall *call, void *user_data) @@ -1243,6 +1248,18 @@ gboolean g_dbus_client_set_signal_watch(GDBusClient *client, return TRUE; } +gboolean g_dbus_client_set_ready_watch(GDBusClient *client, + GDBusClientFunction ready, void *user_data) +{ + if (client == NULL) + return FALSE; + + client->ready = ready; + client->ready_data = user_data; + + return TRUE; +} + gboolean g_dbus_client_set_proxy_handlers(GDBusClient *client, GDBusProxyFunction proxy_added, GDBusProxyFunction proxy_removed, diff --git a/connman/gdbus/gdbus.h b/gdbus/gdbus.h similarity index 98% rename from connman/gdbus/gdbus.h rename to gdbus/gdbus.h index 9542109c3..8ada20092 100644 --- a/connman/gdbus/gdbus.h +++ b/gdbus/gdbus.h @@ -337,6 +337,7 @@ gboolean g_dbus_proxy_method_call(GDBusProxy *proxy, const char *method, GDBusReturnFunction function, void *user_data, GDBusDestroyFunction destroy); +typedef void (* GDBusClientFunction) (GDBusClient *client, void *user_data); typedef void (* GDBusProxyFunction) (GDBusProxy *proxy, void *user_data); typedef void (* GDBusPropertyFunction) (GDBusProxy *proxy, const char *name, DBusMessageIter *iter, void *user_data); @@ -359,7 +360,8 @@ gboolean g_dbus_client_set_disconnect_watch(GDBusClient *client, GDBusWatchFunction function, void *user_data); gboolean g_dbus_client_set_signal_watch(GDBusClient *client, GDBusMessageFunction function, void *user_data); - +gboolean g_dbus_client_set_ready_watch(GDBusClient *client, + GDBusClientFunction ready, void *user_data); gboolean g_dbus_client_set_proxy_handlers(GDBusClient *client, GDBusProxyFunction proxy_added, GDBusProxyFunction proxy_removed, diff --git a/connman/gdbus/mainloop.c b/gdbus/mainloop.c similarity index 96% rename from connman/gdbus/mainloop.c rename to gdbus/mainloop.c index 099b67fef..435fb93bb 100644 --- a/connman/gdbus/mainloop.c +++ b/gdbus/mainloop.c @@ -30,8 +30,6 @@ #include "gdbus.h" -#define DISPATCH_TIMEOUT 0 - #define info(fmt...) #define error(fmt...) #define debug(fmt...) @@ -70,8 +68,6 @@ static gboolean message_dispatch(void *data) { DBusConnection *conn = data; - dbus_connection_ref(conn); - /* Dispatch messages */ while (dbus_connection_dispatch(conn) == DBUS_DISPATCH_DATA_REMAINS); @@ -84,7 +80,7 @@ static inline void queue_dispatch(DBusConnection *conn, DBusDispatchStatus status) { if (status == DBUS_DISPATCH_DATA_REMAINS) - g_timeout_add(DISPATCH_TIMEOUT, message_dispatch, conn); + g_idle_add(message_dispatch, dbus_connection_ref(conn)); } static gboolean watch_func(GIOChannel *chan, GIOCondition cond, gpointer data) @@ -92,9 +88,6 @@ static gboolean watch_func(GIOChannel *chan, GIOCondition cond, gpointer data) struct watch_info *info = data; unsigned int flags = 0; DBusDispatchStatus status; - DBusConnection *conn; - - conn = dbus_connection_ref(info->conn); if (cond & G_IO_IN) flags |= DBUS_WATCH_READABLE; if (cond & G_IO_OUT) flags |= DBUS_WATCH_WRITABLE; @@ -103,10 +96,8 @@ static gboolean watch_func(GIOChannel *chan, GIOCondition cond, gpointer data) dbus_watch_handle(info->watch, flags); - status = dbus_connection_get_dispatch_status(conn); - queue_dispatch(conn, status); - - dbus_connection_unref(conn); + status = dbus_connection_get_dispatch_status(info->conn); + queue_dispatch(info->conn, status); return TRUE; } diff --git a/connman/gdbus/object.c b/gdbus/object.c similarity index 99% rename from connman/gdbus/object.c rename to gdbus/object.c index b248cbbc7..13cf9a956 100644 --- a/connman/gdbus/object.c +++ b/gdbus/object.c @@ -1253,6 +1253,8 @@ static struct generic_data *object_path_ref(DBusConnection *connection, if (!dbus_connection_register_object_path(connection, path, &generic_table, data)) { + dbus_connection_unref(data->conn); + g_free(data->path); g_free(data->introspect); g_free(data); return NULL; diff --git a/connman/gdbus/polkit.c b/gdbus/polkit.c similarity index 100% rename from connman/gdbus/polkit.c rename to gdbus/polkit.c diff --git a/connman/gdbus/watch.c b/gdbus/watch.c similarity index 100% rename from connman/gdbus/watch.c rename to gdbus/watch.c diff --git a/connman/gdhcp/client.c b/gdhcp/client.c similarity index 93% rename from connman/gdhcp/client.c rename to gdhcp/client.c index b24d19d62..f7596a043 100644 --- a/connman/gdhcp/client.c +++ b/gdhcp/client.c @@ -62,6 +62,7 @@ typedef enum _listen_mode { typedef enum _dhcp_client_state { INIT_SELECTING, + REBOOTING, REQUESTING, BOUND, RENEWING, @@ -100,6 +101,9 @@ struct _GDHCPClient { uint8_t ack_retry_times; uint8_t conflicts; guint timeout; + guint t1_timeout; + guint t2_timeout; + guint lease_timeout; guint listener_watch; GIOChannel *listener_channel; GList *require_list; @@ -271,6 +275,25 @@ static int32_t get_time_diff(struct timeval *tv) return hsec; } +static void remove_timeouts(GDHCPClient *dhcp_client) +{ + + if (dhcp_client->timeout > 0) + g_source_remove(dhcp_client->timeout); + if (dhcp_client->t1_timeout > 0) + g_source_remove(dhcp_client->t1_timeout); + if (dhcp_client->t2_timeout > 0) + g_source_remove(dhcp_client->t2_timeout); + if (dhcp_client->lease_timeout > 0) + g_source_remove(dhcp_client->lease_timeout); + + dhcp_client->timeout = 0; + dhcp_client->t1_timeout = 0; + dhcp_client->t2_timeout = 0; + dhcp_client->lease_timeout = 0; + +} + static void add_dhcpv6_request_options(GDHCPClient *dhcp_client, struct dhcpv6_packet *packet, unsigned char *buf, int max_buf, @@ -438,63 +461,37 @@ static int send_discover(GDHCPClient *dhcp_client, uint32_t requested) MAC_BCAST_ADDR, dhcp_client->ifindex); } -static int send_select(GDHCPClient *dhcp_client) +static int send_request(GDHCPClient *dhcp_client) { struct dhcp_packet packet; - - debug(dhcp_client, "sending DHCP select request"); + debug(dhcp_client, "sending DHCP request"); init_packet(dhcp_client, &packet, DHCPREQUEST); packet.xid = dhcp_client->xid; packet.secs = dhcp_attempt_secs(dhcp_client); - dhcp_add_option_uint32(&packet, DHCP_REQUESTED_IP, - dhcp_client->requested_ip); - dhcp_add_option_uint32(&packet, DHCP_SERVER_ID, - dhcp_client->server_ip); - - add_request_options(dhcp_client, &packet); - - add_send_options(dhcp_client, &packet); - - return dhcp_send_raw_packet(&packet, INADDR_ANY, CLIENT_PORT, - INADDR_BROADCAST, SERVER_PORT, - MAC_BCAST_ADDR, dhcp_client->ifindex); -} - -static int send_renew(GDHCPClient *dhcp_client) -{ - struct dhcp_packet packet; + if (dhcp_client->state == REQUESTING || dhcp_client->state == REBOOTING) + dhcp_add_option_uint32(&packet, DHCP_REQUESTED_IP, + dhcp_client->requested_ip); - debug(dhcp_client, "sending DHCP renew request"); + if (dhcp_client->state == REQUESTING) + dhcp_add_option_uint32(&packet, DHCP_SERVER_ID, + dhcp_client->server_ip); - init_packet(dhcp_client , &packet, DHCPREQUEST); - packet.xid = dhcp_client->xid; - packet.ciaddr = htonl(dhcp_client->requested_ip); + dhcp_add_option_uint16(&packet, DHCP_MAX_SIZE, 576); add_request_options(dhcp_client, &packet); add_send_options(dhcp_client, &packet); - return dhcp_send_kernel_packet(&packet, - dhcp_client->requested_ip, CLIENT_PORT, - dhcp_client->server_ip, SERVER_PORT); -} - -static int send_rebound(GDHCPClient *dhcp_client) -{ - struct dhcp_packet packet; - - debug(dhcp_client, "sending DHCP rebound request"); - - init_packet(dhcp_client , &packet, DHCPREQUEST); - packet.xid = dhcp_client->xid; - packet.ciaddr = htonl(dhcp_client->requested_ip); - - add_request_options(dhcp_client, &packet); + if (dhcp_client->state == RENEWING) { + packet.ciaddr = htonl(dhcp_client->requested_ip); - add_send_options(dhcp_client, &packet); + return dhcp_send_kernel_packet(&packet, + dhcp_client->requested_ip, CLIENT_PORT, + dhcp_client->server_ip, SERVER_PORT); + } return dhcp_send_raw_packet(&packet, INADDR_ANY, CLIENT_PORT, INADDR_BROADCAST, SERVER_PORT, @@ -574,9 +571,7 @@ static gboolean send_announce_packet(gpointer dhcp_data) dhcp_client->requested_ip, dhcp_client->ifindex); - if (dhcp_client->timeout > 0) - g_source_remove(dhcp_client->timeout); - dhcp_client->timeout = 0; + remove_timeouts(dhcp_client); if (dhcp_client->state == IPV4LL_DEFEND) { dhcp_client->timeout = @@ -1352,10 +1347,7 @@ static void ipv4ll_start(GDHCPClient *dhcp_client) guint timeout; int seed; - if (dhcp_client->timeout > 0) { - g_source_remove(dhcp_client->timeout); - dhcp_client->timeout = 0; - } + remove_timeouts(dhcp_client); switch_listening_mode(dhcp_client, L_NONE); dhcp_client->retry_times = 0; @@ -1381,8 +1373,7 @@ static void ipv4ll_stop(GDHCPClient *dhcp_client) switch_listening_mode(dhcp_client, L_NONE); - if (dhcp_client->timeout > 0) - g_source_remove(dhcp_client->timeout); + remove_timeouts(dhcp_client); if (dhcp_client->listener_watch > 0) { g_source_remove(dhcp_client->listener_watch); @@ -1602,7 +1593,7 @@ static void start_request(GDHCPClient *dhcp_client) switch_listening_mode(dhcp_client, L2); } - send_select(dhcp_client); + send_request(dhcp_client); dhcp_client->timeout = g_timeout_add_seconds_full(G_PRIORITY_HIGH, REQUEST_TIMEOUT, @@ -1633,10 +1624,7 @@ static void restart_dhcp(GDHCPClient *dhcp_client, int retry_times) { debug(dhcp_client, "restart DHCP (retries %d)", retry_times); - if (dhcp_client->timeout > 0) { - g_source_remove(dhcp_client->timeout); - dhcp_client->timeout = 0; - } + remove_timeouts(dhcp_client); dhcp_client->retry_times = retry_times; dhcp_client->requested_ip = 0; @@ -1646,91 +1634,103 @@ static void restart_dhcp(GDHCPClient *dhcp_client, int retry_times) g_dhcp_client_start(dhcp_client, dhcp_client->last_address); } -static gboolean start_rebound_timeout(gpointer user_data) +static gboolean start_expire(gpointer user_data) { GDHCPClient *dhcp_client = user_data; - debug(dhcp_client, "start rebound timeout"); + debug(dhcp_client, "lease expired"); - switch_listening_mode(dhcp_client, L2); + /*remove all timeouts if they are set*/ + remove_timeouts(dhcp_client); + + /* ip need to be cleared */ + if (dhcp_client->lease_lost_cb) + dhcp_client->lease_lost_cb(dhcp_client, + dhcp_client->lease_lost_data); - dhcp_client->lease_seconds >>= 1; + restart_dhcp(dhcp_client, 0); - /* We need to have enough time to receive ACK package*/ - if (dhcp_client->lease_seconds <= 6) { + return false; +} - /* ip need to be cleared */ - if (dhcp_client->lease_lost_cb) - dhcp_client->lease_lost_cb(dhcp_client, - dhcp_client->lease_lost_data); +static gboolean continue_rebound(gpointer user_data) +{ + GDHCPClient *dhcp_client = user_data; - restart_dhcp(dhcp_client, 0); - } else { - send_rebound(dhcp_client); + switch_listening_mode(dhcp_client, L2); + send_request(dhcp_client); - dhcp_client->timeout = - g_timeout_add_seconds_full(G_PRIORITY_HIGH, - dhcp_client->lease_seconds >> 1, - start_rebound_timeout, - dhcp_client, - NULL); + if (dhcp_client->t2_timeout> 0) + g_source_remove(dhcp_client->t2_timeout); + + /*recalculate remaining rebind time*/ + dhcp_client->T2 >>= 1; + if (dhcp_client->T2 > 60) { + dhcp_client->t2_timeout = + g_timeout_add_full(G_PRIORITY_HIGH, + dhcp_client->T2 * 1000 + (rand() % 2000) - 1000, + continue_rebound, + dhcp_client, + NULL); } return FALSE; } -static void start_rebound(GDHCPClient *dhcp_client) +static gboolean start_rebound(gpointer user_data) { - debug(dhcp_client, "start rebound"); + GDHCPClient *dhcp_client = user_data; + /*remove renew timer*/ + if (dhcp_client->t1_timeout > 0) + g_source_remove(dhcp_client->t1_timeout); + + debug(dhcp_client, "start rebound"); dhcp_client->state = REBINDING; - dhcp_client->timeout = g_timeout_add_seconds_full(G_PRIORITY_HIGH, - dhcp_client->lease_seconds >> 1, - start_rebound_timeout, - dhcp_client, - NULL); + /*calculate total rebind time*/ + dhcp_client->T2 = dhcp_client->expire - dhcp_client->T2; + + /*send the first rebound and reschedule*/ + continue_rebound(user_data); + + return FALSE; } -static gboolean start_renew_request_timeout(gpointer user_data) +static gboolean continue_renew (gpointer user_data) { GDHCPClient *dhcp_client = user_data; - debug(dhcp_client, "renew request timeout"); + switch_listening_mode(dhcp_client, L3); + send_request(dhcp_client); - if (dhcp_client->no_lease_cb) - dhcp_client->no_lease_cb(dhcp_client, - dhcp_client->no_lease_data); + if (dhcp_client->t1_timeout > 0) + g_source_remove(dhcp_client->t1_timeout); - return false; -} + dhcp_client->T1 >>= 1; + + if (dhcp_client->T1 > 60) { + dhcp_client->t1_timeout = g_timeout_add_full(G_PRIORITY_HIGH, + dhcp_client->T1 * 1000 + (rand() % 2000) - 1000, + continue_renew, + dhcp_client, + NULL); + } -static gboolean start_renew_timeout(gpointer user_data) + return FALSE; +} +static gboolean start_renew(gpointer user_data) { GDHCPClient *dhcp_client = user_data; - debug(dhcp_client, "start renew timeout"); - + debug(dhcp_client, "start renew"); dhcp_client->state = RENEWING; - dhcp_client->lease_seconds >>= 1; - - switch_listening_mode(dhcp_client, L3); - if (dhcp_client->lease_seconds <= 60) - start_rebound(dhcp_client); - else { - send_renew(dhcp_client); - - if (dhcp_client->timeout > 0) - g_source_remove(dhcp_client->timeout); + /*calculate total renew period*/ + dhcp_client->T1 = dhcp_client->T2 - dhcp_client->T1; - dhcp_client->timeout = - g_timeout_add_seconds_full(G_PRIORITY_HIGH, - REQUEST_TIMEOUT, - start_renew_request_timeout, - dhcp_client, - NULL); - } + /*send first renew and reschedule for half the remaining time.*/ + continue_renew(user_data); return FALSE; } @@ -1741,12 +1741,30 @@ static void start_bound(GDHCPClient *dhcp_client) dhcp_client->state = BOUND; - if (dhcp_client->timeout > 0) - g_source_remove(dhcp_client->timeout); + remove_timeouts(dhcp_client); - dhcp_client->timeout = g_timeout_add_seconds_full(G_PRIORITY_HIGH, - dhcp_client->lease_seconds >> 1, - start_renew_timeout, dhcp_client, + /* + *TODO: T1 and T2 should be set through options instead of + * defaults as they are here. + */ + + dhcp_client->T1 = dhcp_client->lease_seconds >> 1; + dhcp_client->T2 = dhcp_client->lease_seconds * 0.875; + dhcp_client->expire = dhcp_client->lease_seconds; + + dhcp_client->t1_timeout = g_timeout_add_seconds_full(G_PRIORITY_HIGH, + dhcp_client->T1, + start_renew, dhcp_client, + NULL); + + dhcp_client->t2_timeout = g_timeout_add_seconds_full(G_PRIORITY_HIGH, + dhcp_client->T2, + start_rebound, dhcp_client, + NULL); + + dhcp_client->lease_timeout= g_timeout_add_seconds_full(G_PRIORITY_HIGH, + dhcp_client->expire, + start_expire, dhcp_client, NULL); } @@ -1756,10 +1774,14 @@ static gboolean restart_dhcp_timeout(gpointer user_data) debug(dhcp_client, "restart DHCP timeout"); - dhcp_client->ack_retry_times++; - - restart_dhcp(dhcp_client, dhcp_client->ack_retry_times); - + if (dhcp_client->state == REBOOTING) { + g_free(dhcp_client->last_address); + dhcp_client->last_address = NULL; + restart_dhcp(dhcp_client, 0); + } else { + dhcp_client->ack_retry_times++; + restart_dhcp(dhcp_client, dhcp_client->ack_retry_times); + } return FALSE; } @@ -2317,7 +2339,7 @@ static gboolean listener_event(GIOChannel *channel, GIOCondition condition, if (*message_type != DHCPOFFER) return TRUE; - g_source_remove(dhcp_client->timeout); + remove_timeouts(dhcp_client); dhcp_client->timeout = 0; dhcp_client->retry_times = 0; @@ -2330,15 +2352,14 @@ static gboolean listener_event(GIOChannel *channel, GIOCondition condition, start_request(dhcp_client); return TRUE; + case REBOOTING: case REQUESTING: case RENEWING: case REBINDING: if (*message_type == DHCPACK) { dhcp_client->retry_times = 0; - if (dhcp_client->timeout > 0) - g_source_remove(dhcp_client->timeout); - dhcp_client->timeout = 0; + remove_timeouts(dhcp_client); dhcp_client->lease_seconds = get_lease(&packet); @@ -2358,8 +2379,7 @@ static gboolean listener_event(GIOChannel *channel, GIOCondition condition, } else if (*message_type == DHCPNAK) { dhcp_client->retry_times = 0; - if (dhcp_client->timeout > 0) - g_source_remove(dhcp_client->timeout); + remove_timeouts(dhcp_client); dhcp_client->timeout = g_timeout_add_seconds_full( G_PRIORITY_HIGH, 3, @@ -2565,6 +2585,22 @@ static gboolean discover_timeout(gpointer user_data) return FALSE; } +static gboolean reboot_timeout(gpointer user_data) +{ + GDHCPClient *dhcp_client = user_data; + dhcp_client->retry_times = 0; + dhcp_client->requested_ip = 0; + dhcp_client->state = INIT_SELECTING; + /* + * We do not send the REQUESTED IP option because the server didn't + * respond when we send DHCPREQUEST with the REQUESTED IP option in + * init-reboot state + */ + g_dhcp_client_start(dhcp_client, NULL); + + return FALSE; +} + static gboolean ipv4ll_defend_timeout(gpointer dhcp_data) { GDHCPClient *dhcp_client = dhcp_data; @@ -2753,6 +2789,21 @@ int g_dhcp_client_start(GDHCPClient *dhcp_client, const char *last_address) dhcp_client->last_address = g_strdup(last_address); } } + + if ((addr != 0) && (dhcp_client->type != G_DHCP_IPV4LL)) { + debug(dhcp_client, "DHCP client start with state init_reboot"); + dhcp_client->requested_ip = addr; + dhcp_client->state = REBOOTING; + send_request(dhcp_client); + + dhcp_client->timeout = g_timeout_add_seconds_full( + G_PRIORITY_HIGH, + REQUEST_TIMEOUT, + reboot_timeout, + dhcp_client, + NULL); + return 0; + } send_discover(dhcp_client, addr); dhcp_client->timeout = g_timeout_add_seconds_full(G_PRIORITY_HIGH, @@ -2773,10 +2824,7 @@ void g_dhcp_client_stop(GDHCPClient *dhcp_client) send_release(dhcp_client, dhcp_client->server_ip, dhcp_client->requested_ip); - if (dhcp_client->timeout > 0) { - g_source_remove(dhcp_client->timeout); - dhcp_client->timeout = 0; - } + remove_timeouts(dhcp_client); if (dhcp_client->listener_watch > 0) { g_source_remove(dhcp_client->listener_watch); @@ -2919,6 +2967,7 @@ char *g_dhcp_client_get_netmask(GDHCPClient *dhcp_client) if (option) return g_strdup(option->data); case INIT_SELECTING: + case REBOOTING: case REQUESTING: case RELEASED: case IPV4LL_PROBE: diff --git a/connman/gdhcp/common.c b/gdhcp/common.c similarity index 100% rename from connman/gdhcp/common.c rename to gdhcp/common.c diff --git a/connman/gdhcp/common.h b/gdhcp/common.h similarity index 100% rename from connman/gdhcp/common.h rename to gdhcp/common.h diff --git a/connman/gdhcp/gdhcp.h b/gdhcp/gdhcp.h similarity index 100% rename from connman/gdhcp/gdhcp.h rename to gdhcp/gdhcp.h diff --git a/connman/gdhcp/ipv4ll.c b/gdhcp/ipv4ll.c similarity index 100% rename from connman/gdhcp/ipv4ll.c rename to gdhcp/ipv4ll.c diff --git a/connman/gdhcp/ipv4ll.h b/gdhcp/ipv4ll.h similarity index 100% rename from connman/gdhcp/ipv4ll.h rename to gdhcp/ipv4ll.h diff --git a/connman/gdhcp/server.c b/gdhcp/server.c similarity index 100% rename from connman/gdhcp/server.c rename to gdhcp/server.c diff --git a/connman/gdhcp/unaligned.h b/gdhcp/unaligned.h similarity index 100% rename from connman/gdhcp/unaligned.h rename to gdhcp/unaligned.h diff --git a/connman/gsupplicant/dbus.c b/gsupplicant/dbus.c similarity index 100% rename from connman/gsupplicant/dbus.c rename to gsupplicant/dbus.c diff --git a/connman/gsupplicant/dbus.h b/gsupplicant/dbus.h similarity index 100% rename from connman/gsupplicant/dbus.h rename to gsupplicant/dbus.h diff --git a/connman/gsupplicant/gsupplicant.h b/gsupplicant/gsupplicant.h similarity index 100% rename from connman/gsupplicant/gsupplicant.h rename to gsupplicant/gsupplicant.h diff --git a/connman/gsupplicant/supplicant.c b/gsupplicant/supplicant.c similarity index 99% rename from connman/gsupplicant/supplicant.c rename to gsupplicant/supplicant.c index 378c8f1f1..ff1151f1e 100644 --- a/connman/gsupplicant/supplicant.c +++ b/gsupplicant/supplicant.c @@ -2278,7 +2278,7 @@ static void signal_wps_event(const char *path, DBusMessageIter *iter) if (g_strcmp0(name, "success") == 0) interface->wps_state = G_SUPPLICANT_WPS_STATE_SUCCESS; - else if (g_strcmp0(name, "failed") == 0) + else if (g_strcmp0(name, "fail") == 0) interface->wps_state = G_SUPPLICANT_WPS_STATE_FAIL; else interface->wps_state = G_SUPPLICANT_WPS_STATE_UNKNOWN; diff --git a/connman/gweb/giognutls.c b/gweb/giognutls.c similarity index 100% rename from connman/gweb/giognutls.c rename to gweb/giognutls.c diff --git a/connman/gweb/giognutls.h b/gweb/giognutls.h similarity index 100% rename from connman/gweb/giognutls.h rename to gweb/giognutls.h diff --git a/connman/gweb/gionotls.c b/gweb/gionotls.c similarity index 100% rename from connman/gweb/gionotls.c rename to gweb/gionotls.c diff --git a/connman/gweb/gresolv.c b/gweb/gresolv.c similarity index 100% rename from connman/gweb/gresolv.c rename to gweb/gresolv.c diff --git a/connman/gweb/gresolv.h b/gweb/gresolv.h similarity index 100% rename from connman/gweb/gresolv.h rename to gweb/gresolv.h diff --git a/connman/gweb/gweb.c b/gweb/gweb.c similarity index 100% rename from connman/gweb/gweb.c rename to gweb/gweb.c diff --git a/connman/gweb/gweb.h b/gweb/gweb.h similarity index 100% rename from connman/gweb/gweb.h rename to gweb/gweb.h diff --git a/connman/include/agent.h b/include/agent.h similarity index 100% rename from connman/include/agent.h rename to include/agent.h diff --git a/connman/include/dbus.h b/include/dbus.h similarity index 100% rename from connman/include/dbus.h rename to include/dbus.h diff --git a/connman/include/device.h b/include/device.h similarity index 100% rename from connman/include/device.h rename to include/device.h diff --git a/connman/include/inet.h b/include/inet.h similarity index 100% rename from connman/include/inet.h rename to include/inet.h diff --git a/connman/include/inotify.h b/include/inotify.h similarity index 100% rename from connman/include/inotify.h rename to include/inotify.h diff --git a/connman/include/ipaddress.h b/include/ipaddress.h similarity index 100% rename from connman/include/ipaddress.h rename to include/ipaddress.h diff --git a/connman/include/ipconfig.h b/include/ipconfig.h similarity index 100% rename from connman/include/ipconfig.h rename to include/ipconfig.h diff --git a/connman/include/log.h b/include/log.h similarity index 100% rename from connman/include/log.h rename to include/log.h diff --git a/connman/include/network.h b/include/network.h similarity index 99% rename from connman/include/network.h rename to include/network.h index 3e4cfb4e8..39ab1f3a4 100644 --- a/connman/include/network.h +++ b/include/network.h @@ -46,6 +46,7 @@ enum connman_network_type { CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN = 8, CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN = 9, CONNMAN_NETWORK_TYPE_CELLULAR = 10, + CONNMAN_NETWORK_TYPE_GADGET = 11, CONNMAN_NETWORK_TYPE_VENDOR = 10000, }; diff --git a/connman/include/notifier.h b/include/notifier.h similarity index 100% rename from connman/include/notifier.h rename to include/notifier.h diff --git a/connman/include/option.h b/include/option.h similarity index 100% rename from connman/include/option.h rename to include/option.h diff --git a/connman/include/plugin.h b/include/plugin.h similarity index 100% rename from connman/include/plugin.h rename to include/plugin.h diff --git a/connman/include/provider.h b/include/provider.h similarity index 100% rename from connman/include/provider.h rename to include/provider.h diff --git a/connman/include/provision.h b/include/provision.h similarity index 100% rename from connman/include/provision.h rename to include/provision.h diff --git a/connman/include/proxy.h b/include/proxy.h similarity index 100% rename from connman/include/proxy.h rename to include/proxy.h diff --git a/connman/include/resolver.h b/include/resolver.h similarity index 100% rename from connman/include/resolver.h rename to include/resolver.h diff --git a/connman/include/rtnl.h b/include/rtnl.h similarity index 100% rename from connman/include/rtnl.h rename to include/rtnl.h diff --git a/connman/include/service.h b/include/service.h similarity index 95% rename from connman/include/service.h rename to include/service.h index fa0cc9fa2..d418dd860 100644 --- a/connman/include/service.h +++ b/include/service.h @@ -87,11 +87,17 @@ enum connman_service_proxy_method { CONNMAN_SERVICE_PROXY_METHOD_AUTO = 3, }; +enum connman_service_connect_reason { + CONNMAN_SERVICE_CONNECT_REASON_NONE = 0, + CONNMAN_SERVICE_CONNECT_REASON_AUTO = 1, + CONNMAN_SERVICE_CONNECT_REASON_USER = 2, + CONNMAN_SERVICE_CONNECT_REASON_SESSION = 3, +}; + struct connman_service; struct connman_network; struct connman_service *connman_service_create(void); -int connman_service_remove(const char *identifier); #define connman_service_ref(service) \ connman_service_ref_debug(service, __FILE__, __LINE__, __func__) diff --git a/connman/include/session.h b/include/session.h similarity index 97% rename from connman/include/session.h rename to include/session.h index 2be999fa5..2001e0c25 100644 --- a/connman/include/session.h +++ b/include/session.h @@ -74,10 +74,12 @@ typedef int (* connman_session_config_func_t) (struct connman_session *session, struct connman_session_policy { const char *name; int priority; + bool (*autoconnect)(enum connman_service_connect_reason reason); int (*create)(struct connman_session *session, connman_session_config_func_t cb, void *user_data); void (*destroy)(struct connman_session *session); + }; int connman_session_policy_register(struct connman_session_policy *config); diff --git a/connman/include/setting.h b/include/setting.h similarity index 91% rename from connman/include/setting.h rename to include/setting.h index 1eb85dbde..a88202176 100644 --- a/connman/include/setting.h +++ b/include/setting.h @@ -29,9 +29,6 @@ extern "C" { #endif bool connman_setting_get_bool(const char *key); -#define CONF_STATUS_URL_IPV6 "Ipv6StatusUrl" -#define CONF_STATUS_URL_IPV4 "Ipv4StatusUrl" - char **connman_setting_get_string_list(const char *key); unsigned int *connman_setting_get_uint_list(const char *key); diff --git a/connman/include/storage.h b/include/storage.h similarity index 100% rename from connman/include/storage.h rename to include/storage.h diff --git a/connman/include/task.h b/include/task.h similarity index 100% rename from connman/include/task.h rename to include/task.h diff --git a/connman/include/technology.h b/include/technology.h similarity index 97% rename from connman/include/technology.h rename to include/technology.h index e7efcaea3..22df04da3 100644 --- a/connman/include/technology.h +++ b/include/technology.h @@ -66,7 +66,6 @@ struct connman_technology_driver { int connman_technology_driver_register(struct connman_technology_driver *driver); void connman_technology_driver_unregister(struct connman_technology_driver *driver); -connman_bool_t connman_technology_load_offlinemode(); #ifdef __cplusplus } diff --git a/connman/include/timeserver.h b/include/timeserver.h similarity index 100% rename from connman/include/timeserver.h rename to include/timeserver.h diff --git a/connman/include/utsname.h b/include/utsname.h similarity index 100% rename from connman/include/utsname.h rename to include/utsname.h diff --git a/connman/include/version.h.in b/include/version.h.in similarity index 100% rename from connman/include/version.h.in rename to include/version.h.in diff --git a/connman/include/vpn-dbus.h b/include/vpn-dbus.h similarity index 100% rename from connman/include/vpn-dbus.h rename to include/vpn-dbus.h diff --git a/connman/plugins/bluetooth.c b/plugins/bluetooth.c similarity index 100% rename from connman/plugins/bluetooth.c rename to plugins/bluetooth.c diff --git a/connman/plugins/bluetooth_legacy.c b/plugins/bluetooth_legacy.c similarity index 100% rename from connman/plugins/bluetooth_legacy.c rename to plugins/bluetooth_legacy.c diff --git a/connman/plugins/connman-nmcompat.conf b/plugins/connman-nmcompat.conf similarity index 100% rename from connman/plugins/connman-nmcompat.conf rename to plugins/connman-nmcompat.conf diff --git a/connman/plugins/dundee.c b/plugins/dundee.c similarity index 100% rename from connman/plugins/dundee.c rename to plugins/dundee.c diff --git a/connman/plugins/ethernet.c b/plugins/ethernet.c similarity index 55% rename from connman/plugins/ethernet.c rename to plugins/ethernet.c index 260d32cd2..79c233fb9 100644 --- a/connman/plugins/ethernet.c +++ b/plugins/ethernet.c @@ -50,19 +50,19 @@ struct ethernet_data { struct connman_network *network; }; -static int cable_probe(struct connman_network *network) +static int eth_network_probe(struct connman_network *network) { DBG("network %p", network); return 0; } -static void cable_remove(struct connman_network *network) +static void eth_network_remove(struct connman_network *network) { DBG("network %p", network); } -static int cable_connect(struct connman_network *network) +static int eth_network_connect(struct connman_network *network) { DBG("network %p", network); @@ -71,7 +71,7 @@ static int cable_connect(struct connman_network *network) return 0; } -static int cable_disconnect(struct connman_network *network) +static int eth_network_disconnect(struct connman_network *network) { DBG("network %p", network); @@ -80,13 +80,13 @@ static int cable_disconnect(struct connman_network *network) return 0; } -static struct connman_network_driver cable_driver = { +static struct connman_network_driver eth_network_driver = { .name = "cable", .type = CONNMAN_NETWORK_TYPE_ETHERNET, - .probe = cable_probe, - .remove = cable_remove, - .connect = cable_connect, - .disconnect = cable_disconnect, + .probe = eth_network_probe, + .remove = eth_network_remove, + .connect = eth_network_connect, + .disconnect = eth_network_disconnect, }; static void add_network(struct connman_device *device, @@ -163,7 +163,7 @@ static void ethernet_newlink(unsigned flags, unsigned change, void *user_data) ethernet->flags = flags; } -static int ethernet_probe(struct connman_device *device) +static int eth_dev_probe(struct connman_device *device) { struct ethernet_data *ethernet; @@ -184,7 +184,7 @@ static int ethernet_probe(struct connman_device *device) return 0; } -static void ethernet_remove(struct connman_device *device) +static void eth_dev_remove(struct connman_device *device) { struct ethernet_data *ethernet = connman_device_get_data(device); @@ -199,7 +199,7 @@ static void ethernet_remove(struct connman_device *device) g_free(ethernet); } -static int ethernet_enable(struct connman_device *device) +static int eth_dev_enable(struct connman_device *device) { struct ethernet_data *ethernet = connman_device_get_data(device); @@ -208,7 +208,7 @@ static int ethernet_enable(struct connman_device *device) return connman_inet_ifup(ethernet->index); } -static int ethernet_disable(struct connman_device *device) +static int eth_dev_disable(struct connman_device *device) { struct ethernet_data *ethernet = connman_device_get_data(device); @@ -217,148 +217,28 @@ static int ethernet_disable(struct connman_device *device) return connman_inet_ifdown(ethernet->index); } -static struct connman_device_driver ethernet_driver = { +static struct connman_device_driver eth_dev_driver = { .name = "ethernet", .type = CONNMAN_DEVICE_TYPE_ETHERNET, - .probe = ethernet_probe, - .remove = ethernet_remove, - .enable = ethernet_enable, - .disable = ethernet_disable, + .probe = eth_dev_probe, + .remove = eth_dev_remove, + .enable = eth_dev_enable, + .disable = eth_dev_disable, }; -static int gadget_probe(struct connman_device *device) +static int eth_tech_probe(struct connman_technology *technology) { - DBG("device %p", device); - return 0; -} -static void gadget_remove(struct connman_device *device) -{ - DBG("device %p", device); -} -static int gadget_enable(struct connman_device *device) -{ - DBG("device %p", device); - return 0; -} -static int gadget_disable(struct connman_device *device) -{ - DBG("device %p", device); - return 0; -} - -static struct connman_device_driver gadget_driver = { - .name = "gadget", - .type = CONNMAN_DEVICE_TYPE_GADGET, - .probe = gadget_probe, - .remove = gadget_remove, - .enable = gadget_enable, - .disable = gadget_disable, -}; - -static GList *cdc_interface_list = NULL; - -static void tech_add_interface(struct connman_technology *technology, - int index, const char *name, const char *ident) -{ - DBG("index %d name %s ident %s", index, name, ident); - - if (g_list_find(cdc_interface_list, GINT_TO_POINTER((int)index))) - return; - - cdc_interface_list = g_list_prepend(cdc_interface_list, - (GINT_TO_POINTER((int) index))); -} - -static void tech_remove_interface(struct connman_technology *technology, - int index) -{ - DBG("index %d", index); - - cdc_interface_list = g_list_remove(cdc_interface_list, - GINT_TO_POINTER((int) index)); -} - -static void enable_tethering(struct connman_technology *technology, - const char *bridge) -{ - GList *list; - - for (list = cdc_interface_list; list; list = list->next) { - int index = GPOINTER_TO_INT(list->data); - - connman_technology_tethering_notify(technology, true); - - connman_inet_ifup(index); - - connman_inet_add_to_bridge(index, bridge); - } -} - -static void disable_tethering(struct connman_technology *technology, - const char *bridge) -{ - GList *list; - - for (list = cdc_interface_list; list; list = list->next) { - int index = GPOINTER_TO_INT(list->data); - - connman_inet_remove_from_bridge(index, bridge); - - connman_inet_ifdown(index); - - connman_technology_tethering_notify(technology, false); - } -} - -static int tech_set_tethering(struct connman_technology *technology, - const char *identifier, const char *passphrase, - const char *bridge, bool enabled) -{ - DBG("bridge %s enabled %d", bridge, enabled); - - if (enabled) - enable_tethering(technology, bridge); - else - disable_tethering(technology, bridge); - return 0; } -static int tech_probe(struct connman_technology *technology) -{ - return 0; -} - -static void tech_remove(struct connman_technology *technology) -{ - g_list_free(cdc_interface_list); - - cdc_interface_list = NULL; -} - -static struct connman_technology_driver tech_driver = { - .name = "cdc_ethernet", - .type = CONNMAN_SERVICE_TYPE_GADGET, - .probe = tech_probe, - .remove = tech_remove, - .add_interface = tech_add_interface, - .remove_interface = tech_remove_interface, - .set_tethering = tech_set_tethering, -}; - -static int eth_probe(struct connman_technology *technology) -{ - return 0; -} - -static void eth_remove(struct connman_technology *technology) +static void eth_tech_remove(struct connman_technology *technology) { DBG(""); } static GList *eth_interface_list = NULL; -static void eth_add_interface(struct connman_technology *technology, +static void eth_tech_add_interface(struct connman_technology *technology, int index, const char *name, const char *ident) { DBG("index %d name %s ident %s", index, name, ident); @@ -370,7 +250,7 @@ static void eth_add_interface(struct connman_technology *technology, (GINT_TO_POINTER((int) index))); } -static void eth_remove_interface(struct connman_technology *technology, +static void eth_tech_remove_interface(struct connman_technology *technology, int index) { DBG("index %d", index); @@ -379,7 +259,7 @@ static void eth_remove_interface(struct connman_technology *technology, GINT_TO_POINTER((int) index)); } -static void eth_enable_tethering(struct connman_technology *technology, +static void eth_tech_enable_tethering(struct connman_technology *technology, const char *bridge) { GList *list; @@ -402,7 +282,7 @@ static void eth_enable_tethering(struct connman_technology *technology, } } -static void eth_disable_tethering(struct connman_technology *technology, +static void eth_tech_disable_tethering(struct connman_technology *technology, const char *bridge) { GList *list; @@ -425,7 +305,7 @@ static void eth_disable_tethering(struct connman_technology *technology, } } -static int eth_set_tethering(struct connman_technology *technology, +static int eth_tech_set_tethering(struct connman_technology *technology, const char *identifier, const char *passphrase, const char *bridge, bool enabled) { @@ -436,53 +316,38 @@ static int eth_set_tethering(struct connman_technology *technology, DBG("bridge %s enabled %d", bridge, enabled); if (enabled) - eth_enable_tethering(technology, bridge); + eth_tech_enable_tethering(technology, bridge); else - eth_disable_tethering(technology, bridge); + eth_tech_disable_tethering(technology, bridge); return 0; } -static struct connman_technology_driver eth_driver = { +static struct connman_technology_driver eth_tech_driver = { .name = "ethernet", .type = CONNMAN_SERVICE_TYPE_ETHERNET, - .probe = eth_probe, - .remove = eth_remove, - .add_interface = eth_add_interface, - .remove_interface = eth_remove_interface, - .set_tethering = eth_set_tethering, + .probe = eth_tech_probe, + .remove = eth_tech_remove, + .add_interface = eth_tech_add_interface, + .remove_interface = eth_tech_remove_interface, + .set_tethering = eth_tech_set_tethering, }; static int ethernet_init(void) { int err; - err = connman_technology_driver_register(ð_driver); + err = connman_technology_driver_register(ð_tech_driver); if (err < 0) return err; - err = connman_network_driver_register(&cable_driver); + err = connman_network_driver_register(ð_network_driver); if (err < 0) return err; - err = connman_device_driver_register(ðernet_driver); - if (err < 0) { - connman_network_driver_unregister(&cable_driver); - return err; - } - - err = connman_technology_driver_register(&tech_driver); + err = connman_device_driver_register(ð_dev_driver); if (err < 0) { - connman_device_driver_unregister(ðernet_driver); - connman_network_driver_unregister(&cable_driver); - return err; - } - - err = connman_device_driver_register(&gadget_driver); - if (err < 0) { - connman_technology_driver_unregister(&tech_driver); - connman_device_driver_unregister(ðernet_driver); - connman_network_driver_unregister(&cable_driver); + connman_network_driver_unregister(ð_network_driver); return err; } @@ -491,15 +356,11 @@ static int ethernet_init(void) static void ethernet_exit(void) { - connman_technology_driver_unregister(ð_driver); - - connman_technology_driver_unregister(&tech_driver); - - connman_network_driver_unregister(&cable_driver); + connman_technology_driver_unregister(ð_tech_driver); - connman_device_driver_unregister(ðernet_driver); + connman_network_driver_unregister(ð_network_driver); - connman_device_driver_unregister(&gadget_driver); + connman_device_driver_unregister(ð_dev_driver); } CONNMAN_PLUGIN_DEFINE(ethernet, "Ethernet interface plugin", VERSION, diff --git a/plugins/gadget.c b/plugins/gadget.c new file mode 100644 index 000000000..76633c62b --- /dev/null +++ b/plugins/gadget.c @@ -0,0 +1,349 @@ +/* + * + * Connection Manager + * + * Copyright (C) 2007-2012 Intel Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#ifndef IFF_LOWER_UP +#define IFF_LOWER_UP 0x10000 +#endif + +#include + +#define CONNMAN_API_SUBJECT_TO_CHANGE +#include +#include +#include +#include +#include +#include + +static bool gadget_tethering = false; + +struct gadget_data { + int index; + unsigned flags; + unsigned int watch; + struct connman_network *network; +}; + +static int gadget_network_probe(struct connman_network *network) +{ + DBG("network %p", network); + + return 0; +} + +static void gadget_network_remove(struct connman_network *network) +{ + DBG("network %p", network); +} + +static int gadget_network_connect(struct connman_network *network) +{ + DBG("network %p", network); + + connman_network_set_connected(network, true); + + return 0; +} + +static int gadget_network_disconnect(struct connman_network *network) +{ + DBG("network %p", network); + + connman_network_set_connected(network, false); + + return 0; +} + +static struct connman_network_driver gadget_network_driver = { + .name = "usb", + .type = CONNMAN_NETWORK_TYPE_GADGET, + .probe = gadget_network_probe, + .remove = gadget_network_remove, + .connect = gadget_network_connect, + .disconnect = gadget_network_disconnect, +}; + +static void add_network(struct connman_device *device, + struct gadget_data *gadget) +{ + struct connman_network *network; + int index; + + network = connman_network_create("gadget", + CONNMAN_NETWORK_TYPE_GADGET); + if (!network) + return; + + index = connman_device_get_index(device); + connman_network_set_index(network, index); + + connman_network_set_name(network, "Wired"); + + if (connman_device_add_network(device, network) < 0) { + connman_network_unref(network); + return; + } + + if (!gadget_tethering) + /* + * Prevent service from starting the reconnect + * procedure as we do not want the DHCP client + * to run when tethering. + */ + connman_network_set_group(network, "usb"); + + gadget->network = network; +} + +static void remove_network(struct connman_device *device, + struct gadget_data *gadget) +{ + if (!gadget->network) + return; + + connman_device_remove_network(device, gadget->network); + connman_network_unref(gadget->network); + + gadget->network = NULL; +} + +static void gadget_newlink(unsigned flags, unsigned change, void *user_data) +{ + struct connman_device *device = user_data; + struct gadget_data *gadget = connman_device_get_data(device); + + DBG("index %d flags %d change %d", gadget->index, flags, change); + + if ((gadget->flags & IFF_UP) != (flags & IFF_UP)) { + if (flags & IFF_UP) { + DBG("power on"); + connman_device_set_powered(device, true); + } else { + DBG("power off"); + connman_device_set_powered(device, false); + } + } + + if ((gadget->flags & IFF_LOWER_UP) != (flags & IFF_LOWER_UP)) { + if (flags & IFF_LOWER_UP) { + DBG("carrier on"); + add_network(device, gadget); + } else { + DBG("carrier off"); + remove_network(device, gadget); + } + } + + gadget->flags = flags; +} + +static int gadget_dev_probe(struct connman_device *device) +{ + struct gadget_data *gadget; + + DBG("device %p", device); + + gadget = g_try_new0(struct gadget_data, 1); + if (!gadget) + return -ENOMEM; + + connman_device_set_data(device, gadget); + + gadget->index = connman_device_get_index(device); + gadget->flags = 0; + + gadget->watch = connman_rtnl_add_newlink_watch(gadget->index, + gadget_newlink, device); + + return 0; +} + +static void gadget_dev_remove(struct connman_device *device) +{ + struct gadget_data *gadget = connman_device_get_data(device); + + DBG("device %p", device); + + connman_device_set_data(device, NULL); + + connman_rtnl_remove_watch(gadget->watch); + + remove_network(device, gadget); + + g_free(gadget); +} + +static int gadget_dev_enable(struct connman_device *device) +{ + struct gadget_data *gadget = connman_device_get_data(device); + + DBG("device %p", device); + + return connman_inet_ifup(gadget->index); +} + +static int gadget_dev_disable(struct connman_device *device) +{ + struct gadget_data *gadget = connman_device_get_data(device); + + DBG("device %p", device); + + return connman_inet_ifdown(gadget->index); +} + +static struct connman_device_driver gadget_dev_driver = { + .name = "gadget", + .type = CONNMAN_DEVICE_TYPE_GADGET, + .probe = gadget_dev_probe, + .remove = gadget_dev_remove, + .enable = gadget_dev_enable, + .disable = gadget_dev_disable, +}; + +static GList *cdc_interface_list = NULL; + +static void gadget_tech_add_interface(struct connman_technology *technology, + int index, const char *name, const char *ident) +{ + DBG("index %d name %s ident %s", index, name, ident); + + if (g_list_find(cdc_interface_list, GINT_TO_POINTER((int)index))) + return; + + cdc_interface_list = g_list_prepend(cdc_interface_list, + (GINT_TO_POINTER((int) index))); +} + +static void gadget_tech_remove_interface(struct connman_technology *technology, + int index) +{ + DBG("index %d", index); + + cdc_interface_list = g_list_remove(cdc_interface_list, + GINT_TO_POINTER((int) index)); +} + +static void gadget_tech_enable_tethering(struct connman_technology *technology, + const char *bridge) +{ + GList *list; + + for (list = cdc_interface_list; list; list = list->next) { + int index = GPOINTER_TO_INT(list->data); + + connman_technology_tethering_notify(technology, true); + + connman_inet_ifup(index); + + connman_inet_add_to_bridge(index, bridge); + } +} + +static void gadget_tech_disable_tethering(struct connman_technology *technology, + const char *bridge) +{ + GList *list; + + for (list = cdc_interface_list; list; list = list->next) { + int index = GPOINTER_TO_INT(list->data); + + connman_inet_remove_from_bridge(index, bridge); + + connman_inet_ifdown(index); + + connman_technology_tethering_notify(technology, false); + } +} + +static int gadget_tech_set_tethering(struct connman_technology *technology, + const char *identifier, const char *passphrase, + const char *bridge, bool enabled) +{ + DBG("bridge %s enabled %d", bridge, enabled); + + if (enabled) + gadget_tech_enable_tethering(technology, bridge); + else + gadget_tech_disable_tethering(technology, bridge); + + return 0; +} + +static int gadget_tech_probe(struct connman_technology *technology) +{ + return 0; +} + +static void gadget_tech_remove(struct connman_technology *technology) +{ + g_list_free(cdc_interface_list); + + cdc_interface_list = NULL; +} + +static struct connman_technology_driver gadget_tech_driver = { + .name = "cdc_ethernet", + .type = CONNMAN_SERVICE_TYPE_GADGET, + .probe = gadget_tech_probe, + .remove = gadget_tech_remove, + .add_interface = gadget_tech_add_interface, + .remove_interface = gadget_tech_remove_interface, + .set_tethering = gadget_tech_set_tethering, +}; + +static int gadget_init(void) +{ + int err; + + err = connman_technology_driver_register(&gadget_tech_driver); + if (err < 0) { + return err; + } + + err = connman_network_driver_register(&gadget_network_driver); + if (err < 0) + return err; + + err = connman_device_driver_register(&gadget_dev_driver); + if (err < 0) { + connman_technology_driver_unregister(&gadget_tech_driver); + return err; + } + + return 0; +} + +static void gadget_exit(void) +{ + connman_technology_driver_unregister(&gadget_tech_driver); + connman_network_driver_unregister(&gadget_network_driver); + connman_device_driver_unregister(&gadget_dev_driver); +} + +CONNMAN_PLUGIN_DEFINE(gadget, "Gadget interface plugin", VERSION, + CONNMAN_PLUGIN_PRIORITY_DEFAULT, gadget_init, gadget_exit) diff --git a/connman/plugins/hh2serial-gps.c b/plugins/hh2serial-gps.c similarity index 100% rename from connman/plugins/hh2serial-gps.c rename to plugins/hh2serial-gps.c diff --git a/connman/plugins/iospm.c b/plugins/iospm.c similarity index 100% rename from connman/plugins/iospm.c rename to plugins/iospm.c diff --git a/connman/plugins/loopback.c b/plugins/loopback.c similarity index 100% rename from connman/plugins/loopback.c rename to plugins/loopback.c diff --git a/connman/plugins/mcc.h b/plugins/mcc.h similarity index 100% rename from connman/plugins/mcc.h rename to plugins/mcc.h diff --git a/connman/plugins/neard.c b/plugins/neard.c similarity index 100% rename from connman/plugins/neard.c rename to plugins/neard.c diff --git a/connman/plugins/nmcompat.c b/plugins/nmcompat.c similarity index 100% rename from connman/plugins/nmcompat.c rename to plugins/nmcompat.c diff --git a/connman/plugins/ofono.c b/plugins/ofono.c similarity index 99% rename from connman/plugins/ofono.c rename to plugins/ofono.c index b5c902b35..b47f5baac 100644 --- a/connman/plugins/ofono.c +++ b/plugins/ofono.c @@ -42,7 +42,6 @@ #include #include "mcc.h" -#include "connman.h" #define OFONO_SERVICE "org.ofono" @@ -982,16 +981,8 @@ static void create_device(struct modem_data *modem) } modem->device = device; - - connman_bool_t isOffline = connman_technology_load_offlinemode(); - if(!isOffline) { - // We must set modem online in boot if flight mode is not - // enabled - modem_set_online(modem, TRUE); - } connman_device_set_powered(modem->device, modem->online); - out: g_free(ident); } @@ -2084,7 +2075,6 @@ static void modem_update_interfaces(struct modem_data *modem, static gboolean modem_changed(DBusConnection *conn, DBusMessage *message, void *user_data) { - DBG("enter"); const char *path = dbus_message_get_path(message); struct modem_data *modem; DBusMessageIter iter, value; @@ -2110,6 +2100,7 @@ static gboolean modem_changed(DBusConnection *conn, DBusMessage *message, dbus_message_iter_get_basic(&value, &powered); modem->powered = powered; + DBG("%s Powered %d", modem->path, modem->powered); if (!modem->powered) @@ -2119,22 +2110,14 @@ static gboolean modem_changed(DBusConnection *conn, DBusMessage *message, dbus_message_iter_get_basic(&value, &online); modem->online = online; + DBG("%s Online %d", modem->path, modem->online); if (!modem->device) return TRUE; - - gboolean offlinemode = TRUE; - - if (modem->online) - offlinemode = FALSE; connman_device_set_powered(modem->device, modem->online); - // Ensure that the flight mode status is saved to - // file over boot when changed by someone else - __connman_technology_set_offlinemode(offlinemode); } else if (g_str_equal(key, "Interfaces")) { - uint8_t interfaces; interfaces = extract_interfaces(&value); diff --git a/connman/plugins/pacrunner.c b/plugins/pacrunner.c similarity index 100% rename from connman/plugins/pacrunner.c rename to plugins/pacrunner.c diff --git a/connman/plugins/polkit.c b/plugins/polkit.c similarity index 100% rename from connman/plugins/polkit.c rename to plugins/polkit.c diff --git a/connman/plugins/polkit.policy b/plugins/polkit.policy similarity index 100% rename from connman/plugins/polkit.policy rename to plugins/polkit.policy diff --git a/connman/plugins/session_policy_local.c b/plugins/session_policy_local.c similarity index 99% rename from connman/plugins/session_policy_local.c rename to plugins/session_policy_local.c index eaeaf79f2..4e8b5f212 100644 --- a/connman/plugins/session_policy_local.c +++ b/plugins/session_policy_local.c @@ -565,7 +565,9 @@ static void recheck_sessions(void) if (policy->group) continue; - group = g_hash_table_lookup(selinux_hash, policy->selinux); + if (policy->selinux) + group = g_hash_table_lookup(selinux_hash, + policy->selinux); if (group) { policy->config->id_type = CONNMAN_SESSION_ID_TYPE_LSM; g_free(policy->config->id); diff --git a/connman/plugins/tist.c b/plugins/tist.c similarity index 100% rename from connman/plugins/tist.c rename to plugins/tist.c diff --git a/connman/plugins/vpn.c b/plugins/vpn.c similarity index 100% rename from connman/plugins/vpn.c rename to plugins/vpn.c diff --git a/connman/plugins/wifi.c b/plugins/wifi.c similarity index 99% rename from connman/plugins/wifi.c rename to plugins/wifi.c index c8be09f49..6da3c537c 100644 --- a/connman/plugins/wifi.c +++ b/plugins/wifi.c @@ -58,8 +58,7 @@ #define CLEANUP_TIMEOUT 8 /* in seconds */ #define INACTIVE_TIMEOUT 12 /* in seconds */ -#define MAXIMUM_RETRIES 2 -#define FAVORITE_MAXIMUM_RETRIES 4 +#define FAVORITE_MAXIMUM_RETRIES 2 #define BGSCAN_DEFAULT "simple:30:-45:300" #define AUTOSCAN_DEFAULT "exponential:3:300" @@ -1581,8 +1580,7 @@ static bool handle_4way_handshake_failure(GSupplicantInterface *interface, if (connman_service_get_favorite(service)) { if (wifi->retries < FAVORITE_MAXIMUM_RETRIES) return true; - } else if (wifi->retries < MAXIMUM_RETRIES) - return true; + } wifi->retries = 0; connman_network_set_error(network, CONNMAN_NETWORK_ERROR_INVALID_KEY); diff --git a/rpm/connman.spec b/rpm/connman.spec deleted file mode 100644 index 930efe8e5..000000000 --- a/rpm/connman.spec +++ /dev/null @@ -1,179 +0,0 @@ -Name: connman -Summary: Connection Manager -Version: 1.15 -Release: 1 -Group: Communications/ConnMan -License: GPLv2 -URL: http://connman.net/ -Source0: %{name}-%{version}.tar.bz2 -Source1: connman.tracing -Source2: main.conf -Requires: dbus >= 1.4 -Requires: wpa_supplicant >= 0.7.1 -Requires: bluez -Requires: ofono -Requires: pacrunner -Requires: connman-configs -Requires: systemd -Requires(preun): systemd -Requires(post): systemd -Requires(postun): systemd -BuildRequires: pkgconfig(xtables) -BuildRequires: pkgconfig(glib-2.0) >= 2.28 -BuildRequires: pkgconfig(gthread-2.0) >= 2.16 -BuildRequires: pkgconfig(dbus-1) >= 1.4 -BuildRequires: pkgconfig(gnutls) -BuildRequires: openconnect -BuildRequires: openvpn -BuildRequires: readline-devel -BuildRequires: pkgconfig(libsystemd-daemon) - -%description -Connection Manager provides a daemon for managing Internet connections -within embedded devices running the Linux operating system. - - -%package devel -Summary: Development files for Connection Manager -Group: Development/Libraries -Requires: %{name} = %{version}-%{release} - -%description devel -connman-devel contains development files for use with connman. - -%package test -Summary: Test Scripts for Connection Manager -Group: Development/Tools -Requires: %{name} = %{version}-%{release} -Requires: dbus-python -Requires: pygobject2 - -%description test -Scripts for testing Connman and its functionality - -%package tools -Summary: Development tools for Connection Manager -Group: Development/Tools -Requires: %{name} = %{version}-%{release} - -%description tools -Programs for debugging Connman - -%package tracing -Summary: Configuration for Connection Manager to enable tracing -Group: Development/Tools -Requires: %{name} = %{version}-%{release} - -%description tracing -Will enable tracing for ConnMan - -%package configs-mer -Summary: Package to provide default configs for connman -Group: Development/Tools -Requires: %{name} = %{version}-%{release} -Provides: connman-configs - -%description configs-mer -This package provides default configs for connman, such as -FallbackTimeservers. - - -%package docs -Summary: Documentation for connman -Group: Documentation -Requires: %{name} = %{version}-%{release} -Requires: %{name} = %{version} - -%description docs -Documentation for connman. - - -%prep -%setup -q -n %{name}-%{version}/connman - -%build - -%reconfigure --disable-static \ - --enable-threads \ - --enable-ethernet=builtin \ - --enable-wifi=builtin \ - --enable-bluetooth=builtin \ - --enable-ofono=builtin \ - --enable-openconnect=builtin \ - --enable-openvpn=builtin \ - --enable-loopback=builtin \ - --enable-pacrunner=builtin \ - --enable-client \ - --enable-test \ - --with-systemdunitdir=/%{_lib}/systemd/system \ - --enable-systemd - -make %{?jobs:-j%jobs} - -%install -rm -rf %{buildroot} -%make_install - -mkdir -p %{buildroot}%{_libdir}/%{name}/tools -cp -a tools/stats-tool %{buildroot}%{_libdir}/%{name}/tools - -mkdir -p %{buildroot}%{_sysconfdir}/tracing/connman/ -cp -a %{SOURCE1} %{buildroot}%{_sysconfdir}/tracing/connman/ -mkdir -p %{buildroot}%{_sysconfdir}/connman/ -cp -a %{SOURCE2} %{buildroot}%{_sysconfdir}/connman/ - -mkdir -p %{buildroot}/%{_lib}/systemd/system/network.target.wants -ln -s ../connman.service %{buildroot}/%{_lib}/systemd/system/network.target.wants/connman.service - -%preun -if [ "$1" -eq 0 ]; then -systemctl stop connman.service || : -fi - -%post -systemctl daemon-reload || : -# Do not restart connman here or network breaks. -# We can't reload it either as connman doesn't -# support that feature. - -%postun -systemctl daemon-reload || : - -%files -%defattr(-,root,root,-) -%doc AUTHORS COPYING ChangeLog README -%{_sbindir}/* -%{_libdir}/%{name}/scripts/* -%config %{_sysconfdir}/dbus-1/system.d/*.conf -/%{_lib}/systemd/system/connman.service -/%{_lib}/systemd/system/network.target.wants/connman.service -/%{_lib}/systemd/system/connman-vpn.service -%{_datadir}/dbus-1/system-services/net.connman.vpn.service - -%files devel -%defattr(-,root,root,-) -%doc AUTHORS COPYING -%{_includedir}/%{name}/*.h -%{_libdir}/pkgconfig/*.pc - -%files test -%defattr(-,root,root,-) -%{_libdir}/%{name}/test/* - -%files tools -%defattr(-,root,root,-) -%{_libdir}/%{name}/tools/* - -%files tracing -%defattr(-,root,root,-) -%config %{_sysconfdir}/tracing/connman - -%files configs-mer -%defattr(-,root,root,-) -%config %{_sysconfdir}/connman/main.conf - -%files docs -%defattr(-,root,root,-) -%{_datadir}/man/man5/connman.conf.5.gz -%{_datadir}/man/man8/connman.8.gz - diff --git a/rpm/connman.tracing b/rpm/connman.tracing deleted file mode 100644 index 79ab67c5f..000000000 --- a/rpm/connman.tracing +++ /dev/null @@ -1 +0,0 @@ -TRACING=-d diff --git a/rpm/main.conf b/rpm/main.conf deleted file mode 100644 index 523f96052..000000000 --- a/rpm/main.conf +++ /dev/null @@ -1,4 +0,0 @@ -[General] - -FallbackTimeservers = 0.pool.ntp.org,1.pool.ntp.org,2.pool.ntp.org,3.pool.ntp.org - diff --git a/connman/scripts/connman.in b/scripts/connman.in similarity index 100% rename from connman/scripts/connman.in rename to scripts/connman.in diff --git a/connman/scripts/libppp-plugin.c b/scripts/libppp-plugin.c similarity index 100% rename from connman/scripts/libppp-plugin.c rename to scripts/libppp-plugin.c diff --git a/connman/scripts/openconnect-script.c b/scripts/openconnect-script.c similarity index 100% rename from connman/scripts/openconnect-script.c rename to scripts/openconnect-script.c diff --git a/connman/scripts/openvpn-script.c b/scripts/openvpn-script.c similarity index 100% rename from connman/scripts/openvpn-script.c rename to scripts/openvpn-script.c diff --git a/connman/src/6to4.c b/src/6to4.c similarity index 98% rename from connman/src/6to4.c rename to src/6to4.c index c32cef92b..0e3a7a156 100644 --- a/connman/src/6to4.c +++ b/src/6to4.c @@ -53,6 +53,8 @@ static unsigned int newlink_watch; static unsigned int newlink_flags; static int newlink_timeout_id; +#define STATUS_URL "http://ipv6.connman.net/online/status.html" + #ifndef IP_DF #define IP_DF 0x4000 /* Flag: "Don't Fragment" */ #endif @@ -315,9 +317,7 @@ static void tun_newlink(unsigned flags, unsigned change, void *user_data) if (getenv("CONNMAN_WEB_DEBUG")) g_web_set_debug(web, web_debug, "6to4"); - const char *url = connman_option_get_string(CONF_STATUS_URL_IPV6); - - web_request_id = g_web_request_get(web, url, + web_request_id = g_web_request_get(web, STATUS_URL, web_result, NULL, NULL); newlink_timeout(NULL); diff --git a/connman/src/agent-connman.c b/src/agent-connman.c similarity index 85% rename from connman/src/agent-connman.c rename to src/agent-connman.c index 653072e73..564abccb3 100644 --- a/connman/src/agent-connman.c +++ b/src/agent-connman.c @@ -639,102 +639,3 @@ int __connman_agent_request_browser(struct connman_service *service, return -EINPROGRESS; } - - -struct request_connect_reply_data { - struct connman_service *service; - request_connect_cb_t callback; - void *user_data; -}; - -static void request_connect_cb(/*connman_bool_t authentication_done,*/ - const char *error,void *user_data) -{ -// handle reply or timeout here - -} - -static void request_connect_reply(DBusMessage *reply, void *user_data) -{ - DBusMessageIter iter; - char *key; - int type; - - struct request_connect_reply_data *connect_reply_data = user_data; - const char *error = NULL; - - dbus_message_iter_init(reply, &iter); - if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR) { - error = dbus_message_get_error_name(reply); - if (g_strcmp0(error, "net.connman.Agent.Error.Canceled") == 0) { - setTryit(0); - } - } - dbus_message_iter_init(reply, &iter); - dbus_message_iter_get_basic(&iter, &key); - - DBG(" request_connect_reply <<<<<<<<<<<<<<<<<<<<<<<<<<<<< %s", key); - - if (g_str_equal(key, "Clear")) { - setTryit(0); - } else if (g_str_equal(key, "Suppress")) { - setTryit(1); - } - - g_free(connect_reply_data); - -} - -int __connman_agent_request_connection(void *user_data) -{ - -// int trythis = (int)user_data; - DBG(" __connman_agent_request_connection <<<<<<<<<<<<<<<<<<<<<<<<<<<<<"); - - request_connect_cb_t callback = request_connect_cb; - DBusMessage *message; - struct request_connect_reply_data *connect_reply_data; - const char *agent_sender, *agent_path; - int err; - - connman_agent_get_info(&agent_sender, &agent_path); - if (agent_path == NULL) { - return -ESRCH; - } - - message = dbus_message_new_method_call(agent_sender, agent_path, - CONNMAN_AGENT_INTERFACE, - "RequestConnect"); - - if (message == NULL) { - return -ENOMEM; - } - - struct connman_service *def_service; - def_service = __connman_service_get_default(); - - connect_reply_data = g_try_new0(struct request_connect_reply_data, 1); - if (connect_reply_data == NULL) { - dbus_message_unref(message); - return -ENOMEM; - } - - connect_reply_data->service = def_service; - connect_reply_data->callback = callback; - connect_reply_data->user_data = user_data; -// TODO is autoconnect - do not send - - err = connman_agent_queue_message(def_service, message, - connman_timeout_input_request(), - request_connect_reply, connect_reply_data); - - if (err < 0 && err != -EBUSY) { - DBG("Eerror %d sending connect request", err); - dbus_message_unref(message); - g_free(connect_reply_data); - return err; - } - - dbus_message_unref(message); - return -EINPROGRESS; -} diff --git a/connman/src/agent.c b/src/agent.c similarity index 98% rename from connman/src/agent.c rename to src/agent.c index b7fbe55dd..bd00c981a 100644 --- a/connman/src/agent.c +++ b/src/agent.c @@ -28,10 +28,10 @@ #include #include -#include "connman.h" #include #include +#include "connman.h" #define agent_ref(agent) \ agent_ref_debug(agent, __FILE__, __LINE__, __func__) @@ -177,15 +177,10 @@ static void agent_receive_message(DBusPendingCall *call, void *user_data) struct connman_agent *agent = user_data; DBusMessage *reply; int err; - DBusMessageIter iter; - char *key; - const char *error = NULL; - int type; DBG("agent %p req %p", agent, agent->pending); reply = dbus_pending_call_steal_reply(call); - dbus_pending_call_unref(call); agent->pending->call = NULL; @@ -222,7 +217,7 @@ int connman_agent_queue_message(void *user_context, struct connman_agent *agent = agent_data; int err; - if (!callback) + if (!user_context || !callback) return -EBADMSG; queue_data = g_new0(struct connman_agent_request, 1); @@ -232,13 +227,12 @@ int connman_agent_queue_message(void *user_context, driver = get_driver(); DBG("driver %p", driver); - if (user_context && driver && driver->context_ref) { + if (driver && driver->context_ref) { queue_data->user_context = driver->context_ref(user_context); queue_data->driver = driver; - } else { + } else queue_data->user_context = user_context; - } - } + queue_data->msg = dbus_message_ref(msg); queue_data->timeout = timeout; queue_data->callback = callback; @@ -307,8 +301,6 @@ static struct connman_agent *agent_create(const char *name, const char *path) agent->owner = g_strdup(name); agent->path = g_strdup(path); -// setTryit(0); - agent->watch = g_dbus_add_disconnect_watch(connection, name, agent_disconnect, agent, NULL); diff --git a/connman/src/bridge.c b/src/bridge.c similarity index 100% rename from connman/src/bridge.c rename to src/bridge.c diff --git a/connman/src/clock.c b/src/clock.c similarity index 100% rename from connman/src/clock.c rename to src/clock.c diff --git a/connman/src/config.c b/src/config.c similarity index 97% rename from connman/src/config.c rename to src/config.c index 19d8b92c6..3cc9e8ebc 100644 --- a/connman/src/config.c +++ b/src/config.c @@ -182,12 +182,14 @@ static void unregister_service(gpointer data) __connman_service_remove(service); /* - * Ethernet service cannot be removed by + * Ethernet or gadget service cannot be removed by * __connman_service_remove() so reset the ipconfig * here. */ if (connman_service_get_type(service) == - CONNMAN_SERVICE_TYPE_ETHERNET) { + CONNMAN_SERVICE_TYPE_ETHERNET || + connman_service_get_type(service) == + CONNMAN_SERVICE_TYPE_GADGET) { __connman_service_disconnect(service); __connman_service_reset_ipconfig(service, CONNMAN_IPCONFIG_TYPE_IPV4, NULL, NULL); @@ -1044,7 +1046,8 @@ static gboolean remove_virtual_config(gpointer user_data) { struct connect_virtual *virtual = user_data; - __connman_service_connect(virtual->service); + __connman_service_connect(virtual->service, + CONNMAN_SERVICE_CONNECT_REASON_AUTO); g_hash_table_remove(config_table, virtual->vfile); g_free(virtual); @@ -1072,6 +1075,10 @@ static void provision_service(gpointer key, gpointer value, g_strcmp0(config->type, "ethernet") != 0) return; + if (type == CONNMAN_SERVICE_TYPE_GADGET && + g_strcmp0(config->type, "gadget") != 0) + return; + DBG("service %p ident %s", service, __connman_service_get_ident(service)); @@ -1241,7 +1248,8 @@ static void provision_service(gpointer key, gpointer value, provision_service_wifi(key, config, service, network, ssid, ssid_len); } else - __connman_service_connect(service); + __connman_service_connect(service, + CONNMAN_SERVICE_CONNECT_REASON_AUTO); __connman_service_mark_dirty(); @@ -1256,7 +1264,7 @@ static void provision_service(gpointer key, gpointer value, g_timeout_add(0, remove_virtual_config, virtual); } else - __connman_service_auto_connect(); + __connman_service_auto_connect(CONNMAN_SERVICE_CONNECT_REASON_AUTO); } int __connman_config_provision_service(struct connman_service *service) @@ -1265,13 +1273,14 @@ int __connman_config_provision_service(struct connman_service *service) GHashTableIter iter; gpointer value, key; - /* For now only WiFi and Ethernet services are supported */ + /* For now only WiFi, Gadget and Ethernet services are supported */ type = connman_service_get_type(service); DBG("service %p type %d", service, type); if (type != CONNMAN_SERVICE_TYPE_WIFI && - type != CONNMAN_SERVICE_TYPE_ETHERNET) + type != CONNMAN_SERVICE_TYPE_ETHERNET && + type != CONNMAN_SERVICE_TYPE_GADGET) return -ENOSYS; g_hash_table_iter_init(&iter, config_table); @@ -1293,13 +1302,14 @@ int __connman_config_provision_service_ident(struct connman_service *service, struct connman_config *config; int ret = 0; - /* For now only WiFi and Ethernet services are supported */ + /* For now only WiFi, Gadget and Ethernet services are supported */ type = connman_service_get_type(service); DBG("service %p type %d", service, type); if (type != CONNMAN_SERVICE_TYPE_WIFI && - type != CONNMAN_SERVICE_TYPE_ETHERNET) + type != CONNMAN_SERVICE_TYPE_ETHERNET && + type != CONNMAN_SERVICE_TYPE_GADGET) return -ENOSYS; config = g_hash_table_lookup(config_table, ident); diff --git a/connman/src/connection.c b/src/connection.c similarity index 100% rename from connman/src/connection.c rename to src/connection.c diff --git a/connman/src/connman-dbus.conf b/src/connman-dbus.conf similarity index 87% rename from connman/src/connman-dbus.conf rename to src/connman-dbus.conf index 4816cdfed..98a773ead 100644 --- a/connman/src/connman-dbus.conf +++ b/src/connman-dbus.conf @@ -8,9 +8,6 @@ - - - diff --git a/connman/src/connman-polkit.conf b/src/connman-polkit.conf similarity index 100% rename from connman/src/connman-polkit.conf rename to src/connman-polkit.conf diff --git a/connman/src/connman.h b/src/connman.h similarity index 97% rename from connman/src/connman.h rename to src/connman.h index 035b01aaa..a02c84d3c 100644 --- a/connman/src/connman.h +++ b/src/connman.h @@ -101,9 +101,6 @@ typedef void (* authentication_cb_t) (struct connman_service *service, typedef void (* browser_authentication_cb_t) (struct connman_service *service, bool authentication_done, const char *error, void *user_data); -typedef void (* request_connect_cb_t) (/*struct connman_service *service,*/ - /*connman_bool_t authentication_done,*/ - const char *error, void *user_data); int __connman_agent_request_passphrase_input(struct connman_service *service, authentication_cb_t callback, const char *dbus_sender, void *user_data); @@ -112,10 +109,6 @@ int __connman_agent_request_login_input(struct connman_service *service, int __connman_agent_request_browser(struct connman_service *service, browser_authentication_cb_t callback, const char *url, void *user_data); -int __connman_agent_request_connection( /*struct connman_service *service, - authentication_cb_t callback, */void *user_data); - -void setTryit(int i); #include @@ -322,13 +315,13 @@ void __connman_ipconfig_enable_ipv6(struct connman_ipconfig *ipconfig); int __connman_ipconfig_init(void); void __connman_ipconfig_cleanup(void); -struct rtnl_link_stats64; +struct rtnl_link_stats; void __connman_ipconfig_newlink(int index, unsigned short type, unsigned int flags, const char *address, unsigned short mtu, - struct rtnl_link_stats64 *stats); -void __connman_ipconfig_dellink(int index, struct rtnl_link_stats64 *stats); + struct rtnl_link_stats *stats); +void __connman_ipconfig_dellink(int index, struct rtnl_link_stats *stats); void __connman_ipconfig_newaddr(int index, int family, const char *label, unsigned char prefixlen, const char *address); void __connman_ipconfig_deladdr(int index, int family, const char *label, @@ -640,12 +633,12 @@ int __connman_service_init(void); void __connman_service_cleanup(void); void __connman_service_list_struct(DBusMessageIter *iter); -void __connman_saved_service_list_struct(DBusMessageIter *iter); struct connman_service *__connman_service_lookup_from_index(int index); struct connman_service *__connman_service_lookup_from_ident(const char *identifier); struct connman_service *__connman_service_create_from_network(struct connman_network *network); struct connman_service *__connman_service_create_from_provider(struct connman_provider *provider); +bool __connman_service_index_is_default(int index); struct connman_service *__connman_service_get_default(void); void __connman_service_update_from_network(struct connman_network *network); void __connman_service_remove_from_network(struct connman_network *network); @@ -679,8 +672,6 @@ int __connman_service_set_immutable(struct connman_service *service, bool immutable); int __connman_service_set_ignore(struct connman_service *service, bool ignore); -void __connman_service_set_userconnect(struct connman_service *service, - bool userconnect); void __connman_service_set_search_domains(struct connman_service *service, char **domains); void __connman_service_update_search_domains(struct connman_service *service, @@ -702,11 +693,12 @@ int __connman_service_indicate_error(struct connman_service *service, int __connman_service_clear_error(struct connman_service *service); int __connman_service_indicate_default(struct connman_service *service); -int __connman_service_connect(struct connman_service *service); +int __connman_service_connect(struct connman_service *service, + enum connman_service_connect_reason reason); int __connman_service_disconnect(struct connman_service *service); int __connman_service_disconnect_all(void); void __connman_service_set_active_session(bool enable, GSList *list); -void __connman_service_auto_connect(void); +void __connman_service_auto_connect(enum connman_service_connect_reason reason); bool __connman_service_remove(struct connman_service *service); bool __connman_service_is_provider_pending(struct connman_service *service); void __connman_service_set_provider_pending(struct connman_service *service, @@ -746,6 +738,7 @@ void __connman_service_set_pac(struct connman_service *service, const char *pac); bool __connman_service_is_hidden(struct connman_service *service); bool __connman_service_is_split_routing(struct connman_service *service); +bool __connman_service_index_is_split_routing(int index); int __connman_service_get_index(struct connman_service *service); void __connman_service_set_hidden(struct connman_service *service); void __connman_service_set_hostname(struct connman_service *service, @@ -769,14 +762,12 @@ int __connman_service_reset_ipconfig(struct connman_service *service, enum connman_service_state *new_state); void __connman_service_notify(struct connman_service *service, - uint64_t rx_packets, uint64_t tx_packets, - uint64_t rx_bytes, uint64_t tx_bytes, - uint64_t rx_error, uint64_t tx_error, - uint64_t rx_dropped, uint64_t tx_dropped); + unsigned int rx_packets, unsigned int tx_packets, + unsigned int rx_bytes, unsigned int tx_bytes, + unsigned int rx_error, unsigned int tx_error, + unsigned int rx_dropped, unsigned int tx_dropped); int __connman_service_counter_register(const char *counter); -void __connman_service_counter_send_initial(const char *counter); -void __connman_service_counter_reset_all(const char *type); void __connman_service_counter_unregister(const char *counter); #include @@ -827,8 +818,7 @@ unsigned int __connman_rtnl_update_interval_remove(unsigned int interval); int __connman_rtnl_request_update(void); int __connman_rtnl_send(const void *buf, size_t len); -bool __connman_session_mode(); -void __connman_session_set_mode(bool enable); +bool __connman_session_policy_autoconnect(enum connman_service_connect_reason reason); int __connman_session_create(DBusMessage *msg); int __connman_session_destroy(DBusMessage *msg); @@ -837,14 +827,14 @@ int __connman_session_init(void); void __connman_session_cleanup(void); struct connman_stats_data { - uint64_t rx_packets; - uint64_t tx_packets; - uint64_t rx_bytes; - uint64_t tx_bytes; - uint64_t rx_errors; - uint64_t tx_errors; - uint64_t rx_dropped; - uint64_t tx_dropped; + unsigned int rx_packets; + unsigned int tx_packets; + unsigned int rx_bytes; + unsigned int tx_bytes; + unsigned int rx_errors; + unsigned int tx_errors; + unsigned int rx_dropped; + unsigned int tx_dropped; unsigned int time; }; diff --git a/src/connman.service.in b/src/connman.service.in new file mode 100644 index 000000000..48afb635f --- /dev/null +++ b/src/connman.service.in @@ -0,0 +1,14 @@ +[Unit] +Description=Connection service +After=syslog.target +Before=remote-fs.target + +[Service] +Type=dbus +BusName=net.connman +Restart=on-failure +ExecStart=@prefix@/sbin/connmand -n +StandardOutput=null + +[Install] +WantedBy=multi-user.target diff --git a/connman/src/connman.ver b/src/connman.ver similarity index 100% rename from connman/src/connman.ver rename to src/connman.ver diff --git a/connman/src/counter.c b/src/counter.c similarity index 98% rename from connman/src/counter.c rename to src/counter.c index 963d5519c..06e5daffd 100644 --- a/connman/src/counter.c +++ b/src/counter.c @@ -102,8 +102,6 @@ int __connman_counter_register(const char *owner, const char *path, counter->watch = g_dbus_add_disconnect_watch(connection, owner, owner_disconnect, counter, NULL); - __connman_service_counter_send_initial(counter->path); - return 0; } diff --git a/connman/src/dbus.c b/src/dbus.c similarity index 100% rename from connman/src/dbus.c rename to src/dbus.c diff --git a/connman/src/detect.c b/src/detect.c similarity index 100% rename from connman/src/detect.c rename to src/detect.c diff --git a/connman/src/device.c b/src/device.c similarity index 99% rename from connman/src/device.c rename to src/device.c index e112d27bb..508733cdd 100644 --- a/connman/src/device.c +++ b/src/device.c @@ -669,7 +669,7 @@ int connman_device_reconnect_service(struct connman_device *device) { DBG("device %p", device); - __connman_service_auto_connect(); + __connman_service_auto_connect(CONNMAN_SERVICE_CONNECT_REASON_AUTO); return 0; } @@ -758,7 +758,7 @@ int connman_device_set_scanning(struct connman_device *device, __connman_technology_scan_stopped(device); - __connman_service_auto_connect(); + __connman_service_auto_connect(CONNMAN_SERVICE_CONNECT_REASON_AUTO); return 0; } diff --git a/connman/src/dhcp.c b/src/dhcp.c similarity index 100% rename from connman/src/dhcp.c rename to src/dhcp.c diff --git a/connman/src/dhcpv6.c b/src/dhcpv6.c similarity index 100% rename from connman/src/dhcpv6.c rename to src/dhcpv6.c diff --git a/connman/src/dnsproxy.c b/src/dnsproxy.c similarity index 98% rename from connman/src/dnsproxy.c rename to src/dnsproxy.c index 00a72092f..69b978cf9 100644 --- a/connman/src/dnsproxy.c +++ b/src/dnsproxy.c @@ -1861,8 +1861,6 @@ static void server_destroy_socket(struct server_data *data) static void destroy_server(struct server_data *server) { - GList *list; - DBG("index %d server %s sock %d", server->index, server->server, server->channel ? g_io_channel_unix_get_fd(server->channel): -1); @@ -1874,12 +1872,7 @@ static void destroy_server(struct server_data *server) DBG("Removing DNS server %s", server->server); g_free(server->server); - for (list = server->domains; list; list = list->next) { - char *domain = list->data; - - server->domains = g_list_remove(server->domains, domain); - g_free(domain); - } + g_list_free_full(server->domains, g_free); g_free(server->server_addr); /* @@ -2289,9 +2282,12 @@ static struct server_data *create_server(int index, } if (protocol == IPPROTO_UDP) { - /* Enable new servers by default */ - data->enabled = true; - DBG("Adding DNS server %s", data->server); + if (__connman_service_index_is_default(data->index) || + __connman_service_index_is_split_routing( + data->index)) { + data->enabled = true; + DBG("Adding DNS server %s", data->server); + } server_list = g_slist_append(server_list, data); } @@ -3070,21 +3066,6 @@ static gboolean tcp6_listener_event(GIOChannel *channel, GIOCondition condition, &ifdata->tcp6_listener_watch); } -int tryit = 0; - -void setTryit(int i) -{ - DBG("setTryit %d", i); - tryit = i; -} - -static gboolean reset_connect_request(gpointer data) -{ - DBG("reset_connect_request"); - tryit = 0; - return FALSE; -} - static bool udp_listener_event(GIOChannel *channel, GIOCondition condition, struct listener_data *ifdata, int family, guint *listener_watch) @@ -3127,29 +3108,7 @@ static bool udp_listener_event(GIOChannel *channel, GIOCondition condition, if (err < 0 || (g_slist_length(server_list) == 0)) { send_response(sk, buf, len, client_addr, *client_addr_len, IPPROTO_UDP); -// error no connection. - gboolean ok = FALSE; - int len = strlen(query); - if (len > 4) { - const char *lastFive = &query[len - 5]; - if (strcmp("arpa.", lastFive) == 0) { - ok == FALSE; - } else { - ok = TRUE; - } - } - if (ok && tryit == 0) { - // - g_timeout_add_seconds(10, reset_connect_request, NULL); - - tryit = 1; - // tell agent about it - DBG("DNS Error OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO"); - if (__connman_agent_request_connection((void*)tryit) == -ESRCH) { - } - } return true; - } req = g_try_new0(struct request_data, 1); diff --git a/src/eduroam.config b/src/eduroam.config new file mode 100644 index 000000000..768b7b409 --- /dev/null +++ b/src/eduroam.config @@ -0,0 +1,5 @@ +[service_eduroam] +Type = wifi +Name = eduroam +EAP = peap +Phase2 = MSCHAPV2 diff --git a/connman/src/error.c b/src/error.c similarity index 100% rename from connman/src/error.c rename to src/error.c diff --git a/connman/src/firewall.c b/src/firewall.c similarity index 100% rename from connman/src/firewall.c rename to src/firewall.c diff --git a/connman/src/genbuiltin b/src/genbuiltin similarity index 100% rename from connman/src/genbuiltin rename to src/genbuiltin diff --git a/connman/src/inet.c b/src/inet.c similarity index 99% rename from connman/src/inet.c rename to src/inet.c index 8bdc918e1..1e513fdc3 100644 --- a/connman/src/inet.c +++ b/src/inet.c @@ -2385,9 +2385,10 @@ int __connman_inet_rtnl_talk(struct __connman_inet_rtnl_handle *rtnl, err = sendto(rtnl->fd, &rtnl->req.n, rtnl->req.n.nlmsg_len, 0, (struct sockaddr *) &nladdr, sizeof(nladdr)); - DBG("handle %p len %d err %d", rtnl, rtnl->req.n.nlmsg_len, err); + DBG("handle %p len %d", rtnl, rtnl->req.n.nlmsg_len); if (err < 0) { - connman_error("Can not talk to rtnetlink"); + connman_error("Can not talk to rtnetlink err %d %s", + -errno, strerror(errno)); return -errno; } diff --git a/connman/src/inotify.c b/src/inotify.c similarity index 100% rename from connman/src/inotify.c rename to src/inotify.c diff --git a/connman/src/ipaddress.c b/src/ipaddress.c similarity index 100% rename from connman/src/ipaddress.c rename to src/ipaddress.c diff --git a/connman/src/ipconfig.c b/src/ipconfig.c similarity index 99% rename from connman/src/ipconfig.c rename to src/ipconfig.c index d9ccdd11e..9452125f4 100644 --- a/connman/src/ipconfig.c +++ b/src/ipconfig.c @@ -66,14 +66,14 @@ struct connman_ipdevice { unsigned int flags; char *address; uint16_t mtu; - uint64_t rx_packets; - uint64_t tx_packets; - uint64_t rx_bytes; - uint64_t tx_bytes; - uint64_t rx_errors; - uint64_t tx_errors; - uint64_t rx_dropped; - uint64_t tx_dropped; + uint32_t rx_packets; + uint32_t tx_packets; + uint32_t rx_bytes; + uint32_t tx_bytes; + uint32_t rx_errors; + uint32_t tx_errors; + uint32_t rx_dropped; + uint32_t tx_dropped; GSList *address_list; char *ipv4_gateway; @@ -430,16 +430,16 @@ static void __connman_ipconfig_lower_down(struct connman_ipdevice *ipdevice) } static void update_stats(struct connman_ipdevice *ipdevice, - struct rtnl_link_stats64 *stats) + const char *ifname, struct rtnl_link_stats *stats) { struct connman_service *service; if (stats->rx_packets == 0 && stats->tx_packets == 0) return; - connman_info("%s {RX} %llu packets %llu bytes", ipdevice->ifname, + connman_info("%s {RX} %u packets %u bytes", ifname, stats->rx_packets, stats->rx_bytes); - connman_info("%s {TX} %llu packets %llu bytes", ipdevice->ifname, + connman_info("%s {TX} %u packets %u bytes", ifname, stats->tx_packets, stats->tx_bytes); if (!ipdevice->config_ipv4 && !ipdevice->config_ipv6) @@ -474,7 +474,7 @@ static void update_stats(struct connman_ipdevice *ipdevice, void __connman_ipconfig_newlink(int index, unsigned short type, unsigned int flags, const char *address, unsigned short mtu, - struct rtnl_link_stats64 *stats) + struct rtnl_link_stats *stats) { struct connman_ipdevice *ipdevice; GList *list; @@ -586,7 +586,7 @@ void __connman_ipconfig_newlink(int index, unsigned short type, g_free(ifname); } -void __connman_ipconfig_dellink(int index, struct rtnl_link_stats64 *stats) +void __connman_ipconfig_dellink(int index, struct rtnl_link_stats *stats) { struct connman_ipdevice *ipdevice; GList *list; diff --git a/connman/src/ippool.c b/src/ippool.c similarity index 100% rename from connman/src/ippool.c rename to src/ippool.c diff --git a/connman/src/iptables.c b/src/iptables.c similarity index 100% rename from connman/src/iptables.c rename to src/iptables.c diff --git a/connman/src/log.c b/src/log.c similarity index 99% rename from connman/src/log.c rename to src/log.c index 4ccae1bd6..cb8596f06 100644 --- a/connman/src/log.c +++ b/src/log.c @@ -50,8 +50,8 @@ void connman_info(const char *format, ...) va_list ap; va_start(ap, format); - vprintf(format, ap); - //vsyslog(LOG_INFO, format, ap); + + vsyslog(LOG_INFO, format, ap); va_end(ap); } diff --git a/connman/src/main.c b/src/main.c similarity index 90% rename from connman/src/main.c rename to src/main.c index 401098658..45f8491dd 100644 --- a/connman/src/main.c +++ b/src/main.c @@ -36,9 +36,6 @@ #include #include -#ifdef SYSTEMD -#include -#endif #include "connman.h" @@ -59,6 +56,7 @@ static char *default_blacklist[] = { "vmnet", "vboxnet", "virbr", + "ifb", NULL }; @@ -75,9 +73,6 @@ static struct { bool single_tech; char **tethering_technologies; bool persistent_tethering_mode; - connman_bool_t start_session; - char **ipv6_status_url; - char **ipv4_status_url; } connman_settings = { .bg_scan = true, .pref_timeservers = NULL, @@ -91,9 +86,6 @@ static struct { .single_tech = false, .tethering_technologies = NULL, .persistent_tethering_mode = false, - .start_session = FALSE, - .ipv4_status_url = NULL, - .ipv6_status_url = NULL, }; #define CONF_BG_SCAN "BackgroundScanning" @@ -108,10 +100,6 @@ static struct { #define CONF_SINGLE_TECH "SingleConnectedTechnology" #define CONF_TETHERING_TECHNOLOGIES "TetheringTechnologies" #define CONF_PERSISTENT_TETHERING_MODE "PersistentTetheringMode" -#define CONF_START_SESSION "StartSession" - -#define CONF_STATUS_URL_IPV6 "Ipv6StatusUrl" -#define CONF_STATUS_URL_IPV4 "Ipv4StatusUrl" static const char *supported_options[] = { CONF_BG_SCAN, @@ -126,9 +114,6 @@ static const char *supported_options[] = { CONF_SINGLE_TECH, CONF_TETHERING_TECHNOLOGIES, CONF_PERSISTENT_TETHERING_MODE, - CONF_START_SESSION, - CONF_STATUS_URL_IPV4, - CONF_STATUS_URL_IPV6, NULL }; @@ -251,8 +236,6 @@ static void parse_config(GKeyFile *config) char **interfaces; char **str_list; char **tethering; - char **ipv4url; - char **ipv6url; gsize len; int timeout; @@ -353,12 +336,7 @@ static void parse_config(GKeyFile *config) CONF_SINGLE_TECH, &error); if (!error) connman_settings.single_tech = boolean; - g_clear_error(&error); - boolean = g_key_file_get_boolean(config, "General", - CONF_START_SESSION, &error); - if (error == NULL) - connman_settings.start_session = boolean; g_clear_error(&error); tethering = __connman_config_get_string_list(config, "General", @@ -376,24 +354,6 @@ static void parse_config(GKeyFile *config) connman_settings.persistent_tethering_mode = boolean; g_clear_error(&error); - - ipv4url = g_key_file_get_string(config, "General", CONF_STATUS_URL_IPV4, &error); - if (error == NULL) - connman_settings.ipv4_status_url = ipv4url; - else - connman_settings.ipv4_status_url = "http://ipv4.connman.net/online/status.html"; - - g_clear_error(&error); - - ipv6url = g_key_file_get_string(config, "General", CONF_STATUS_URL_IPV6, &error); - if (error == NULL) - connman_settings.ipv6_status_url = ipv6url; - else - connman_settings.ipv6_status_url = "http://ipv6.connman.net/online/status.html"; - - - g_clear_error(&error); - } static int config_init(const char *file) @@ -498,9 +458,6 @@ static gchar *option_wifi = NULL; static gboolean option_detach = TRUE; static gboolean option_dnsproxy = TRUE; static gboolean option_backtrace = TRUE; -#ifdef SYSTEMD -static gboolean option_systemd = FALSE; -#endif static gboolean option_version = FALSE; static bool parse_debug(const char *key, const char *value, @@ -540,29 +497,19 @@ static GOptionEntry options[] = { { "nobacktrace", 0, G_OPTION_FLAG_REVERSE, G_OPTION_ARG_NONE, &option_backtrace, "Don't print out backtrace information" }, -#ifdef SYSTEMD - { "systemd", 0, G_OPTION_FLAG_OPTIONAL_ARG, - G_OPTION_ARG_NONE, &option_systemd, - "Notify systemd when started"}, -#endif { "version", 'v', 0, G_OPTION_ARG_NONE, &option_version, "Show version information and exit" }, { NULL }, }; const char *connman_option_get_string(const char *key) -{ +{ if (g_strcmp0(key, "wifi") == 0) { if (!option_wifi) return "nl80211,wext"; else return option_wifi; } - if (g_str_equal(key, CONF_STATUS_URL_IPV4) == TRUE) { - return connman_settings.ipv4_status_url; - } - if (g_str_equal(key, CONF_STATUS_URL_IPV6) == TRUE) - return connman_settings.ipv6_status_url; return NULL; } @@ -582,8 +529,6 @@ bool connman_setting_get_bool(const char *key) return connman_settings.persistent_tethering_mode; return false; - return connman_settings.start_session; - } char **connman_setting_get_string_list(const char *key) @@ -745,12 +690,6 @@ int main(int argc, char *argv[]) g_free(option_nodevice); g_free(option_noplugin); -#ifdef SYSTEMD - /* Tell systemd that we have started up */ - if( option_systemd ) - sd_notify(0, "READY=1"); -#endif - g_main_loop_run(main_loop); g_source_remove(signal); @@ -779,7 +718,6 @@ int main(int argc, char *argv[]) __connman_tethering_cleanup(); __connman_nat_cleanup(); __connman_firewall_cleanup(); - __connman_nfacct_cleanup(); __connman_iptables_cleanup(); __connman_ippool_cleanup(); __connman_device_cleanup(); diff --git a/connman/src/main.conf b/src/main.conf similarity index 95% rename from connman/src/main.conf rename to src/main.conf index b22338d33..93c7a5014 100644 --- a/connman/src/main.conf +++ b/src/main.conf @@ -57,8 +57,8 @@ # Found interfaces will be compared to the list and will # not be handled by connman, if their first characters # match any of the list entries. Default value is -# vmnet,vboxnet,virbr. -# NetworkInterfaceBlacklist = vmnet,vboxnet,virbr +# vmnet,vboxnet,virbr,ifb. +# NetworkInterfaceBlacklist = vmnet,vboxnet,virbr,ifb # Allow connman to change the system hostname. This can # happen for example if we receive DHCP hostname option. @@ -95,7 +95,3 @@ # re-enabling a technology, and after restarts and reboots. # Default value is false. # PersistentTetheringMode = false - -# set the online status url -Ipv4StatusUrl = http://ipv4.connman.net/online/status.html -Ipv6StatusUrl = http://ipv6.connman.net/online/status.html diff --git a/connman/src/manager.c b/src/manager.c similarity index 87% rename from connman/src/manager.c rename to src/manager.c index ae1472880..fd8a2fb48 100644 --- a/connman/src/manager.c +++ b/src/manager.c @@ -195,40 +195,6 @@ static DBusMessage *get_services(DBusConnection *conn, return reply; } -static void append_saved_service_structs(DBusMessageIter *iter, void *user_data) -{ - __connman_saved_service_list_struct(iter); -} - -static DBusMessage *get_saved_services(DBusConnection *conn, - DBusMessage *msg, void *data) -{ - DBusMessage *reply; - - reply = dbus_message_new_method_return(msg); - if (reply == NULL) - return NULL; - - __connman_dbus_append_objpath_dict_array(reply, - append_saved_service_structs, NULL); - - return reply; -} - -static DBusMessage *remove_saved_service(DBusConnection *conn, DBusMessage *msg, void *data) -{ - gchar *identifier; - int i; - struct connman_service *service; - - dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &identifier, DBUS_TYPE_INVALID); - - if (connman_service_remove(identifier) != TRUE) - return __connman_error_failed(msg, EINVAL); - - return dbus_message_new_method_return(msg); -} - static DBusMessage *connect_provider(DBusConnection *conn, DBusMessage *msg, void *data) { @@ -328,18 +294,6 @@ static DBusMessage *unregister_counter(DBusConnection *conn, return g_dbus_create_reply(msg, DBUS_TYPE_INVALID); } -static DBusMessage *reset_counters(DBusConnection *conn, DBusMessage *msg, void *data) -{ - DBG("conn %p", conn); - - const char *type; - dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &type, DBUS_TYPE_INVALID); - - __connman_service_counter_reset_all(type); - - return g_dbus_create_reply(msg, DBUS_TYPE_INVALID); -} - static DBusMessage *create_session(DBusConnection *conn, DBusMessage *msg, void *data) { @@ -423,12 +377,6 @@ static const GDBusMethodTable manager_methods[] = { { GDBUS_METHOD("GetServices", NULL, GDBUS_ARGS({ "services", "a(oa{sv})" }), get_services) }, - { GDBUS_METHOD("GetSavedServices", - NULL, GDBUS_ARGS({ "services", "a(oa{sv})" }), - get_saved_services) }, - { GDBUS_METHOD("RemoveSavedService", - GDBUS_ARGS({ "identifier", "s" }), NULL, - remove_saved_service) }, { GDBUS_DEPRECATED_ASYNC_METHOD("ConnectProvider", GDBUS_ARGS({ "provider", "a{sv}" }), GDBUS_ARGS({ "path", "o" }), @@ -446,9 +394,6 @@ static const GDBusMethodTable manager_methods[] = { { GDBUS_METHOD("UnregisterCounter", GDBUS_ARGS({ "path", "o" }), NULL, unregister_counter) }, - { GDBUS_METHOD("ResetCounters", - GDBUS_ARGS({ "type", "s" }), NULL, - reset_counters) }, { GDBUS_ASYNC_METHOD("CreateSession", GDBUS_ARGS({ "settings", "a{sv}" }, { "notifier", "o" }), @@ -479,8 +424,6 @@ static const GDBusSignalTable manager_signals[] = { { GDBUS_SIGNAL("ServicesChanged", GDBUS_ARGS({ "changed", "a(oa{sv})" }, { "removed", "ao" })) }, - { GDBUS_SIGNAL("SavedServicesChanged", - GDBUS_ARGS({ "changed", "a(oa{sv})" })) }, { }, }; diff --git a/connman/src/nat.c b/src/nat.c similarity index 100% rename from connman/src/nat.c rename to src/nat.c diff --git a/src/net.connman.service.in b/src/net.connman.service.in new file mode 100644 index 000000000..0bb1e8b92 --- /dev/null +++ b/src/net.connman.service.in @@ -0,0 +1,5 @@ +[D-BUS Service] +Name=net.connman +Exec=@prefix@/sbin/connman -n +User=root +SystemdService=connman.service diff --git a/connman/src/network.c b/src/network.c similarity index 99% rename from connman/src/network.c rename to src/network.c index 36366f456..1d5a13b59 100644 --- a/connman/src/network.c +++ b/src/network.c @@ -99,6 +99,8 @@ static const char *type2string(enum connman_network_type type) break; case CONNMAN_NETWORK_TYPE_ETHERNET: return "ethernet"; + case CONNMAN_NETWORK_TYPE_GADGET: + return "gadget"; case CONNMAN_NETWORK_TYPE_WIFI: return "wifi"; case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN: @@ -791,6 +793,7 @@ static int network_probe(struct connman_network *network) case CONNMAN_NETWORK_TYPE_VENDOR: return 0; case CONNMAN_NETWORK_TYPE_ETHERNET: + case CONNMAN_NETWORK_TYPE_GADGET: case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN: case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN: case CONNMAN_NETWORK_TYPE_CELLULAR: @@ -820,6 +823,7 @@ static void network_remove(struct connman_network *network) case CONNMAN_NETWORK_TYPE_VENDOR: break; case CONNMAN_NETWORK_TYPE_ETHERNET: + case CONNMAN_NETWORK_TYPE_GADGET: case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN: case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN: case CONNMAN_NETWORK_TYPE_CELLULAR: @@ -1124,6 +1128,7 @@ void connman_network_set_group(struct connman_network *network, case CONNMAN_NETWORK_TYPE_VENDOR: return; case CONNMAN_NETWORK_TYPE_ETHERNET: + case CONNMAN_NETWORK_TYPE_GADGET: case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN: case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN: case CONNMAN_NETWORK_TYPE_CELLULAR: @@ -1174,6 +1179,7 @@ bool __connman_network_get_weakness(struct connman_network *network) case CONNMAN_NETWORK_TYPE_UNKNOWN: case CONNMAN_NETWORK_TYPE_VENDOR: case CONNMAN_NETWORK_TYPE_ETHERNET: + case CONNMAN_NETWORK_TYPE_GADGET: case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN: case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN: case CONNMAN_NETWORK_TYPE_CELLULAR: @@ -1469,9 +1475,9 @@ int connman_network_connect_hidden(struct connman_network *network, goto out; } else { __connman_service_set_hidden(service); - __connman_service_set_userconnect(service, true); __connman_service_set_hidden_data(service, user_data); - return __connman_service_connect(service); + return __connman_service_connect(service, + CONNMAN_SERVICE_CONNECT_REASON_USER); } out: @@ -2076,6 +2082,7 @@ void connman_network_update(struct connman_network *network) case CONNMAN_NETWORK_TYPE_VENDOR: return; case CONNMAN_NETWORK_TYPE_ETHERNET: + case CONNMAN_NETWORK_TYPE_GADGET: case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN: case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN: case CONNMAN_NETWORK_TYPE_CELLULAR: diff --git a/src/nfacct.c b/src/nfacct.c deleted file mode 100644 index f67c2bab8..000000000 --- a/src/nfacct.c +++ /dev/null @@ -1,379 +0,0 @@ -/* - * - * Connection Manager - * - * Copyright (C) 2013 BMW Car IT GmbH. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include - -#include "connman.h" -#include "src/shared/nfacct.h" -#include "src/shared/util.h" - -static struct nfacct_info *nfacct = NULL; - -struct nfacct_rule { - char *name; - connman_nfacct_stats_cb_t cb; - void *user_data; -}; - -struct nfacct_context { - struct nfacct_info *nfacct; - GList *rules; - unsigned int pending; - unsigned int error; -}; - -struct nfacct_flush { - unsigned int pending; - unsigned int error; -}; - -static void cleanup_nfacct_rule(gpointer user_data) -{ - struct nfacct_rule *rule = user_data; - - g_free(rule->name); - g_free(rule); -} - -struct nfacct_context *__connman_nfacct_create_context(void) -{ - struct nfacct_context *ctx; - - ctx = g_new0(struct nfacct_context, 1); - - return ctx; -} - -void __connman_nfacct_destroy_context(struct nfacct_context *ctx) -{ - g_list_free_full(ctx->rules, cleanup_nfacct_rule); - g_free(ctx); -} - -int __connman_nfacct_add(struct nfacct_context *ctx, const char *name, - connman_nfacct_stats_cb_t cb, - void *user_data) -{ - struct nfacct_rule *rule = g_new0(struct nfacct_rule, 1); - - rule->name = g_strdup(name); - rule->cb = cb; - rule->user_data = user_data; - - ctx->rules = g_list_append(ctx->rules, rule); - - return 0; -} - -static void nfacct_enable_failed_cb(unsigned int error, void *user_data) -{ - struct cb_data *cbd = user_data; - connman_nfacct_enable_cb_t cb = cbd->cb; - struct nfacct_context *ctx = cbd->data; - - DBG(""); - - user_data = cbd->user_data; - g_free(cbd); - - ctx->pending--; - - if (ctx->pending > 0) - return; - - cb(ctx->error, ctx, user_data); -} - -static void nfacct_handle_enable_error(struct nfacct_context *ctx, - connman_nfacct_enable_cb_t cb, - void *user_data) -{ - struct cb_data *cbd; - struct nfacct_rule *rule; - GList *list; - unsigned int id; - - DBG(""); - - for (list = ctx->rules; list; list = list->next) { - rule = list->data; - - DBG("%s", rule->name); - cbd = cb_data_new(cb, user_data); - cbd->data = ctx; - id = nfacct_del(nfacct, rule->name, - nfacct_enable_failed_cb, cbd); - if (id == 0) { - g_free(cbd); - continue; - } - - ctx->pending++; - } -} - -static void nfacct_enable_cb(unsigned int error, void *user_data) -{ - struct cb_data *cbd = user_data; - connman_nfacct_enable_cb_t cb = cbd->cb; - struct nfacct_context *ctx = cbd->data; - - DBG("error %d pending %d", error, ctx->pending); - - user_data = cbd->user_data; - g_free(cbd); - - ctx->pending--; - - if (error != 0) - ctx->error = error; - - if (ctx->pending > 0) - return; - - if (ctx->error != 0) { - nfacct_handle_enable_error(ctx, cb, user_data); - return; - } - - cb(0, ctx, user_data); -} - -static void nfacct_disable_cb(unsigned int error, void *user_data) -{ - struct cb_data *cbd = user_data; - connman_nfacct_disable_cb_t cb = cbd->cb; - struct nfacct_context *ctx = cbd->data; - - DBG("error %d pending %d", error, ctx->pending); - - user_data = cbd->user_data; - g_free(cbd); - - ctx->pending--; - - if (error != 0) - ctx->error = -error; - - if (ctx->pending > 0) - return; - - cb(ctx->error, ctx, user_data); -} - -int __connman_nfacct_enable(struct nfacct_context *ctx, - connman_nfacct_enable_cb_t cb, - void *user_data) -{ - struct cb_data *cbd = NULL; - struct nfacct_rule *rule; - GList *list; - unsigned int id; - - DBG(""); - - if (!nfacct) - nfacct = nfacct_new(); - if (!nfacct) - goto err; - - for (list = ctx->rules; list; list = list->next) { - rule = list->data; - - DBG("%s", rule->name); - - cbd = cb_data_new(cb, user_data); - cbd->data = ctx; - id = nfacct_add(nfacct, rule->name, nfacct_enable_cb, - cbd); - if (id == 0) - goto err; - - ctx->pending++; - } - - return 0; - -err: - if (ctx->pending > 0) { - ctx->error = -ECOMM; - return 0; - } - - g_free(cbd); - - return -ECOMM; -} - -int __connman_nfacct_disable(struct nfacct_context *ctx, - connman_nfacct_disable_cb_t cb, - void *user_data) -{ - struct cb_data *cbd; - struct nfacct_rule *rule; - GList *list; - unsigned int id; - int err = 0; - - DBG(""); - - for (list = ctx->rules; list; list = list->next) { - rule = list->data; - - DBG("%s", rule->name); - cbd = cb_data_new(cb, user_data); - cbd->data = ctx; - id = nfacct_del(nfacct, rule->name, nfacct_disable_cb, - cbd); - if (id == 0) { - err = -ECOMM; - g_free(cbd); - continue; - } - - ctx->pending++; - } - - return err; -} - -static void nfacct_flush_del_cb(unsigned int error, void *user_data) -{ - struct cb_data *cbd = user_data; - struct nfacct_flush *nff = cbd->data; - connman_nfacct_flush_cb_t cb = cbd->cb; - - DBG("error %d pending %d", error, nff->pending); - - nff->pending--; - - if (error != 0) - nff->error = -error; - - /* - * Wait for all pending commands before calling - * the callback. - */ - if (nff->pending > 0) - return; - - cb(nff->error, cbd->user_data); - - g_free(nff); - g_free(cbd); -} - -static void nfacct_flush_cb(unsigned int error, const char *name, - uint64_t packets, uint64_t bytes, - void *user_data) -{ - struct cb_data *cbd = user_data; - struct nfacct_flush *nff = cbd->data; - connman_nfacct_flush_cb_t cb = cbd->cb; - unsigned int id; - - if (error != 0) { - /* - * We will only be called once with an error and - * will be the first call. - */ - - /* - * EINVAL tells us that there is no NFACCT sysbstem - * that means we are probably running on a pre 3.2 - * kernel. Just ignore this. - */ - if (error != EINVAL) - nff->error = -error; - goto out; - } - - if (!name) { - /* last call */ - - /* - * If we have one command pending, let that one - * report back the error. - */ - if (nff->pending > 0) - return; - - /* - * Either all __connman_netfilter_acct_del() failed - * or the dump was empty. In both cases just - * call the cb. - */ - goto out; - } - - DBG("name %s packets %" PRIu64 " bytes %" PRIu64, name, packets, bytes); - - if (!g_str_has_prefix(name, "session-")) - return; - - id = nfacct_del(nfacct, name, nfacct_flush_del_cb, cbd); - if (id == 0) { - nff->error = -ECOMM; - return; - } - - nff->pending++; - return; - -out: - cb(nff->error, cbd->user_data); - - g_free(nff); - g_free(cbd); -} - -int __connman_nfacct_flush(connman_nfacct_flush_cb_t cb, void *user_data) -{ - struct cb_data *cbd = cb_data_new(cb, user_data); - struct nfacct_flush *nff = g_new0(struct nfacct_flush, 1); - unsigned int id; - - DBG("nfacct %p", nfacct); - - if (nfacct) { - cbd->data = nff; - - id = nfacct_dump(nfacct, false, nfacct_flush_cb, cbd); - if (id > 0) - return id; - } - - g_free(nff); - g_free(cbd); - - return -ECOMM; -} - -void __connman_nfacct_cleanup(void) -{ - nfacct_destroy(nfacct); - nfacct = NULL; -} diff --git a/connman/src/notifier.c b/src/notifier.c similarity index 100% rename from connman/src/notifier.c rename to src/notifier.c index 6a601ce23..1055b8749 100644 --- a/connman/src/notifier.c +++ b/src/notifier.c @@ -146,9 +146,9 @@ void __connman_notifier_connect(enum connman_service_type type) case CONNMAN_SERVICE_TYPE_SYSTEM: case CONNMAN_SERVICE_TYPE_GPS: case CONNMAN_SERVICE_TYPE_VPN: - case CONNMAN_SERVICE_TYPE_GADGET: return; case CONNMAN_SERVICE_TYPE_ETHERNET: + case CONNMAN_SERVICE_TYPE_GADGET: case CONNMAN_SERVICE_TYPE_WIFI: case CONNMAN_SERVICE_TYPE_BLUETOOTH: case CONNMAN_SERVICE_TYPE_CELLULAR: @@ -192,9 +192,9 @@ void __connman_notifier_disconnect(enum connman_service_type type) case CONNMAN_SERVICE_TYPE_SYSTEM: case CONNMAN_SERVICE_TYPE_GPS: case CONNMAN_SERVICE_TYPE_VPN: - case CONNMAN_SERVICE_TYPE_GADGET: return; case CONNMAN_SERVICE_TYPE_ETHERNET: + case CONNMAN_SERVICE_TYPE_GADGET: case CONNMAN_SERVICE_TYPE_WIFI: case CONNMAN_SERVICE_TYPE_BLUETOOTH: case CONNMAN_SERVICE_TYPE_CELLULAR: diff --git a/connman/src/ntp.c b/src/ntp.c similarity index 90% rename from connman/src/ntp.c rename to src/ntp.c index 57205f868..6701f9f72 100644 --- a/connman/src/ntp.c +++ b/src/ntp.c @@ -117,11 +117,12 @@ static struct timespec mtx_time; static int transmit_fd = 0; static char *timeserver = NULL; +static struct sockaddr_in timeserver_addr; static gint poll_id = 0; static gint timeout_id = 0; static guint retries = 0; -static void send_packet(int fd, const char *server); +static void send_packet(int fd, const char *server, uint32_t timeout); static void next_server(void) { @@ -135,17 +136,19 @@ static void next_server(void) static gboolean send_timeout(gpointer user_data) { - DBG("send timeout (retries %d)", retries); + uint32_t timeout = GPOINTER_TO_UINT(user_data); + + DBG("send timeout %u (retries %d)", timeout, retries); if (retries++ == NTP_SEND_RETRIES) next_server(); else - send_packet(transmit_fd, timeserver); + send_packet(transmit_fd, timeserver, timeout << 1); return FALSE; } -static void send_packet(int fd, const char *server) +static void send_packet(int fd, const char *server, uint32_t timeout) { struct ntp_msg msg; struct sockaddr_in addr; @@ -194,12 +197,13 @@ static void send_packet(int fd, const char *server) } /* - * Add a retry timeout of two seconds to retry the existing + * Add an exponential retry timeout to retry the existing * request. After a set number of retries, we'll fallback to * trying another server. */ - timeout_id = g_timeout_add_seconds(NTP_SEND_TIMEOUT, send_timeout, NULL); + timeout_id = g_timeout_add_seconds(timeout, send_timeout, + GUINT_TO_POINTER(timeout)); } static gboolean next_poll(gpointer user_data) @@ -207,7 +211,7 @@ static gboolean next_poll(gpointer user_data) if (!timeserver || transmit_fd == 0) return FALSE; - send_packet(transmit_fd, timeserver); + send_packet(transmit_fd, timeserver, NTP_SEND_TIMEOUT); return FALSE; } @@ -250,6 +254,17 @@ static void decode_msg(void *base, size_t len, struct timeval *tv, msg->rootdisp.seconds, msg->rootdisp.fraction); DBG("reference : 0x%04x", msg->refid); + if (!msg->stratum) { + /* RFC 4330 ch 8 Kiss-of-Death packet */ + uint32_t code = ntohl(msg->refid); + + connman_info("Skipping server %s KoD code %c%c%c%c", + timeserver, code >> 24, code >> 16 & 0xff, + code >> 8 & 0xff, code & 0xff); + next_server(); + return; + } + transmit_delay = LOGTOD(msg->poll); if (NTP_FLAGS_LI_DECODE(msg->flags) == NTP_FLAG_LI_NOTINSYNC) { @@ -345,6 +360,7 @@ static gboolean received_data(GIOChannel *channel, GIOCondition condition, gpointer user_data) { unsigned char buf[128]; + struct sockaddr_in sender_addr; struct msghdr msg; struct iovec iov; struct cmsghdr *cmsg; @@ -370,11 +386,17 @@ static gboolean received_data(GIOChannel *channel, GIOCondition condition, msg.msg_iovlen = 1; msg.msg_control = aux; msg.msg_controllen = sizeof(aux); + msg.msg_name = &sender_addr; + msg.msg_namelen = sizeof(sender_addr); len = recvmsg(fd, &msg, MSG_DONTWAIT); if (len < 0) return TRUE; + if (timeserver_addr.sin_addr.s_addr != sender_addr.sin_addr.s_addr) + /* only accept messages from the timeserver */ + return TRUE; + tv = NULL; clock_gettime(CLOCK_MONOTONIC, &mrx_time); @@ -454,7 +476,7 @@ static void start_ntp(char *server) g_io_channel_unref(channel); send: - send_packet(transmit_fd, server); + send_packet(transmit_fd, server, NTP_SEND_TIMEOUT); } int __connman_ntp_start(char *server) @@ -468,6 +490,7 @@ int __connman_ntp_start(char *server) g_free(timeserver); timeserver = g_strdup(server); + timeserver_addr.sin_addr.s_addr = inet_addr(server); start_ntp(timeserver); diff --git a/connman/src/plugin.c b/src/plugin.c similarity index 100% rename from connman/src/plugin.c rename to src/plugin.c diff --git a/connman/src/provider.c b/src/provider.c similarity index 100% rename from connman/src/provider.c rename to src/provider.c diff --git a/connman/src/proxy.c b/src/proxy.c similarity index 100% rename from connman/src/proxy.c rename to src/proxy.c diff --git a/connman/src/resolver.c b/src/resolver.c similarity index 100% rename from connman/src/resolver.c rename to src/resolver.c diff --git a/connman/src/rfkill.c b/src/rfkill.c similarity index 100% rename from connman/src/rfkill.c rename to src/rfkill.c diff --git a/connman/src/rtnl.c b/src/rtnl.c similarity index 99% rename from connman/src/rtnl.c rename to src/rtnl.c index 8201c58da..c8708eb57 100644 --- a/connman/src/rtnl.c +++ b/src/rtnl.c @@ -46,10 +46,6 @@ #define ARPHDR_PHONET_PIPE (821) #endif -#ifndef ARPHRD_RAWIP -#define ARPHRD_RAWIP (530) -#endif - #define print(arg...) do { if (0) connman_info(arg); } while (0) //#define print(arg...) connman_info(arg) @@ -364,7 +360,7 @@ static const char *operstate2str(unsigned char operstate) static bool extract_link(struct ifinfomsg *msg, int bytes, struct ether_addr *address, const char **ifname, unsigned int *mtu, unsigned char *operstate, - struct rtnl_link_stats64 *stats) + struct rtnl_link_stats *stats) { struct rtattr *attr; @@ -383,10 +379,10 @@ static bool extract_link(struct ifinfomsg *msg, int bytes, if (mtu) *mtu = *((unsigned int *) RTA_DATA(attr)); break; - case IFLA_STATS64: + case IFLA_STATS: if (stats) memcpy(stats, RTA_DATA(attr), - sizeof(struct rtnl_link_stats64)); + sizeof(struct rtnl_link_stats)); break; case IFLA_OPERSTATE: if (operstate) @@ -407,7 +403,7 @@ static void process_newlink(unsigned short type, int index, unsigned flags, { struct ether_addr address = {{ 0, 0, 0, 0, 0, 0 }}; struct ether_addr compare = {{ 0, 0, 0, 0, 0, 0 }}; - struct rtnl_link_stats64 stats; + struct rtnl_link_stats stats; unsigned char operstate = 0xff; struct interface_data *interface; const char *ifname = NULL; @@ -440,7 +436,6 @@ static void process_newlink(unsigned short type, int index, unsigned flags, case ARPHRD_LOOPBACK: case ARPHDR_PHONET_PIPE: case ARPHRD_PPP: - case ARPHRD_RAWIP: case ARPHRD_NONE: __connman_ipconfig_newlink(index, type, flags, str, mtu, &stats); @@ -501,7 +496,7 @@ static void process_newlink(unsigned short type, int index, unsigned flags, static void process_dellink(unsigned short type, int index, unsigned flags, unsigned change, struct ifinfomsg *msg, int bytes) { - struct rtnl_link_stats64 stats; + struct rtnl_link_stats stats; unsigned char operstate = 0xff; const char *ifname = NULL; GSList *list; @@ -904,8 +899,8 @@ static void rtnl_link(struct nlmsghdr *hdr) case IFLA_QDISC: print_attr(attr, "qdisc"); break; - case IFLA_STATS64: - print_attr(attr, "stats64"); + case IFLA_STATS: + print_attr(attr, "stats"); break; case IFLA_COST: print_attr(attr, "cost"); diff --git a/connman/src/service.c b/src/service.c similarity index 92% rename from connman/src/service.c rename to src/service.c index 88e540f3b..82908fcf7 100644 --- a/connman/src/service.c +++ b/src/service.c @@ -73,13 +73,13 @@ struct connman_service { enum connman_service_state state_ipv4; enum connman_service_state state_ipv6; enum connman_service_error error; + enum connman_service_connect_reason connect_reason; uint8_t strength; bool favorite; bool immutable; bool hidden; bool ignore; bool autoconnect; - bool userconnect; GTimeVal modified; unsigned int order; char *name; @@ -132,7 +132,7 @@ static struct connman_ipconfig *create_ip4config(struct connman_service *service int index, enum connman_ipconfig_method method); static struct connman_ipconfig *create_ip6config(struct connman_service *service, int index); -static void service_destroy(struct connman_service *service); + struct find_data { const char *path; @@ -162,6 +162,23 @@ static struct connman_service *find_service(const char *path) return data.service; } +static const char *reason2string(enum connman_service_connect_reason reason) +{ + + switch (reason) { + case CONNMAN_SERVICE_CONNECT_REASON_NONE: + return "none"; + case CONNMAN_SERVICE_CONNECT_REASON_USER: + return "user"; + case CONNMAN_SERVICE_CONNECT_REASON_AUTO: + return "auto"; + case CONNMAN_SERVICE_CONNECT_REASON_SESSION: + return "session"; + } + + return "unknown"; +} + const char *__connman_service_type2string(enum connman_service_type type) { switch (type) { @@ -193,21 +210,21 @@ enum connman_service_type __connman_service_string2type(const char *str) if (!str) return CONNMAN_SERVICE_TYPE_UNKNOWN; - if (strncmp(str, "ethernet", 8) == 0) + if (strcmp(str, "ethernet") == 0) return CONNMAN_SERVICE_TYPE_ETHERNET; - if (strncmp(str, "gadget", 6) == 0) + if (strcmp(str, "gadget") == 0) return CONNMAN_SERVICE_TYPE_GADGET; - if (strncmp(str, "wifi", 4) == 0) + if (strcmp(str, "wifi") == 0) return CONNMAN_SERVICE_TYPE_WIFI; - if (strncmp(str, "cellular", 8) == 0) + if (strcmp(str, "cellular") == 0) return CONNMAN_SERVICE_TYPE_CELLULAR; - if (strncmp(str, "bluetooth", 9) == 0) + if (strcmp(str, "bluetooth") == 0) return CONNMAN_SERVICE_TYPE_BLUETOOTH; - if (strncmp(str, "vpn", 3) == 0) + if (strcmp(str, "vpn") == 0) return CONNMAN_SERVICE_TYPE_VPN; - if (strncmp(str, "gps", 3) == 0) + if (strcmp(str, "gps") == 0) return CONNMAN_SERVICE_TYPE_GPS; - if (strncmp(str, "system", 6) == 0) + if (strcmp(str, "system") == 0) return CONNMAN_SERVICE_TYPE_SYSTEM; return CONNMAN_SERVICE_TYPE_UNKNOWN; @@ -344,7 +361,6 @@ static int service_load(struct connman_service *service) case CONNMAN_SERVICE_TYPE_UNKNOWN: case CONNMAN_SERVICE_TYPE_SYSTEM: case CONNMAN_SERVICE_TYPE_GPS: - case CONNMAN_SERVICE_TYPE_GADGET: break; case CONNMAN_SERVICE_TYPE_VPN: service->do_split_routing = g_key_file_get_boolean(keyfile, @@ -405,6 +421,7 @@ static int service_load(struct connman_service *service) } /* fall through */ + case CONNMAN_SERVICE_TYPE_GADGET: case CONNMAN_SERVICE_TYPE_BLUETOOTH: case CONNMAN_SERVICE_TYPE_CELLULAR: service->favorite = g_key_file_get_boolean(keyfile, @@ -510,8 +527,6 @@ static int service_load(struct connman_service *service) return err; } -static void service_saved_schedule_changed(void); - static int service_save(struct connman_service *service) { GKeyFile *keyfile; @@ -537,7 +552,6 @@ static int service_save(struct connman_service *service) case CONNMAN_SERVICE_TYPE_UNKNOWN: case CONNMAN_SERVICE_TYPE_SYSTEM: case CONNMAN_SERVICE_TYPE_GPS: - case CONNMAN_SERVICE_TYPE_GADGET: break; case CONNMAN_SERVICE_TYPE_VPN: g_key_file_set_boolean(keyfile, service->identifier, @@ -581,6 +595,7 @@ static int service_save(struct connman_service *service) } /* fall through */ + case CONNMAN_SERVICE_TYPE_GADGET: case CONNMAN_SERVICE_TYPE_BLUETOOTH: case CONNMAN_SERVICE_TYPE_CELLULAR: g_key_file_set_boolean(keyfile, service->identifier, @@ -708,9 +723,6 @@ static int service_save(struct connman_service *service) g_key_file_free(keyfile); - if (err == 0) { - service_saved_schedule_changed(); - } return err; } @@ -1370,6 +1382,18 @@ struct connman_service *__connman_service_get_default(void) return service; } +bool __connman_service_index_is_default(int index) +{ + struct connman_service *service; + + if (index < 0) + return false; + + service = __connman_service_get_default(); + + return __connman_service_get_index(service) == index; +} + static void default_changed(void) { struct connman_service *service = __connman_service_get_default(); @@ -1966,49 +1990,49 @@ static void stats_append_counters(DBusMessageIter *dict, if (counters->rx_packets != stats->rx_packets || append_all) { counters->rx_packets = stats->rx_packets; connman_dbus_dict_append_basic(dict, "RX.Packets", - DBUS_TYPE_UINT64, &stats->rx_packets); + DBUS_TYPE_UINT32, &stats->rx_packets); } if (counters->tx_packets != stats->tx_packets || append_all) { counters->tx_packets = stats->tx_packets; connman_dbus_dict_append_basic(dict, "TX.Packets", - DBUS_TYPE_UINT64, &stats->tx_packets); + DBUS_TYPE_UINT32, &stats->tx_packets); } if (counters->rx_bytes != stats->rx_bytes || append_all) { counters->rx_bytes = stats->rx_bytes; connman_dbus_dict_append_basic(dict, "RX.Bytes", - DBUS_TYPE_UINT64, &stats->rx_bytes); + DBUS_TYPE_UINT32, &stats->rx_bytes); } if (counters->tx_bytes != stats->tx_bytes || append_all) { counters->tx_bytes = stats->tx_bytes; connman_dbus_dict_append_basic(dict, "TX.Bytes", - DBUS_TYPE_UINT64, &stats->tx_bytes); + DBUS_TYPE_UINT32, &stats->tx_bytes); } if (counters->rx_errors != stats->rx_errors || append_all) { counters->rx_errors = stats->rx_errors; connman_dbus_dict_append_basic(dict, "RX.Errors", - DBUS_TYPE_UINT64, &stats->rx_errors); + DBUS_TYPE_UINT32, &stats->rx_errors); } if (counters->tx_errors != stats->tx_errors || append_all) { counters->tx_errors = stats->tx_errors; connman_dbus_dict_append_basic(dict, "TX.Errors", - DBUS_TYPE_UINT64, &stats->tx_errors); + DBUS_TYPE_UINT32, &stats->tx_errors); } if (counters->rx_dropped != stats->rx_dropped || append_all) { counters->rx_dropped = stats->rx_dropped; connman_dbus_dict_append_basic(dict, "RX.Dropped", - DBUS_TYPE_UINT64, &stats->rx_dropped); + DBUS_TYPE_UINT32, &stats->rx_dropped); } if (counters->tx_dropped != stats->tx_dropped || append_all) { counters->tx_dropped = stats->tx_dropped; connman_dbus_dict_append_basic(dict, "TX.Dropped", - DBUS_TYPE_UINT64, &stats->tx_dropped); + DBUS_TYPE_UINT32, &stats->tx_dropped); } if (counters->time != stats->time || append_all) { @@ -2057,10 +2081,10 @@ static void stats_append(struct connman_service *service, } static void stats_update(struct connman_service *service, - uint64_t rx_packets, uint64_t tx_packets, - uint64_t rx_bytes, uint64_t tx_bytes, - uint64_t rx_errors, uint64_t tx_errors, - uint64_t rx_dropped, uint64_t tx_dropped) + unsigned int rx_packets, unsigned int tx_packets, + unsigned int rx_bytes, unsigned int tx_bytes, + unsigned int rx_errors, unsigned int tx_errors, + unsigned int rx_dropped, unsigned int tx_dropped) { struct connman_stats *stats = stats_get(service); struct connman_stats_data *data_last = &stats->data_last; @@ -2104,10 +2128,10 @@ static void stats_update(struct connman_service *service, } void __connman_service_notify(struct connman_service *service, - uint64_t rx_packets, uint64_t tx_packets, - uint64_t rx_bytes, uint64_t tx_bytes, - uint64_t rx_errors, uint64_t tx_errors, - uint64_t rx_dropped, uint64_t tx_dropped) + unsigned int rx_packets, unsigned int tx_packets, + unsigned int rx_bytes, unsigned int tx_bytes, + unsigned int rx_errors, unsigned int tx_errors, + unsigned int rx_dropped, unsigned int tx_dropped) { GHashTableIter iter; gpointer key, value; @@ -2170,202 +2194,6 @@ int __connman_service_counter_register(const char *counter) return 0; } -static void __connman_service_counter_append_saved(const char *counter, const char *identifier) -{ - // Ignore saved cellular services. Only report usage for the currently active SIM - if (strncmp(identifier, "cellular_", 9) == 0) - return; - - struct connman_service *service = connman_service_create(); - if (service == NULL) - return; - - service->identifier = g_strdup(identifier); - service->path = g_strdup_printf("%s/service/%s", CONNMAN_PATH, service->identifier); - - DBusMessage *msg = dbus_message_new(DBUS_MESSAGE_TYPE_METHOD_CALL); - if (msg == NULL) { - service_destroy(service); - return; - } - - __connman_stats_service_register(service); - - dbus_message_append_args(msg, DBUS_TYPE_OBJECT_PATH, &service->path, DBUS_TYPE_INVALID); - - DBusMessageIter array; - DBusMessageIter dict; - - dbus_message_iter_init_append(msg, &array); - - struct connman_stats_data data; - - // home counter - connman_dbus_dict_open(&array, &dict); - - bzero(&data, sizeof(data)); - if (__connman_stats_get(service, FALSE, &data) == 0) - stats_append_counters(&dict, &data, &data, TRUE); - - connman_dbus_dict_close(&array, &dict); - - // roaming counter - connman_dbus_dict_open(&array, &dict); - - bzero(&data, sizeof(data)); - if (__connman_stats_get(service, TRUE, &data) == 0) - stats_append_counters(&dict, &data, &data, TRUE); - - connman_dbus_dict_close(&array, &dict); - - __connman_counter_send_usage(counter, msg); - - __connman_stats_service_unregister(service); - - service_destroy(service); -} - -static void __connman_service_counter_append(const char *counter, struct connman_service *service) -{ - DBusMessage *msg = dbus_message_new(DBUS_MESSAGE_TYPE_METHOD_CALL); - if (msg == NULL) - return; - - dbus_message_append_args(msg, DBUS_TYPE_OBJECT_PATH, &service->path, DBUS_TYPE_INVALID); - - DBusMessageIter array; - DBusMessageIter dict; - - dbus_message_iter_init_append(msg, &array); - - struct connman_stats_data data; - - bzero(&data, sizeof(data)); - if (__connman_stats_get(service, FALSE, &data) == 0) { - // Stats already loaded - - // home counter - connman_dbus_dict_open(&array, &dict); - stats_append_counters(&dict, &data, &data, TRUE); - connman_dbus_dict_close(&array, &dict); - - // roaming counter - connman_dbus_dict_open(&array, &dict); - - bzero(&data, sizeof(data)); - if (__connman_stats_get(service, TRUE, &data) == 0) - stats_append_counters(&dict, &data, &data, TRUE); - - connman_dbus_dict_close(&array, &dict); - } else { - __connman_stats_service_register(service); - - // home counter - connman_dbus_dict_open(&array, &dict); - - if (__connman_stats_get(service, FALSE, &data) == 0) - stats_append_counters(&dict, &data, &data, TRUE); - - connman_dbus_dict_close(&array, &dict); - - // roaming counter - connman_dbus_dict_open(&array, &dict); - - bzero(&data, sizeof(data)); - if (__connman_stats_get(service, TRUE, &data) == 0) - stats_append_counters(&dict, &data, &data, TRUE); - - connman_dbus_dict_close(&array, &dict); - - __connman_stats_service_unregister(service); - } - - __connman_counter_send_usage(counter, msg); -} - -void __connman_service_counter_send_initial(const char *counter) -{ - gchar **services; - int i; - - services = connman_storage_get_services(); - if (services == NULL) - return; - - for (i = 0; services[i] != NULL; i++) { - GSequenceIter *hash_iter = g_hash_table_lookup(service_hash, services[i]); - if (hash_iter == NULL) { - __connman_service_counter_append_saved(counter, services[i]); - continue; - } - - struct connman_service *service = g_sequence_get(hash_iter); - if (service == NULL) { - __connman_service_counter_append_saved(counter, services[i]); - continue; - } - - connman_service_ref(service); - __connman_service_counter_append(counter, service); - connman_service_unref(service); - } -} - -static void __connman_service_counter_reset_saved(const char *identifier) -{ - struct connman_service *service = connman_service_create(); - if (service == NULL) - return; - - service->identifier = g_strdup(identifier); - service->path = g_strdup_printf("%s/service/%s", CONNMAN_PATH, service->identifier); - - __connman_stats_service_register(service); - - struct connman_stats_data data; - bzero(&data, sizeof(data)); - - __connman_stats_update(service, FALSE, &data); - __connman_stats_update(service, TRUE, &data); - - __connman_stats_service_unregister(service); - - service_destroy(service); -} - -void __connman_service_counter_reset_all(const char *type) -{ - gchar **services; - int i; - - services = connman_storage_get_services(); - if (services == NULL) - return; - - int typeLength = strlen(type); - - for (i = 0; services[i] != NULL; i++) { - if (strncmp(services[i], type, typeLength) != 0) - continue; - - GSequenceIter *hash_iter = g_hash_table_lookup(service_hash, services[i]); - if (hash_iter == NULL) { - __connman_service_counter_reset_saved(services[i]); - continue; - } - - struct connman_service *service = g_sequence_get(hash_iter); - if (service == NULL) { - __connman_service_counter_reset_saved(services[i]); - continue; - } - - connman_service_ref(service); - reset_stats(service); - connman_service_unref(service); - } -} - void __connman_service_counter_unregister(const char *counter) { struct connman_service *service; @@ -2449,7 +2277,6 @@ static void append_properties(DBusMessageIter *dict, dbus_bool_t limited, case CONNMAN_SERVICE_TYPE_SYSTEM: case CONNMAN_SERVICE_TYPE_GPS: case CONNMAN_SERVICE_TYPE_VPN: - case CONNMAN_SERVICE_TYPE_GADGET: break; case CONNMAN_SERVICE_TYPE_CELLULAR: val = service->roaming; @@ -2462,6 +2289,7 @@ static void append_properties(DBusMessageIter *dict, dbus_bool_t limited, case CONNMAN_SERVICE_TYPE_WIFI: case CONNMAN_SERVICE_TYPE_ETHERNET: case CONNMAN_SERVICE_TYPE_BLUETOOTH: + case CONNMAN_SERVICE_TYPE_GADGET: connman_dbus_dict_append_dict(dict, "Ethernet", append_ethernet, service); break; @@ -2554,124 +2382,29 @@ void __connman_service_list_struct(DBusMessageIter *iter) g_list_foreach(service_list, append_struct, iter); } -void __connman_saved_service_list_struct_fn(DBusMessageIter *iter, connman_dbus_append_cb_t function) +bool __connman_service_is_hidden(struct connman_service *service) { - gchar **services; - int i; - struct connman_service *service; - GSequenceIter *hash_iter; - - services = connman_storage_get_services(); - if (services == NULL) - return; - - for (i = 0; services[i] != NULL; i++) { - hash_iter = g_hash_table_lookup(service_hash, services[i]); - if (hash_iter != NULL) { - service = g_sequence_get(hash_iter); - if (service == NULL) - continue; - - connman_service_ref(service); - } else { - service = connman_service_create(); - if (service == NULL) - continue; - - service->identifier = g_strdup(services[i]); - service->path = g_strdup_printf("%s/service/%s", CONNMAN_PATH, service->identifier); - - service->type = __connman_service_string2type(service->identifier); - - service_load(service); - } - - if (service->path == NULL) - continue; - - append_struct_service(iter, function, service); - - if (hash_iter != NULL) { - connman_service_unref(service); - } else { - service_destroy(service); - } - } - - g_strfreev(services); + return service->hidden; } -void __connman_saved_service_list_struct(DBusMessageIter *iter) +bool +__connman_service_is_split_routing(struct connman_service *service) { - __connman_saved_service_list_struct_fn(iter, &append_dict_properties); + return service->do_split_routing; } -int connman_service_remove(const char *identifier) +bool __connman_service_index_is_split_routing(int index) { - gchar **services = connman_storage_get_services(); - if (services == NULL) - return FALSE; - - int i; - for (i = 0; services[i] != NULL; ++i) { - if (g_strcmp0(services[i], identifier) != 0) - continue; - - GSequenceIter *iter = g_hash_table_lookup(service_hash, identifier); - if (iter != NULL) { - struct connman_service *service = g_sequence_get(iter); - if (service != NULL) { - __connman_service_remove(service); - return TRUE; - } - } - - struct connman_service *service = connman_service_create(); - if (service == NULL) - return FALSE; - - service->identifier = g_strdup(services[i]); - service->path = g_strdup_printf("%s/service/%s", CONNMAN_PATH, service->identifier); - service->type = __connman_service_string2type(service->identifier); - - int result = service_load(service); - - g_free(service->passphrase); - service->passphrase = NULL; - - g_free(service->agent_passphrase); - service->agent_passphrase = NULL; - - g_free(service->identity); - service->identity = NULL; - - g_free(service->agent_identity); - service->agent_identity = NULL; - - g_free(service->eap); - service->eap = NULL; - - service->favorite = FALSE; - - result = service_save(service); - - connman_service_unref(service); - - return TRUE; - } + struct connman_service *service; - return FALSE; -} + if (index < 0) + return false; -bool __connman_service_is_hidden(struct connman_service *service) -{ - return service->hidden; -} + service = __connman_service_lookup_from_index(index); + if (!service) + return false; -bool -__connman_service_is_split_routing(struct connman_service *service) -{ - return service->do_split_routing; + return __connman_service_is_split_routing(service); } int __connman_service_get_index(struct connman_service *service) @@ -3372,7 +3105,7 @@ int __connman_service_reset_ipconfig(struct connman_service *service, *new_state = service->state_ipv4; else *new_state = service->state_ipv6; - __connman_service_auto_connect(); + __connman_service_auto_connect(CONNMAN_SERVICE_CONNECT_REASON_AUTO); } DBG("err %d ipconfig %p type %d method %d state %s", err, @@ -3427,7 +3160,7 @@ static DBusMessage *set_property(DBusConnection *conn, autoconnect_changed(service); if (autoconnect) - __connman_service_auto_connect(); + __connman_service_auto_connect(CONNMAN_SERVICE_CONNECT_REASON_AUTO); service_save(service); } else if (g_str_equal(name, "Nameservers.Configuration")) { @@ -3749,6 +3482,24 @@ static bool is_ignore(struct connman_service *service) return false; } +static void disconnect_on_last_session(enum connman_service_type type) +{ + GList *list; + + for (list = service_list; list; list = list->next) { + struct connman_service *service = list->data; + + if (service->type != type) + continue; + + if (service->connect_reason != CONNMAN_SERVICE_CONNECT_REASON_SESSION) + continue; + + __connman_service_disconnect(service); + return; + } +} + static int active_sessions[MAX_CONNMAN_SERVICE_TYPES] = {}; static int active_count = 0; @@ -3770,6 +3521,7 @@ void __connman_service_set_active_session(bool enable, GSList *list) case CONNMAN_SERVICE_TYPE_WIFI: case CONNMAN_SERVICE_TYPE_BLUETOOTH: case CONNMAN_SERVICE_TYPE_CELLULAR: + case CONNMAN_SERVICE_TYPE_GADGET: if (enable) active_sessions[type]++; else @@ -3780,18 +3532,21 @@ void __connman_service_set_active_session(bool enable, GSList *list) case CONNMAN_SERVICE_TYPE_SYSTEM: case CONNMAN_SERVICE_TYPE_GPS: case CONNMAN_SERVICE_TYPE_VPN: - case CONNMAN_SERVICE_TYPE_GADGET: break; } + if (active_sessions[type] == 0) + disconnect_on_last_session(type); + list = g_slist_next(list); } - DBG("eth %d wifi %d bt %d cellular %d sessions %d", + DBG("eth %d wifi %d bt %d cellular %d gadget %d sessions %d", active_sessions[CONNMAN_SERVICE_TYPE_ETHERNET], active_sessions[CONNMAN_SERVICE_TYPE_WIFI], active_sessions[CONNMAN_SERVICE_TYPE_BLUETOOTH], active_sessions[CONNMAN_SERVICE_TYPE_CELLULAR], + active_sessions[CONNMAN_SERVICE_TYPE_GADGET], active_count); } @@ -3832,7 +3587,8 @@ static GList *preferred_tech_list_get(void) if (!is_connected(service)) break; - if (service->userconnect) { + if (service->connect_reason == + CONNMAN_SERVICE_CONNECT_REASON_USER) { DBG("service %p name %s is user connected", service, service->name); return NULL; @@ -3849,14 +3605,17 @@ static GList *preferred_tech_list_get(void) return tech_data.preferred_list; } -static bool auto_connect_service(GList *services, bool preferred) +static bool auto_connect_service(GList *services, + enum connman_service_connect_reason reason, + bool preferred) { struct connman_service *service = NULL; bool ignore[MAX_CONNMAN_SERVICE_TYPES] = { }; bool autoconnecting = false; GList *list; - DBG("preferred %d sessions %d", preferred, active_count); + DBG("preferred %d sessions %d reason %s", preferred, active_count, + reason2string(reason)); ignore[CONNMAN_SERVICE_TYPE_VPN] = true; @@ -3902,10 +3661,9 @@ static bool auto_connect_service(GList *services, bool preferred) } DBG("service %p %s %s", service, service->name, - (preferred) ? "preferred" : "auto"); + (preferred) ? "preferred" : reason2string(reason)); - service->userconnect = false; - __connman_service_connect(service); + __connman_service_connect(service, reason); if (!active_count) return true; @@ -3918,6 +3676,7 @@ static bool auto_connect_service(GList *services, bool preferred) static gboolean run_auto_connect(gpointer data) { + enum connman_service_connect_reason reason = GPOINTER_TO_UINT(data); bool autoconnecting = false; GList *preferred_tech; @@ -3927,24 +3686,29 @@ static gboolean run_auto_connect(gpointer data) preferred_tech = preferred_tech_list_get(); if (preferred_tech) { - autoconnecting = auto_connect_service(preferred_tech, true); + autoconnecting = auto_connect_service(preferred_tech, reason, + true); g_list_free(preferred_tech); } if (!autoconnecting || active_count) - auto_connect_service(service_list, false); + auto_connect_service(service_list, reason, false); return FALSE; } -void __connman_service_auto_connect(void) +void __connman_service_auto_connect(enum connman_service_connect_reason reason) { DBG(""); if (autoconnect_timeout != 0) return; - autoconnect_timeout = g_timeout_add_seconds(0, run_auto_connect, NULL); + if (!__connman_session_policy_autoconnect(reason)) + return; + + autoconnect_timeout = g_timeout_add_seconds(0, run_auto_connect, + GUINT_TO_POINTER(reason)); } static gboolean run_vpn_auto_connect(gpointer data) { @@ -3978,7 +3742,8 @@ static gboolean run_vpn_auto_connect(gpointer data) { service->do_split_routing ? "split routing" : ""); - res = __connman_service_connect(service); + res = __connman_service_connect(service, + CONNMAN_SERVICE_CONNECT_REASON_AUTO); if (res < 0 && res != -EINPROGRESS) continue; @@ -4153,8 +3918,10 @@ static gboolean connect_timeout(gpointer user_data) CONNMAN_SERVICE_STATE_FAILURE, CONNMAN_IPCONFIG_TYPE_IPV6); - if (autoconnect && !service->userconnect) - __connman_service_auto_connect(); + if (autoconnect && + service->connect_reason != + CONNMAN_SERVICE_CONNECT_REASON_USER) + __connman_service_auto_connect(CONNMAN_SERVICE_CONNECT_REASON_AUTO); return FALSE; } @@ -4218,11 +3985,10 @@ static DBusMessage *connect_service(DBusConnection *conn, service->ignore = false; - service->userconnect = true; - service->pending = dbus_message_ref(msg); - err = __connman_service_connect(service); + err = __connman_service_connect(service, + CONNMAN_SERVICE_CONNECT_REASON_USER); if (err < 0) { if (!service->pending) return NULL; @@ -4261,7 +4027,8 @@ static DBusMessage *disconnect_service(DBusConnection *conn, bool __connman_service_remove(struct connman_service *service) { - if (service->type == CONNMAN_SERVICE_TYPE_ETHERNET) + if (service->type == CONNMAN_SERVICE_TYPE_ETHERNET || + service->type == CONNMAN_SERVICE_TYPE_GADGET) return false; if (service->immutable || service->hidden || @@ -4517,8 +4284,6 @@ static struct _services_notify { GHashTable *remove; } *services_notify; -static int _saved_services_notify_id = 0; - static void service_append_added_foreach(gpointer data, gpointer user_data) { struct connman_service *service = data; @@ -4546,11 +4311,6 @@ static void service_append_ordered(DBusMessageIter *iter, void *user_data) g_list_foreach(service_list, service_append_added_foreach, iter); } -static void saved_service_append_ordered(DBusMessageIter *iter, void *user_data) -{ - __connman_saved_service_list_struct_fn(iter, &append_dict_properties); -} - static void append_removed(gpointer key, gpointer value, gpointer user_data) { char *objpath = key; @@ -4594,26 +4354,6 @@ static gboolean service_send_changed(gpointer data) return FALSE; } -static gboolean saved_service_send_changed(gpointer data) -{ - DBusMessage *signal; - - _saved_services_notify_id = 0; - - signal = dbus_message_new_signal(CONNMAN_MANAGER_PATH, - CONNMAN_MANAGER_INTERFACE, "SavedServicesChanged"); - if (signal == NULL) - return FALSE; - - __connman_dbus_append_objpath_dict_array(signal, - saved_service_append_ordered, NULL); - - dbus_connection_send(connection, signal, NULL); - dbus_message_unref(signal); - - return FALSE; -} - static void service_schedule_changed(void) { if (services_notify->id != 0) @@ -4648,14 +4388,6 @@ static void service_schedule_removed(struct connman_service *service) service_schedule_changed(); } -static void service_saved_schedule_changed(void) -{ - if (_saved_services_notify_id != 0) - return; - - _saved_services_notify_id = g_timeout_add(100, saved_service_send_changed, NULL); -} - static bool allow_property_changed(struct connman_service *service) { if (g_hash_table_lookup_extended(services_notify->add, service->path, @@ -4698,10 +4430,30 @@ static const GDBusSignalTable service_signals[] = { { }, }; -static void service_destroy(struct connman_service *service) +static void service_free(gpointer user_data) { - if (service->path != NULL) - g_free(service->path); + struct connman_service *service = user_data; + char *path = service->path; + + DBG("service %p", service); + + reply_pending(service, ENOENT); + + __connman_notifier_service_remove(service); + service_schedule_removed(service); + + __connman_wispr_stop(service); + stats_stop(service); + + service->path = NULL; + + if (path) { + __connman_connection_update_gateway(); + + g_dbus_unregister_interface(connection, path, + CONNMAN_SERVICE_INTERFACE); + g_free(path); + } g_hash_table_destroy(service->counter_table); @@ -4765,36 +4517,6 @@ static void service_destroy(struct connman_service *service) g_free(service); } -static void service_free(gpointer user_data) -{ - struct connman_service *service = user_data; - char *path = service->path; - - DBG("service %p", service); - - reply_pending(service, ENOENT); - - g_hash_table_remove(service_hash, service->identifier); - - __connman_notifier_service_remove(service); - service_schedule_removed(service); - - __connman_wispr_stop(service); - stats_stop(service); - - service->path = NULL; - - if (path != NULL) { - __connman_connection_update_gateway(); - - g_dbus_unregister_interface(connection, path, - CONNMAN_SERVICE_INTERFACE); - g_free(path); - } - - service_destroy(service); -} - static void stats_init(struct connman_service *service) { /* home */ @@ -4829,7 +4551,7 @@ static void service_initialize(struct connman_service *service) service->ignore = false; - service->userconnect = false; + service->connect_reason = CONNMAN_SERVICE_CONNECT_REASON_NONE; service->order = 0; @@ -5000,6 +4722,11 @@ static gint service_compare(gconstpointer a, gconstpointer b) return -1; if (service_b->type == CONNMAN_SERVICE_TYPE_VPN) return 1; + + if (service_a->type == CONNMAN_SERVICE_TYPE_GADGET) + return -1; + if (service_b->type == CONNMAN_SERVICE_TYPE_GADGET) + return 1; } strength = (gint) service_b->strength - (gint) service_a->strength; @@ -5266,13 +4993,6 @@ void __connman_service_set_string(struct connman_service *service, } } -void __connman_service_set_userconnect(struct connman_service *service, - bool userconnect) -{ - if (service) - service->userconnect = userconnect; -} - void __connman_service_set_search_domains(struct connman_service *service, char **domains) { @@ -5308,8 +5028,8 @@ static void service_complete(struct connman_service *service) { reply_pending(service, EIO); - if (!service->userconnect) - __connman_service_auto_connect(); + if (service->connect_reason != CONNMAN_SERVICE_CONNECT_REASON_USER) + __connman_service_auto_connect(service->connect_reason); g_get_current_time(&service->modified); service_save(service); @@ -5321,7 +5041,8 @@ static void report_error_cb(void *user_context, bool retry, struct connman_service *service = user_context; if (retry) - __connman_service_connect(service); + __connman_service_connect(service, + CONNMAN_SERVICE_CONNECT_REASON_USER); else { /* It is not relevant to stay on Failure state * when failing is due to wrong user input */ @@ -5457,12 +5178,12 @@ static void request_input_cb(struct connman_service *service, /* We forget any previous error. */ set_error(service, CONNMAN_SERVICE_ERROR_UNKNOWN); - __connman_service_connect(service); + __connman_service_connect(service, + CONNMAN_SERVICE_CONNECT_REASON_USER); } else if (err == -ENOKEY) { __connman_service_indicate_error(service, CONNMAN_SERVICE_ERROR_INVALID_KEY); - __connman_service_return_error(service, -err, user_data); } else { /* It is not relevant to stay on Failure state * when failing is due to wrong user input */ @@ -5714,12 +5435,12 @@ static int service_indicate_state(struct connman_service *service) */ downgrade_connected_services(); - __connman_service_auto_connect(); + __connman_service_auto_connect(CONNMAN_SERVICE_CONNECT_REASON_AUTO); } if (new_state == CONNMAN_SERVICE_STATE_FAILURE) { - if (service->userconnect && + if (service->connect_reason == CONNMAN_SERVICE_CONNECT_REASON_USER && connman_agent_report_error(service, service->path, error2string(service->error), report_error_cb, @@ -5943,44 +5664,28 @@ static gboolean redo_wispr(gpointer user_data) return FALSE; } -static gboolean redo_wispr_ipv4(gpointer user_data) -{ - struct connman_service *service = user_data; - - DBG(""); - - __connman_wispr_start(service, CONNMAN_IPCONFIG_TYPE_IPV4); - - return FALSE; -} - int __connman_service_online_check_failed(struct connman_service *service, enum connman_ipconfig_type type) { DBG("service %p type %d count %d", service, type, service->online_check_count); - int timeout = 0; - if (service->online_check_count < 1) { - connman_warn("Online check failed for %p %s", service, + /* currently we only retry IPv6 stuff */ + if (type == CONNMAN_IPCONFIG_TYPE_IPV4 || + service->online_check_count != 1) { + connman_warn("Online check failed for %p %s", service, service->name); - return 0; + return 0; } - - --service->online_check_count; + + service->online_check_count = 0; /* * We set the timeout to 1 sec so that we have a chance to get * necessary IPv6 router advertisement messages that might have * DNS data etc. */ - timeout = 12 - service->online_check_count; - - if (type == CONNMAN_IPCONFIG_TYPE_IPV4) { - g_timeout_add_seconds(timeout * timeout, redo_wispr_ipv4, connman_service_ref(service)); - } else { - g_timeout_add_seconds(1, redo_wispr, connman_service_ref(service)); - } + g_timeout_add_seconds(1, redo_wispr, connman_service_ref(service)); return EAGAIN; } @@ -6029,7 +5734,6 @@ int __connman_service_ipconfig_indicate_state(struct connman_service *service, break; case CONNMAN_SERVICE_STATE_READY: if (type == CONNMAN_IPCONFIG_TYPE_IPV4) { - service->online_check_count = 12;//this works out to be about 10 minutes total check_proxy_setup(service); service_rp_filter(service, true); } else { @@ -6100,6 +5804,7 @@ static bool prepare_network(struct connman_service *service) "WiFi.Passphrase", service->passphrase); break; case CONNMAN_NETWORK_TYPE_ETHERNET: + case CONNMAN_NETWORK_TYPE_GADGET: case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN: case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN: case CONNMAN_NETWORK_TYPE_CELLULAR: @@ -6154,9 +5859,9 @@ static int service_connect(struct connman_service *service) case CONNMAN_SERVICE_TYPE_UNKNOWN: case CONNMAN_SERVICE_TYPE_SYSTEM: case CONNMAN_SERVICE_TYPE_GPS: - case CONNMAN_SERVICE_TYPE_GADGET: return -EINVAL; case CONNMAN_SERVICE_TYPE_ETHERNET: + case CONNMAN_SERVICE_TYPE_GADGET: case CONNMAN_SERVICE_TYPE_BLUETOOTH: case CONNMAN_SERVICE_TYPE_CELLULAR: case CONNMAN_SERVICE_TYPE_VPN: @@ -6254,12 +5959,15 @@ static int service_connect(struct connman_service *service) return err; } - -int __connman_service_connect(struct connman_service *service) +int __connman_service_connect(struct connman_service *service, + enum connman_service_connect_reason reason) { int err; - DBG("service %p state %s", service, state2string(service->state)); + DBG("service %p state %s connect reason %s -> %s", + service, state2string(service->state), + reason2string(service->connect_reason), + reason2string(reason)); if (is_connected(service)) return -EISCONN; @@ -6271,7 +5979,6 @@ int __connman_service_connect(struct connman_service *service) case CONNMAN_SERVICE_TYPE_UNKNOWN: case CONNMAN_SERVICE_TYPE_SYSTEM: case CONNMAN_SERVICE_TYPE_GPS: - case CONNMAN_SERVICE_TYPE_GADGET: return -EINVAL; default: if (!is_ipconfig_usable(service)) @@ -6280,6 +5987,7 @@ int __connman_service_connect(struct connman_service *service) err = service_connect(service); } + service->connect_reason = reason; if (err >= 0) { set_error(service, CONNMAN_SERVICE_ERROR_UNKNOWN); return 0; @@ -6299,7 +6007,7 @@ int __connman_service_connect(struct connman_service *service) service->provider) connman_provider_disconnect(service->provider); - if (service->userconnect) { + if (service->connect_reason == CONNMAN_SERVICE_CONNECT_REASON_USER) { if (err == -ENOKEY || err == -EPERM) { DBusMessage *pending = NULL; @@ -6335,7 +6043,7 @@ int __connman_service_disconnect(struct connman_service *service) DBG("service %p", service); - service->userconnect = false; + service->connect_reason = CONNMAN_SERVICE_CONNECT_REASON_NONE; service->proxy = CONNMAN_SERVICE_PROXY_METHOD_UNKNOWN; connman_agent_cancel(service); @@ -6882,6 +6590,8 @@ static enum connman_service_type convert_network_type(struct connman_network *ne return CONNMAN_SERVICE_TYPE_BLUETOOTH; case CONNMAN_NETWORK_TYPE_CELLULAR: return CONNMAN_SERVICE_TYPE_CELLULAR; + case CONNMAN_NETWORK_TYPE_GADGET: + return CONNMAN_SERVICE_TYPE_GADGET; } return CONNMAN_SERVICE_TYPE_UNKNOWN; @@ -7056,7 +6766,7 @@ struct connman_service * __connman_service_create_from_network(struct connman_ne if (service->favorite) { device = connman_network_get_device(service->network); if (device && !connman_device_get_scanning(device)) - __connman_service_auto_connect(); + __connman_service_auto_connect(CONNMAN_SERVICE_CONNECT_REASON_AUTO); } __connman_notifier_service_add(service, service->name); @@ -7180,7 +6890,6 @@ __connman_service_create_from_provider(struct connman_provider *provider) service->type = CONNMAN_SERVICE_TYPE_VPN; service->provider = connman_provider_ref(provider); service->autoconnect = false; - service->userconnect = true; service->favorite = true; service->state_ipv4 = service->state_ipv6 = CONNMAN_SERVICE_STATE_IDLE; diff --git a/connman/src/session.c b/src/session.c similarity index 64% rename from connman/src/session.c rename to src/session.c index 5985a5984..51f29ab5b 100644 --- a/connman/src/session.c +++ b/src/session.c @@ -34,26 +34,11 @@ static DBusConnection *connection; static GHashTable *session_hash; +static GHashTable *service_hash; static struct connman_session *ecall_session; -static GSList *policy_list; static uint32_t session_mark = 256; static struct firewall_context *global_firewall = NULL; -enum connman_session_trigger { - CONNMAN_SESSION_TRIGGER_UNKNOWN = 0, - CONNMAN_SESSION_TRIGGER_SETTING = 1, - CONNMAN_SESSION_TRIGGER_CONNECT = 2, - CONNMAN_SESSION_TRIGGER_DISCONNECT = 3, - CONNMAN_SESSION_TRIGGER_SERVICE = 4, - CONNMAN_SESSION_TRIGGER_ECALL = 5, -}; - -enum connman_session_reason { - CONNMAN_SESSION_REASON_UNKNOWN = 0, - CONNMAN_SESSION_REASON_CONNECT = 1, - CONNMAN_SESSION_REASON_FREE_RIDE = 2, -}; - enum connman_session_state { CONNMAN_SESSION_STATE_DISCONNECTED = 0, CONNMAN_SESSION_STATE_CONNECTED = 1, @@ -63,7 +48,6 @@ enum connman_session_state { struct session_info { struct connman_session_config config; enum connman_session_state state; - enum connman_session_reason reason; }; struct connman_session { @@ -72,8 +56,7 @@ struct connman_session { char *notify_path; guint notify_watch; - struct connman_session_policy *policy; - + bool active; bool append_all; struct session_info *info; struct session_info *info_last; @@ -86,47 +69,28 @@ struct connman_session { enum connman_session_id_type id_type; struct firewall_context *fw; - struct nfacct_context *nfctx; uint32_t mark; int index; char *gateway; - - GList *service_list; - GHashTable *service_hash; + bool policy_routing; }; -static const char *trigger2string(enum connman_session_trigger trigger) -{ - switch (trigger) { - case CONNMAN_SESSION_TRIGGER_UNKNOWN: - break; - case CONNMAN_SESSION_TRIGGER_SETTING: - return "setting"; - case CONNMAN_SESSION_TRIGGER_CONNECT: - return "connect"; - case CONNMAN_SESSION_TRIGGER_DISCONNECT: - return "disconnect"; - case CONNMAN_SESSION_TRIGGER_SERVICE: - return "service"; - case CONNMAN_SESSION_TRIGGER_ECALL: - return "ecall"; - } +struct connman_service_info { + struct connman_service *service; + GSList *sessions; +}; - return NULL; -} +static struct connman_session_policy *policy; +static void session_activate(struct connman_session *session); +static void session_deactivate(struct connman_session *session); +static void update_session_state(struct connman_session *session); -static const char *reason2string(enum connman_session_reason reason) +static void cleanup_service(gpointer data) { - switch (reason) { - case CONNMAN_SESSION_REASON_UNKNOWN: - return "unknown"; - case CONNMAN_SESSION_REASON_CONNECT: - return "connect"; - case CONNMAN_SESSION_REASON_FREE_RIDE: - return "free-ride"; - } + struct connman_service_info *info = data; - return NULL; + g_slist_free(info->sessions); + g_free(info); } static const char *state2string(enum connman_session_state state) @@ -193,14 +157,14 @@ static int bearer2service(const char *bearer, enum connman_service_type *type) *type = CONNMAN_SERVICE_TYPE_ETHERNET; else if (g_strcmp0(bearer, "wifi") == 0) *type = CONNMAN_SERVICE_TYPE_WIFI; + else if (g_strcmp0(bearer, "gadget") == 0) + *type = CONNMAN_SERVICE_TYPE_GADGET; else if (g_strcmp0(bearer, "bluetooth") == 0) *type = CONNMAN_SERVICE_TYPE_BLUETOOTH; else if (g_strcmp0(bearer, "cellular") == 0) *type = CONNMAN_SERVICE_TYPE_CELLULAR; else if (g_strcmp0(bearer, "vpn") == 0) *type = CONNMAN_SERVICE_TYPE_VPN; - else if (g_strcmp0(bearer, "*") == 0) - *type = CONNMAN_SERVICE_TYPE_UNKNOWN; else return -EINVAL; @@ -212,6 +176,8 @@ static char *service2bearer(enum connman_service_type type) switch (type) { case CONNMAN_SERVICE_TYPE_ETHERNET: return "ethernet"; + case CONNMAN_SERVICE_TYPE_GADGET: + return "gadget"; case CONNMAN_SERVICE_TYPE_WIFI: return "wifi"; case CONNMAN_SERVICE_TYPE_BLUETOOTH: @@ -220,11 +186,9 @@ static char *service2bearer(enum connman_service_type type) return "cellular"; case CONNMAN_SERVICE_TYPE_VPN: return "vpn"; - case CONNMAN_SERVICE_TYPE_UNKNOWN: - return "*"; case CONNMAN_SERVICE_TYPE_SYSTEM: case CONNMAN_SERVICE_TYPE_GPS: - case CONNMAN_SERVICE_TYPE_GADGET: + case CONNMAN_SERVICE_TYPE_UNKNOWN: return ""; } @@ -274,25 +238,6 @@ static void cleanup_firewall(void) __connman_firewall_destroy(global_firewall); } -static int enable_nfacct(struct firewall_context *fw, uint32_t mark) -{ - int err; - - err = __connman_firewall_add_rule(fw, "filter", "INPUT", - "-m mark --mark %d -m nfacct " - "--nfacct-name session-input-%d", - mark, mark); - if (err < 0) - return err; - - err = __connman_firewall_add_rule(fw, "filter", "OUTPUT", - "-m mark --mark %d -m nfacct " - "--nfacct-name session-output-%d", - mark, mark); - - return err; -} - static int init_firewall_session(struct connman_session *session) { struct firewall_context *fw; @@ -334,10 +279,6 @@ static int init_firewall_session(struct connman_session *session) session->id_type = session->policy_config->id_type; - err = enable_nfacct(fw, session->mark); - if (err < 0) - connman_warn_once("Support for nfacct missing"); - err = __connman_firewall_enable(fw); if (err) goto err; @@ -382,6 +323,7 @@ static int init_routing_table(struct connman_session *session) if (err < 0) __connman_inet_del_fwmark_rule(session->mark, AF_INET, session->mark); + session->policy_routing = true; return err; } @@ -426,11 +368,14 @@ static void cleanup_routing_table(struct connman_session *session) { DBG(""); - __connman_inet_del_fwmark_rule(session->mark, + if (session->policy_routing) { + __connman_inet_del_fwmark_rule(session->mark, AF_INET6, session->mark); - __connman_inet_del_fwmark_rule(session->mark, + __connman_inet_del_fwmark_rule(session->mark, AF_INET, session->mark); + session->policy_routing = false; + } del_default_route(session); } @@ -443,12 +388,12 @@ static void update_routing_table(struct connman_session *session) static void destroy_policy_config(struct connman_session *session) { - if (!session->policy) { + if (!policy) { g_free(session->policy_config); return; } - (*session->policy->destroy)(session); + policy->destroy(session); } static void free_session(struct connman_session *session) @@ -471,36 +416,6 @@ static void free_session(struct connman_session *session) g_free(session); } -static void cleanup_session_final(struct connman_session *session) -{ - struct session_info *info = session->info; - - DBG("remove %s", session->session_path); - - if (info->reason == CONNMAN_SESSION_REASON_CONNECT) - __connman_service_set_active_session(false, - session->info->config.allowed_bearers); - - g_slist_free(session->user_allowed_bearers); - if (session->service_hash) - g_hash_table_destroy(session->service_hash); - g_list_free(session->service_list); - - free_session(session); -} - -static void nfacct_cleanup_cb(unsigned int error, struct nfacct_context *ctx, - void *user_data) -{ - struct connman_session *session = user_data; - - DBG(""); - - __connman_nfacct_destroy_context(session->nfctx); - - cleanup_session_final(session); -} - static void cleanup_session(gpointer user_data) { struct connman_session *session = user_data; @@ -510,24 +425,16 @@ static void cleanup_session(gpointer user_data) cleanup_routing_table(session); cleanup_firewall_session(session); - if (session->nfctx) - __connman_nfacct_disable(session->nfctx, nfacct_cleanup_cb, - session); - else - cleanup_session_final(session); -} - -static int assign_policy_plugin(struct connman_session *session) -{ - if (session->policy) - return -EALREADY; + if (session->active) + __connman_service_set_active_session(false, + session->info->config.allowed_bearers); - if (!policy_list) - return 0; + session_deactivate(session); + update_session_state(session); - session->policy = policy_list->data; + g_slist_free(session->user_allowed_bearers); - return 0; + free_session(session); } struct creation_data { @@ -557,7 +464,7 @@ static int create_policy_config(struct connman_session *session, { struct connman_session_config *config; - if (!session->policy) { + if (!policy) { config = connman_session_create_default_config(); if (!config) { free_session(session); @@ -568,62 +475,49 @@ static int create_policy_config(struct connman_session *session, return cb(session, config, creation_data, 0); } - return (*session->policy->create)(session, cb, creation_data); + return policy->create(session, cb, creation_data); } -static void remove_policy(struct connman_session_policy *policy) +int connman_session_policy_register(struct connman_session_policy *plugin) { - GHashTableIter iter; - gpointer key, value; - struct connman_session *session; - - if (!session_hash) - return; - - DBG("policy %p name %s", policy, policy->name); + if (policy) + return -EINVAL; - g_hash_table_iter_init(&iter, session_hash); + if (!plugin->create || !plugin->destroy) + return -EINVAL; - while (g_hash_table_iter_next(&iter, &key, &value)) { - session = value; + DBG("name %s", plugin->name); - if (session->policy != policy) - continue; + policy = plugin; - session->policy = NULL; - assign_policy_plugin(session); - } + return 0; } -static gint compare_priority(gconstpointer a, gconstpointer b) +void connman_session_policy_unregister(struct connman_session_policy *plugin) { - const struct connman_session_policy *policy1 = a; - const struct connman_session_policy *policy2 = b; - - return policy2->priority - policy1->priority; -} - + if (plugin != policy) + return; -int connman_session_policy_register(struct connman_session_policy *policy) -{ DBG("name %s", policy->name); - if (!policy->create || !policy->destroy) - return -EINVAL; - - policy_list = g_slist_insert_sorted(policy_list, policy, - compare_priority); - - return 0; + policy = NULL; } -void connman_session_policy_unregister(struct connman_session_policy *policy) -{ - DBG("name %s", policy->name); +static int default_bearers[] = { + CONNMAN_SERVICE_TYPE_ETHERNET, + CONNMAN_SERVICE_TYPE_WIFI, + CONNMAN_SERVICE_TYPE_BLUETOOTH, + CONNMAN_SERVICE_TYPE_CELLULAR, + CONNMAN_SERVICE_TYPE_GADGET, +}; - policy_list = g_slist_remove(policy_list, policy); +static void add_default_bearer_types(GSList **list) +{ + unsigned int i; - remove_policy(policy); + for (i = 0; i < G_N_ELEMENTS(default_bearers); i++) + *list = g_slist_append(*list, + GINT_TO_POINTER(default_bearers[i])); } void connman_session_set_default_config(struct connman_session_config *config) @@ -638,8 +532,7 @@ void connman_session_set_default_config(struct connman_session_config *config) config->ecall = FALSE; g_slist_free(config->allowed_bearers); - config->allowed_bearers = g_slist_prepend(NULL, - GINT_TO_POINTER(CONNMAN_SERVICE_TYPE_UNKNOWN)); + add_default_bearer_types(&config->allowed_bearers); } struct connman_session_config *connman_session_create_default_config(void) @@ -676,6 +569,11 @@ int connman_session_parse_bearers(const char *token, GSList **list) if (g_strcmp0(token, "") == 0) return 0; + if (g_strcmp0(token, "*") == 0) { + add_default_bearer_types(list); + return 0; + } + err = bearer2service(token, &bearer); if (err < 0) return err; @@ -719,7 +617,7 @@ static int parse_bearers(DBusMessageIter *iter, GSList **list) return 0; } -static int filter_bearer(GSList *policy_bearers, +static void filter_bearer(GSList *policy_bearers, enum connman_service_type bearer, GSList **list) { @@ -727,50 +625,32 @@ static int filter_bearer(GSList *policy_bearers, GSList *it; if (!policy_bearers) - return 0; + return; for (it = policy_bearers; it; it = it->next) { policy = GPOINTER_TO_INT(it->data); - if (bearer == CONNMAN_SERVICE_TYPE_UNKNOWN) { - bearer = policy; - goto clone; - } - - if (policy != CONNMAN_SERVICE_TYPE_UNKNOWN && policy != bearer) + if (policy != bearer) continue; - goto clone; + *list = g_slist_append(*list, GINT_TO_POINTER(bearer)); + return; } - - *list = NULL; - - return 0; - -clone: - *list = g_slist_append(*list, GINT_TO_POINTER(bearer)); - - return 0; } -static int apply_policy_on_bearers(GSList *policy_bearers, GSList *bearers, +static void apply_policy_on_bearers(GSList *policy_bearers, GSList *bearers, GSList **list) { enum connman_service_type bearer; GSList *it; - int err; *list = NULL; for (it = bearers; it; it = it->next) { bearer = GPOINTER_TO_INT(it->data); - err = filter_bearer(policy_bearers, bearer, list); - if (err < 0) - return err; + filter_bearer(policy_bearers, bearer, list); } - - return 0; } const char *connman_session_get_owner(struct connman_session *session) @@ -789,7 +669,7 @@ static void append_allowed_bearers(DBusMessageIter *iter, void *user_data) const char *name = __connman_service_type2string(bearer); if (!name) - name = "*"; + name = ""; dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &name); @@ -921,30 +801,6 @@ static void append_notify(DBusMessageIter *dict, session->append_all = false; } -static bool is_type_matching_state(enum connman_session_state *state, - enum connman_session_type type) -{ - switch (type) { - case CONNMAN_SESSION_TYPE_UNKNOWN: - return false; - case CONNMAN_SESSION_TYPE_ANY: - return true; - case CONNMAN_SESSION_TYPE_LOCAL: - if (*state >= CONNMAN_SESSION_STATE_CONNECTED) { - *state = CONNMAN_SESSION_STATE_CONNECTED; - return true; - } - - break; - case CONNMAN_SESSION_TYPE_INTERNET: - if (*state == CONNMAN_SESSION_STATE_ONLINE) - return true; - break; - } - - return false; -} - static bool compute_notifiable_changes(struct connman_session *session) { struct session_info *info_last = session->info_last; @@ -1011,564 +867,117 @@ static void ipconfig_ipv6_changed(struct connman_session *session) session->service); } -static bool service_type_match(struct connman_session *session, - struct connman_service *service) +int connman_session_config_update(struct connman_session *session) { struct session_info *info = session->info; - GSList *list; + GSList *allowed_bearers; + int err; - for (list = info->config.allowed_bearers; - list; list = list->next) { - enum connman_service_type bearer = GPOINTER_TO_INT(list->data); - enum connman_service_type service_type; + DBG("session %p", session); - if (bearer == CONNMAN_SERVICE_TYPE_UNKNOWN) - return true; + /* + * We update all configuration even though only one entry + * might have changed. We can still optimize this later. + */ - service_type = connman_service_get_type(service); - if (bearer == service_type) - return true; + if (session->id_type != session->policy_config->id_type) { + cleanup_firewall_session(session); + err = init_firewall_session(session); + if (err < 0) { + connman_session_destroy(session); + return err; + } + + session->id_type = session->policy_config->id_type; } - return false; -} + apply_policy_on_bearers( + session->policy_config->allowed_bearers, + session->user_allowed_bearers, + &allowed_bearers); -static bool service_match(struct connman_session *session, - struct connman_service *service) -{ - if (!service_type_match(session, service)) - return false; + if (session->active) + __connman_service_set_active_session(false, + session->info->config.allowed_bearers); - return true; -} + session->active = false; + session_deactivate(session); -static int service_type_weight(enum connman_service_type type) -{ - /* - * The session doesn't care which service - * to use. Nevertheless we have to sort them - * according their type. The ordering is - * - * 1. Ethernet - * 2. Bluetooth - * 3. WiFi - * 4. Cellular - */ + g_slist_free(info->config.allowed_bearers); + info->config.allowed_bearers = allowed_bearers; - switch (type) { - case CONNMAN_SERVICE_TYPE_ETHERNET: - return 4; - case CONNMAN_SERVICE_TYPE_BLUETOOTH: - return 3; - case CONNMAN_SERVICE_TYPE_WIFI: - return 2; - case CONNMAN_SERVICE_TYPE_CELLULAR: - return 1; - case CONNMAN_SERVICE_TYPE_UNKNOWN: - case CONNMAN_SERVICE_TYPE_SYSTEM: - case CONNMAN_SERVICE_TYPE_GPS: - case CONNMAN_SERVICE_TYPE_VPN: - case CONNMAN_SERVICE_TYPE_GADGET: - break; - } + session_activate(session); - return 0; -} + info->config.type = apply_policy_on_type( + session->policy_config->type, + info->config.type); -static gint sort_allowed_bearers(struct connman_service *service_a, - struct connman_service *service_b, - struct connman_session *session) -{ - struct session_info *info = session->info; - GSList *list; - enum connman_service_type type_a, type_b; - int weight_a, weight_b; + info->config.roaming_policy = session->policy_config->roaming_policy; - type_a = connman_service_get_type(service_a); - type_b = connman_service_get_type(service_b); + info->config.ecall = session->policy_config->ecall; + if (info->config.ecall) + ecall_session = session; - for (list = info->config.allowed_bearers; - list; list = list->next) { - enum connman_service_type bearer = GPOINTER_TO_INT(list->data); + info->config.priority = session->policy_config->priority; - if (bearer == CONNMAN_SERVICE_TYPE_UNKNOWN) { - if (type_a != type_b) { - weight_a = service_type_weight(type_a); - weight_b = service_type_weight(type_b); + session_notify(session); - if (weight_a > weight_b) - return -1; + return 0; +} - if (weight_a < weight_b) - return 1; +static DBusMessage *connect_session(DBusConnection *conn, + DBusMessage *msg, void *user_data) +{ + struct connman_session *session = user_data; - return 0; - } - } + DBG("session %p", session); - if (type_a == bearer && type_b == bearer) - return 0; + if (ecall_session) { + if (ecall_session->ecall && ecall_session != session) + return __connman_error_failed(msg, EBUSY); - if (type_a == bearer && type_b != bearer) - return -1; + session->ecall = true; + } - if (type_a != bearer && type_b == bearer) - return 1; + if (!session->active) { + session->active = true; + __connman_service_set_active_session(true, + session->info->config.allowed_bearers); } - return 0; + __connman_service_auto_connect(CONNMAN_SERVICE_CONNECT_REASON_SESSION); + + return g_dbus_create_reply(msg, DBUS_TYPE_INVALID); } -static gint sort_services(gconstpointer a, gconstpointer b, gpointer user_data) +static DBusMessage *disconnect_session(DBusConnection *conn, + DBusMessage *msg, void *user_data) { - struct connman_service *service_a = (void *)a; - struct connman_service *service_b = (void *)b; struct connman_session *session = user_data; - return sort_allowed_bearers(service_a, service_b, session); -} + DBG("session %p", session); -static enum connman_session_state service_to_session_state(enum connman_service_state state) -{ - switch (state) { - case CONNMAN_SERVICE_STATE_UNKNOWN: - case CONNMAN_SERVICE_STATE_IDLE: - case CONNMAN_SERVICE_STATE_ASSOCIATION: - case CONNMAN_SERVICE_STATE_CONFIGURATION: - case CONNMAN_SERVICE_STATE_DISCONNECT: - case CONNMAN_SERVICE_STATE_FAILURE: - break; - case CONNMAN_SERVICE_STATE_READY: - return CONNMAN_SESSION_STATE_CONNECTED; - case CONNMAN_SERVICE_STATE_ONLINE: - return CONNMAN_SESSION_STATE_ONLINE; + if (ecall_session) { + if (ecall_session->ecall && ecall_session != session) + return __connman_error_failed(msg, EBUSY); + + session->ecall = false; } - return CONNMAN_SESSION_STATE_DISCONNECTED; + if (session->active) { + session->active = false; + __connman_service_set_active_session(false, + session->info->config.allowed_bearers); + } + + session_deactivate(session); + update_session_state(session); + + return g_dbus_create_reply(msg, DBUS_TYPE_INVALID); } -static bool is_connected(enum connman_service_state state) -{ - switch (state) { - case CONNMAN_SERVICE_STATE_UNKNOWN: - case CONNMAN_SERVICE_STATE_IDLE: - case CONNMAN_SERVICE_STATE_ASSOCIATION: - case CONNMAN_SERVICE_STATE_CONFIGURATION: - case CONNMAN_SERVICE_STATE_DISCONNECT: - case CONNMAN_SERVICE_STATE_FAILURE: - break; - case CONNMAN_SERVICE_STATE_READY: - case CONNMAN_SERVICE_STATE_ONLINE: - return true; - } - - return false; -} - -static bool is_connecting(enum connman_service_state state) -{ - switch (state) { - case CONNMAN_SERVICE_STATE_UNKNOWN: - case CONNMAN_SERVICE_STATE_IDLE: - break; - case CONNMAN_SERVICE_STATE_ASSOCIATION: - case CONNMAN_SERVICE_STATE_CONFIGURATION: - return true; - case CONNMAN_SERVICE_STATE_DISCONNECT: - case CONNMAN_SERVICE_STATE_FAILURE: - case CONNMAN_SERVICE_STATE_READY: - case CONNMAN_SERVICE_STATE_ONLINE: - break; - } - - return false; -} - -static bool is_disconnected(enum connman_service_state state) -{ - if (is_connected(state) || is_connecting(state)) - return false; - - return true; -} - -static bool explicit_connect(enum connman_session_reason reason) -{ - switch (reason) { - case CONNMAN_SESSION_REASON_UNKNOWN: - case CONNMAN_SESSION_REASON_FREE_RIDE: - break; - case CONNMAN_SESSION_REASON_CONNECT: - return true; - } - - return false; -} - -static void deselect_and_disconnect(struct connman_session *session) -{ - struct session_info *info = session->info; - - if (info->reason == CONNMAN_SESSION_REASON_CONNECT) - __connman_service_set_active_session(false, - info->config.allowed_bearers); - - info->reason = CONNMAN_SESSION_REASON_FREE_RIDE; - - info->state = CONNMAN_SESSION_STATE_DISCONNECTED; - - if (!session->service) - return; - - session->service = NULL; - - update_routing_table(session); -} - -static void select_connected_service(struct connman_session *session, - struct connman_service *service) -{ - struct session_info *info = session->info; - enum connman_service_state service_state; - enum connman_session_state state; - - service_state = __connman_service_get_state(service); - state = service_to_session_state(service_state); - if (!is_type_matching_state(&state, info->config.type)) - return; - - info->state = state; - - session->service = service; -} - -static void select_offline_service(struct connman_session *session, - struct connman_service *service) -{ - struct session_info *info = session->info; - enum connman_service_state service_state; - - if (!explicit_connect(info->reason)) - return; - - service_state = __connman_service_get_state(service); - info->state = service_to_session_state(service_state); - - session->service = service; -} - -static void select_service(struct connman_session *session, - struct connman_service *service) -{ - enum connman_service_state service_state; - - DBG("service %p", service); - - service_state = __connman_service_get_state(service); - if (is_connected(service_state)) - select_connected_service(session, service); - else - select_offline_service(session, service); -} - -static void select_and_connect(struct connman_session *session, - enum connman_session_reason reason) -{ - struct session_info *info = session->info; - struct connman_service *service = NULL; - enum connman_service_state service_state; - GList *list; - - DBG("session %p reason %s", session, reason2string(reason)); - - if (info->reason != reason && - reason == CONNMAN_SESSION_REASON_CONNECT) { - __connman_service_set_active_session(true, - info->config.allowed_bearers); - - __connman_service_auto_connect(); - } - - info->reason = reason; - - for (list = session->service_list; list; list = list->next) { - service = list->data; - - service_state = __connman_service_get_state(service); - switch (service_state) { - case CONNMAN_SERVICE_STATE_ASSOCIATION: - case CONNMAN_SERVICE_STATE_CONFIGURATION: - case CONNMAN_SERVICE_STATE_READY: - case CONNMAN_SERVICE_STATE_ONLINE: - case CONNMAN_SERVICE_STATE_IDLE: - case CONNMAN_SERVICE_STATE_DISCONNECT: - select_service(session, service); - update_routing_table(session); - return; - case CONNMAN_SERVICE_STATE_UNKNOWN: - case CONNMAN_SERVICE_STATE_FAILURE: - break; - } - } -} - -static void iterate_service_cb(struct connman_service *service, - void *user_data) -{ - struct connman_session *session = user_data; - enum connman_service_state service_state; - - service_state = __connman_service_get_state(service); - if (!is_connected(service_state)) - return; - - if (!service_match(session, service)) - return; - - g_hash_table_replace(session->service_hash, service, NULL); -} - -static void populate_service_list(struct connman_session *session) -{ - GHashTableIter iter; - gpointer key, value; - - session->service_hash = - g_hash_table_new_full(g_direct_hash, g_direct_equal, - NULL, NULL); - __connman_service_iterate_services(iterate_service_cb, session); - - g_hash_table_iter_init(&iter, session->service_hash); - - while (g_hash_table_iter_next(&iter, &key, &value)) { - struct connman_service *service = key; - - DBG("service %p type %s name %s", service, - service2bearer(connman_service_get_type(service)), - __connman_service_get_name(service)); - session->service_list = g_list_prepend(session->service_list, - service); - } - - session->service_list = g_list_sort_with_data(session->service_list, - sort_services, session); -} - -static void session_changed(struct connman_session *session, - enum connman_session_trigger trigger) -{ - struct session_info *info = session->info; - struct session_info *info_last = session->info_last; - struct connman_service *service = NULL, *service_last = NULL; - enum connman_service_state service_state; - GHashTable *service_hash_last; - - /* - * TODO: This only a placeholder for the 'real' algorithm to - * play a bit around. So we are going to improve it step by step. - */ - - DBG("session %p trigger %s reason %s", session, trigger2string(trigger), - reason2string(info->reason)); - - - if (session->service) { - enum connman_session_state state; - - service_state = __connman_service_get_state(session->service); - state = service_to_session_state(service_state); - - if (is_type_matching_state(&state, info->config.type)) - info->state = state; - } - - switch (trigger) { - case CONNMAN_SESSION_TRIGGER_UNKNOWN: - DBG("ignore session changed event"); - return; - case CONNMAN_SESSION_TRIGGER_SETTING: - if (info->config.allowed_bearers != info_last->config.allowed_bearers) { - - service_hash_last = session->service_hash; - g_list_free(session->service_list); - session->service_list = NULL; - - service = session->service; - - populate_service_list(session); - - if (service) { - service_last = g_hash_table_lookup( - service_hash_last, - service); - } - - if (service_last && - !g_hash_table_lookup(session->service_hash, - service)) { - - /* - * The currently selected service is - * not part of this session anymore. - */ - deselect_and_disconnect(session); - } - - g_hash_table_destroy(service_hash_last); - } - - if (info->config.type != info_last->config.type) { - if (info->state >= CONNMAN_SESSION_STATE_CONNECTED && - !is_type_matching_state(&info->state, - info->config.type)) - deselect_and_disconnect(session); - } - - if (info->state == CONNMAN_SESSION_STATE_DISCONNECTED) { - select_and_connect(session, - CONNMAN_SESSION_REASON_FREE_RIDE); - } - - break; - case CONNMAN_SESSION_TRIGGER_ECALL: - /* - * For the time beeing we fallback to normal connect - * strategy. - */ - case CONNMAN_SESSION_TRIGGER_CONNECT: - if (info->state >= CONNMAN_SESSION_STATE_CONNECTED) - break; - - if (session->service) { - service_state = __connman_service_get_state( - session->service); - if (is_connecting(service_state)) - break; - } - - select_and_connect(session, CONNMAN_SESSION_REASON_CONNECT); - - break; - case CONNMAN_SESSION_TRIGGER_DISCONNECT: - deselect_and_disconnect(session); - - break; - case CONNMAN_SESSION_TRIGGER_SERVICE: - if (session->service) { - service_state = __connman_service_get_state( - session->service); - if (is_connecting(service_state) || - is_connected(service_state)) - break; - } - - select_and_connect(session, info->reason); - - break; - } - - session_notify(session); -} - -int connman_session_config_update(struct connman_session *session) -{ - struct session_info *info = session->info; - GSList *allowed_bearers; - int err; - - DBG("session %p", session); - - /* - * We update all configuration even though only one entry - * might have changed. We can still optimize this later. - */ - - if (session->id_type != session->policy_config->id_type) { - cleanup_firewall_session(session); - err = init_firewall_session(session); - if (err < 0) { - connman_session_destroy(session); - return err; - } - - session->id_type = session->policy_config->id_type; - } - - err = apply_policy_on_bearers( - session->policy_config->allowed_bearers, - session->user_allowed_bearers, - &allowed_bearers); - if (err < 0) - return err; - - if (info->reason == CONNMAN_SESSION_REASON_CONNECT) - __connman_service_set_active_session(false, - info->config.allowed_bearers); - - g_slist_free(info->config.allowed_bearers); - info->config.allowed_bearers = allowed_bearers; - - if (info->reason == CONNMAN_SESSION_REASON_CONNECT) - __connman_service_set_active_session(true, - info->config.allowed_bearers); - - info->config.type = apply_policy_on_type( - session->policy_config->type, - info->config.type); - - info->config.roaming_policy = session->policy_config->roaming_policy; - - info->config.ecall = session->policy_config->ecall; - if (info->config.ecall) - ecall_session = session; - - info->config.priority = session->policy_config->priority; - - session_changed(session, CONNMAN_SESSION_TRIGGER_SETTING); - - return 0; -} - -static DBusMessage *connect_session(DBusConnection *conn, - DBusMessage *msg, void *user_data) -{ - struct connman_session *session = user_data; - - DBG("session %p", session); - - if (ecall_session) { - if (ecall_session->ecall && ecall_session != session) - return __connman_error_failed(msg, EBUSY); - - session->ecall = true; - session_changed(session, CONNMAN_SESSION_TRIGGER_ECALL); - } else - session_changed(session, CONNMAN_SESSION_TRIGGER_CONNECT); - - return g_dbus_create_reply(msg, DBUS_TYPE_INVALID); -} - -static DBusMessage *disconnect_session(DBusConnection *conn, - DBusMessage *msg, void *user_data) -{ - struct connman_session *session = user_data; - - DBG("session %p", session); - - if (ecall_session) { - if (ecall_session->ecall && ecall_session != session) - return __connman_error_failed(msg, EBUSY); - - session->ecall = false; - } - - session_changed(session, CONNMAN_SESSION_TRIGGER_DISCONNECT); - - return g_dbus_create_reply(msg, DBUS_TYPE_INVALID); -} - -static DBusMessage *change_session(DBusConnection *conn, - DBusMessage *msg, void *user_data) +static DBusMessage *change_session(DBusConnection *conn, + DBusMessage *msg, void *user_data) { struct connman_session *session = user_data; struct session_info *info = session->info; @@ -1600,25 +1009,22 @@ static DBusMessage *change_session(DBusConnection *conn, if (err < 0) return __connman_error_failed(msg, -err); - if (info->reason == CONNMAN_SESSION_REASON_CONNECT) + if (session->active) __connman_service_set_active_session(false, - info->config.allowed_bearers); + session->info->config.allowed_bearers); + + session->active = false; + session_deactivate(session); g_slist_free(info->config.allowed_bearers); session->user_allowed_bearers = allowed_bearers; - err = apply_policy_on_bearers( + apply_policy_on_bearers( session->policy_config->allowed_bearers, session->user_allowed_bearers, &info->config.allowed_bearers); - if (err < 0) - return __connman_error_failed(msg, -err); - - if (info->reason == CONNMAN_SESSION_REASON_CONNECT) - __connman_service_set_active_session(true, - info->config.allowed_bearers); - + session_activate(session); } else { goto err; } @@ -1637,7 +1043,7 @@ static DBusMessage *change_session(DBusConnection *conn, goto err; } - session_changed(session, CONNMAN_SESSION_TRIGGER_SETTING); + session_notify(session); return g_dbus_create_reply(msg, DBUS_TYPE_INVALID); @@ -1680,8 +1086,6 @@ static int session_disconnect(struct connman_session *session) g_dbus_unregister_interface(connection, session->session_path, CONNMAN_SESSION_INTERFACE); - deselect_and_disconnect(session); - g_hash_table_remove(session_hash, session->session_path); return 0; @@ -1722,25 +1126,31 @@ static const GDBusMethodTable session_methods[] = { { }, }; -static void session_nfacct_stats_cb(struct nfacct_context *ctx, - uint64_t packets, uint64_t bytes, - void *user_data) +static int session_policy_config_cb(struct connman_session *session, + struct connman_session_config *config, + void *user_data, int err) { - struct connman_session *session = user_data; + struct creation_data *creation_data = user_data; + struct session_info *info, *info_last; + DBusMessage *reply; - DBG("session %p", session); + DBG("session %p config %p", session, config); - /* XXX add accounting code here */ -} + if (err < 0) + goto err; -static int session_create_final(struct creation_data *creation_data, - struct connman_session *session) -{ - struct session_info *info, *info_last; - DBusMessage *reply; - int err; + session->policy_config = config; - DBG(""); + session->mark = session_mark++; + session->index = -1; + + err = init_firewall_session(session); + if (err < 0) + goto err; + + err = init_routing_table(session); + if (err < 0) + goto err; info = session->info; info_last = session->info_last; @@ -1758,12 +1168,10 @@ static int session_create_final(struct creation_data *creation_data, session->user_allowed_bearers = creation_data->allowed_bearers; creation_data->allowed_bearers = NULL; - err = apply_policy_on_bearers( + apply_policy_on_bearers( session->policy_config->allowed_bearers, session->user_allowed_bearers, &info->config.allowed_bearers); - if (err < 0) - goto err; g_hash_table_replace(session_hash, session->session_path, session); @@ -1785,8 +1193,6 @@ static int session_create_final(struct creation_data *creation_data, g_dbus_send_message(connection, reply); creation_data->pending = NULL; - populate_service_list(session); - info_last->state = info->state; info_last->config.priority = info->config.priority; info_last->config.roaming_policy = info->config.roaming_policy; @@ -1794,100 +1200,11 @@ static int session_create_final(struct creation_data *creation_data, session->append_all = true; - session_changed(session, CONNMAN_SESSION_TRIGGER_SETTING); - - cleanup_creation_data(creation_data); - -err: - return err; -} - -static void session_nfacct_enable_cb(unsigned int error, - struct nfacct_context *ctx, - void *user_data) -{ - struct creation_data *creation_data = user_data; - struct connman_session *session = creation_data->session; - DBusMessage *reply; - int err; - - DBG(""); - - if (error != 0) { - err = -error; - goto err; - } - - err = init_firewall_session(session); - if (err < 0) - goto err; - - err = init_routing_table(session); - if (err < 0) - goto err; - - err = session_create_final(creation_data, session); - if (err < 0) - goto err; - - return; - -err: - reply = __connman_error_failed(creation_data->pending, -err); - g_dbus_send_message(connection, reply); - creation_data->pending = NULL; - - cleanup_session(creation_data->session); cleanup_creation_data(creation_data); -} - -static int session_policy_config_cb(struct connman_session *session, - struct connman_session_config *config, - void *user_data, int err) -{ - struct creation_data *creation_data = user_data; - char *input, *output; - DBusMessage *reply; - - DBG("session %p config %p", session, config); - - if (err < 0) - goto err; - - session->policy_config = config; - - session->mark = session_mark++; - session->index = -1; - - session->nfctx = __connman_nfacct_create_context(); - if (!session->nfctx) { - err = -ENOMEM; - goto err; - } - - input = g_strdup_printf("session-input-%d", session->mark); - err = __connman_nfacct_add(session->nfctx, input, - session_nfacct_stats_cb, - session); - g_free(input); - if (err < 0) - goto err; - - output = g_strdup_printf("session-output-%d", session->mark); - err = __connman_nfacct_add(session->nfctx, output, - session_nfacct_stats_cb, - session); - g_free(output); - if (err < 0) - goto err; - err = __connman_nfacct_enable(session->nfctx, - session_nfacct_enable_cb, - creation_data); - if (err < 0) - goto err; + session_activate(session); - return -EINPROGRESS; + return 0; err: reply = __connman_error_failed(creation_data->pending, -err); @@ -1982,9 +1299,7 @@ int __connman_session_create(DBusMessage *msg) * For AllowedBearers this is '*', ... */ if (!user_allowed_bearers) { - creation_data->allowed_bearers = - g_slist_append(NULL, - GINT_TO_POINTER(CONNMAN_SERVICE_TYPE_UNKNOWN)); + add_default_bearer_types(&creation_data->allowed_bearers); if (!creation_data->allowed_bearers) { err = -ENOMEM; goto err; @@ -2051,10 +1366,6 @@ int __connman_session_create(DBusMessage *msg) g_dbus_add_disconnect_watch(connection, session->owner, owner_disconnect, session, NULL); - err = assign_policy_plugin(session); - if (err < 0) - goto err; - err = create_policy_config(session, session_policy_config_cb, creation_data); if (err < 0 && err != -EINPROGRESS) @@ -2071,6 +1382,14 @@ int __connman_session_create(DBusMessage *msg) return err; } +bool __connman_session_policy_autoconnect(enum connman_service_connect_reason reason) +{ + if (!policy || !policy->autoconnect) + return true; + + return policy->autoconnect(reason); +} + void connman_session_destroy(struct connman_session *session) { DBG("session %p", session); @@ -2104,75 +1423,224 @@ int __connman_session_destroy(DBusMessage *msg) return 0; } -static void service_add(struct connman_service *service, const char *name) +static enum connman_session_state service_to_session_state( + enum connman_service_state state) +{ + switch (state) { + case CONNMAN_SERVICE_STATE_UNKNOWN: + case CONNMAN_SERVICE_STATE_IDLE: + case CONNMAN_SERVICE_STATE_ASSOCIATION: + case CONNMAN_SERVICE_STATE_CONFIGURATION: + case CONNMAN_SERVICE_STATE_DISCONNECT: + case CONNMAN_SERVICE_STATE_FAILURE: + break; + case CONNMAN_SERVICE_STATE_READY: + return CONNMAN_SESSION_STATE_CONNECTED; + case CONNMAN_SERVICE_STATE_ONLINE: + return CONNMAN_SESSION_STATE_ONLINE; + } + + return CONNMAN_SESSION_STATE_DISCONNECTED; +} + +static void update_session_state(struct connman_session *session) +{ + enum connman_service_state service_state; + enum connman_session_state state = CONNMAN_SESSION_STATE_DISCONNECTED; + + if (session->service) { + service_state = __connman_service_get_state(session->service); + state = service_to_session_state(service_state); + session->info->state = state; + } + session->info->state = state; + + DBG("session %p state %s", session, state2string(state)); + + update_routing_table(session); + session_notify(session); +} + +static bool session_match_service(struct connman_session *session, + struct connman_service *service) +{ + enum connman_service_type bearer_type; + enum connman_service_type service_type; + GSList *list; + + for (list = session->info->config.allowed_bearers; list; list = list->next) { + bearer_type = GPOINTER_TO_INT(list->data); + service_type = connman_service_get_type(service); + + if (bearer_type == service_type) + return true; + } + + return false; +} + +static bool is_session_connected(struct connman_session *session, + enum connman_service_state state) + +{ + switch (state) { + case CONNMAN_SERVICE_STATE_UNKNOWN: + case CONNMAN_SERVICE_STATE_IDLE: + case CONNMAN_SERVICE_STATE_ASSOCIATION: + case CONNMAN_SERVICE_STATE_CONFIGURATION: + case CONNMAN_SERVICE_STATE_DISCONNECT: + case CONNMAN_SERVICE_STATE_FAILURE: + break; + case CONNMAN_SERVICE_STATE_READY: + if (session->info->config.type == CONNMAN_SESSION_TYPE_INTERNET) + return false; + case CONNMAN_SERVICE_STATE_ONLINE: + return true; + } + + return false; +} + +static void session_activate(struct connman_session *session) { GHashTableIter iter; gpointer key, value; - struct connman_session *session; - DBG("service %p", service); - - g_hash_table_iter_init(&iter, session_hash); + if (!service_hash) + return; + g_hash_table_iter_init(&iter, service_hash); while (g_hash_table_iter_next(&iter, &key, &value)) { - session = value; + struct connman_service_info *info = value; + enum connman_service_state state; - if (!service_match(session, service)) - continue; + state = __connman_service_get_state(info->service); - if (g_hash_table_lookup(session->service_hash, service)) { - session->service_list = - g_list_sort_with_data(session->service_list, - sort_services, session); - } else { - session->service_list = - g_list_insert_sorted_with_data( - session->service_list, service, - sort_services, session); + if (is_session_connected(session, state) && + session_match_service(session, info->service)) { + DBG("session %p add service %p", session, info->service); - g_hash_table_replace(session->service_hash, - service, service); - } + info->sessions = g_slist_prepend(info->sessions, + session); + session->service = info->service; + update_session_state(session); - session_changed(session, CONNMAN_SESSION_TRIGGER_SERVICE); + return; + } } + + session_notify(session); +} + +static void session_deactivate(struct connman_session *session) +{ + struct connman_service_info *info; + + if (!service_hash) + return; + + if (!session->service) + return; + + info = g_hash_table_lookup(service_hash, session->service); + if (!info) + return; + + info->sessions = g_slist_remove(info->sessions, session); + session->service = NULL; + + session->info->state = CONNMAN_SESSION_STATE_DISCONNECTED; } -static void service_remove(struct connman_service *service) +static void handle_service_state_online(struct connman_service *service, + enum connman_service_state state, + struct connman_service_info *info) { GHashTableIter iter; gpointer key, value; - DBG("service %p", service); - g_hash_table_iter_init(&iter, session_hash); - while (g_hash_table_iter_next(&iter, &key, &value)) { struct connman_session *session = value; + bool connected; - if (!g_hash_table_lookup(session->service_hash, service)) - continue; + connected = is_session_connected(session, state); + + if (session->service == service) { + if (!connected) { + DBG("session %p remove service %p", session, service); + info->sessions = g_slist_remove(info->sessions, + session); + session->service = NULL; + update_session_state(session); + } + } else if (connected && session_match_service(session, service)) { + DBG("session %p add service %p", session, service); + + info->sessions = g_slist_prepend(info->sessions, + session); + session->service = service; + update_session_state(session); + } + } +} + +static void handle_service_state_offline(struct connman_service *service, + struct connman_service_info *info) +{ + GSList *list; - session->service_list = g_list_remove(session->service_list, - service); + for (list = info->sessions; list; list = list->next) { + struct connman_session *session = list->data; - g_hash_table_remove(session->service_hash, service); + if (session->service != service) { + connman_warn("session %p should have session %p assigned", + session, service); + continue; + } - if (session->service && session->service == service) - session->service = NULL; - session_changed(session, CONNMAN_SESSION_TRIGGER_SERVICE); + DBG("session %p remove service %p", session, service); + + session->service = NULL; + update_session_state(session); } } + static void service_state_changed(struct connman_service *service, - enum connman_service_state state) + enum connman_service_state state) { + struct connman_service_info *info; + DBG("service %p state %d", service, state); - if (is_connected(state)) - service_add(service, __connman_service_get_name(service)); - else if (is_disconnected(state)) - service_remove(service); + info = g_hash_table_lookup(service_hash, service); + + switch (state) { + case CONNMAN_SERVICE_STATE_UNKNOWN: + case CONNMAN_SERVICE_STATE_IDLE: + case CONNMAN_SERVICE_STATE_ASSOCIATION: + case CONNMAN_SERVICE_STATE_CONFIGURATION: + case CONNMAN_SERVICE_STATE_FAILURE: + case CONNMAN_SERVICE_STATE_DISCONNECT: + if (!info) + return; + + handle_service_state_offline(service, info); + + g_hash_table_remove(service_hash, service); + + return; + case CONNMAN_SERVICE_STATE_READY: + case CONNMAN_SERVICE_STATE_ONLINE: + if (!info) { + info = g_new0(struct connman_service_info, 1); + g_hash_table_replace(service_hash, service, info); + } + + info->service = service; + handle_service_state_online(service, state, info); + } } static void ipconfig_changed(struct connman_service *service, @@ -2198,6 +1666,8 @@ static void ipconfig_changed(struct connman_service *service, continue; if (session->service && session->service == service) { + update_routing_table(session); + if (type == CONNMAN_IPCONFIG_TYPE_IPV4) ipconfig_ipv4_changed(session); else if (type == CONNMAN_IPCONFIG_TYPE_IPV6) @@ -2212,16 +1682,6 @@ static struct connman_notifier session_notifier = { .ipconfig_changed = ipconfig_changed, }; -static int session_nfacct_flush_cb(unsigned int error, void *user_data) -{ - if (error == 0) - return 0; - - connman_error("Could not flush nfacct table: %s", strerror(error)); - - return -error; -} - int __connman_session_init(void) { int err; @@ -2241,11 +1701,12 @@ int __connman_session_init(void) session_hash = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, cleanup_session); + service_hash = g_hash_table_new_full(g_direct_hash, g_direct_equal, + NULL, cleanup_service); if (__connman_firewall_is_up()) { err = init_firewall(); if (err < 0) return err; - __connman_nfacct_flush(session_nfacct_flush_cb, NULL); } return 0; @@ -2265,6 +1726,8 @@ void __connman_session_cleanup(void) g_hash_table_foreach(session_hash, release_session, NULL); g_hash_table_destroy(session_hash); session_hash = NULL; + g_hash_table_destroy(service_hash); + service_hash = NULL; dbus_connection_unref(connection); } diff --git a/connman/src/shared/debugfs.c b/src/shared/debugfs.c similarity index 100% rename from connman/src/shared/debugfs.c rename to src/shared/debugfs.c diff --git a/connman/src/shared/debugfs.h b/src/shared/debugfs.h similarity index 100% rename from connman/src/shared/debugfs.h rename to src/shared/debugfs.h diff --git a/src/shared/nfacct.c b/src/shared/nfacct.c deleted file mode 100644 index 932bd704f..000000000 --- a/src/shared/nfacct.c +++ /dev/null @@ -1,352 +0,0 @@ -/* - * - * Connection Manager - * - * Copyright (C) 2013 BWM Car IT GmbH. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include -#include -#include -#include - -#include - -#include "src/shared/netlink.h" -#include "src/shared/nfacct.h" -#include "src/shared/nfnetlink_acct_copy.h" - -#define NFMSG_LEN(len) (NLMSG_HDRLEN + NLMSG_ALIGN(GENL_HDRLEN + (len))) -#define NFGEN_DATA(nlh) ((void *)((char *)(nlh) + \ - NLMSG_ALIGN(sizeof(struct nfgenmsg)))) -#define NLA_DATA(nla) ((void *)((char*)(nla) + NLA_HDRLEN)) -#define NLA_OK(nla,len) ((len) >= (int)sizeof(struct nlattr) && \ - (nla)->nla_len >= sizeof(struct nlattr) && \ - (nla)->nla_len <= (len)) -#define NLA_NEXT(nla,attrlen) ((attrlen) -= NLA_ALIGN((nla)->nla_len), \ - (struct nlattr*)(((char*)(nla)) + \ - NLA_ALIGN((nla)->nla_len))) -struct cb_data { - void *cb; - void *user_data; - void *data; -}; - -static inline struct cb_data *cb_data_new(void *cb, void *user_data) -{ - struct cb_data *ret; - - ret = g_new0(struct cb_data, 1); - ret->cb = cb; - ret->user_data = user_data; - - return ret; -} - -struct nfacct_info { - struct netlink_info *netlink; -}; - -struct nfacct_info *nfacct_new(void) -{ - struct nfacct_info *nfacct; - - nfacct = g_try_new0(struct nfacct_info, 1); - if (!nfacct) - return NULL; - - nfacct->netlink = netlink_new(NETLINK_NETFILTER); - if (!nfacct->netlink) { - g_free(nfacct); - return NULL; - } - - return nfacct; -} - -void nfacct_destroy(struct nfacct_info *nfacct) -{ - if (!nfacct) - return; - - netlink_destroy(nfacct->netlink); - - g_free(nfacct); -} - -static struct nfgenmsg *create_nfgenmsg(size_t size) -{ - struct nfgenmsg *msg; - - msg = g_try_malloc0(size); - if (!msg) - return NULL; - - msg->nfgen_family = AF_UNSPEC; - msg->version = NFNETLINK_V0; - msg->res_id = 0; - - return msg; -} - -static size_t attr_name_size(const char *name) -{ - size_t size; - - if (!name) - return 0; - - size = strlen(name) + 1; - if (size > NFACCT_NAME_MAX) - size = NFACCT_NAME_MAX; - - return size; -} - -static size_t calc_msg_size(const char *name) -{ - return NFMSG_LEN(NLA_HDRLEN + attr_name_size(name)); -} - -static int set_attr_name(struct nfgenmsg *msg, const char *name) -{ - struct nlattr *attr = NFGEN_DATA(msg); - char *dst; - size_t size; - - size = attr_name_size(name); - - attr->nla_len = NLA_HDRLEN + size; - attr->nla_type = NFACCT_NAME; - - dst = (char *)NLA_DATA(attr); - strncpy(dst, name, size); - dst[size - 1] = '\0'; - - return 0; -} - -static void nfacct_add_callback(unsigned int error, uint16_t type, const void *data, - uint32_t len, void *user_data) -{ - struct cb_data *cbd = user_data; - nfacct_add_func_t callback = cbd->cb; - - callback(error, cbd->user_data); - - g_free(cbd); -} - -unsigned int nfacct_add(struct nfacct_info *nfacct, const char *name, - nfacct_add_func_t function, - void *user_data) -{ - struct cb_data *cbd = cb_data_new(function, user_data); - struct nfgenmsg *msg; - size_t len; - unsigned id; - - len = calc_msg_size(name); - msg = create_nfgenmsg(len); - if (!msg) - return 0; - - set_attr_name(msg, name); - - id = netlink_send(nfacct->netlink, - NFNL_SUBSYS_ACCT << 8 | NFNL_MSG_ACCT_NEW, - NLM_F_CREATE | NLM_F_ACK, msg, len, - nfacct_add_callback, cbd, NULL); - if (id == 0) - g_free(cbd); - - g_free(msg); - - return id; -} - -static void parse_nlattr_acct(const struct nlattr *attr, - char **name, uint64_t *packets, uint64_t *bytes) -{ - switch (attr->nla_type) { - case NFACCT_NAME: - *name = NLA_DATA(attr); - break; - case NFACCT_PKTS: - *packets = be64toh(*(uint64_t *) NLA_DATA(attr)); - break; - case NFACCT_BYTES: - *bytes = be64toh(*(uint64_t *) NLA_DATA(attr)); - break; - case NFACCT_USE: - /* ignored */ - break; - } -} - -static void nfacct_dump_callback(unsigned int error, uint16_t type, const void *data, - uint32_t len, void *user_data) -{ - struct cb_data *cbd = user_data; - nfacct_dump_func_t callback = cbd->cb; - const struct nlattr *attr; - uint64_t packets = 0, bytes = 0; - char *name = NULL; - - if (error != 0) - goto done; - - for (attr = NFGEN_DATA(data); NLA_OK(attr, len); - attr = NLA_NEXT(attr, len)) - parse_nlattr_acct(attr, &name, &packets, &bytes); - -done: - callback(error, name, packets, bytes, cbd->user_data); - - if (type < NLMSG_MIN_TYPE) - g_free(cbd); -} - -unsigned int nfacct_dump(struct nfacct_info *nfacct, bool zero, - nfacct_dump_func_t function, void *user_data) -{ - struct cb_data *cbd = cb_data_new(function, user_data); - struct nfgenmsg *msg; - uint16_t cmd; - size_t len; - unsigned id; - - len = calc_msg_size(NULL); - msg = create_nfgenmsg(len); - if (!msg) - return 0; - - if (zero == false) - cmd = NFNL_MSG_ACCT_GET; - else - cmd = NFNL_MSG_ACCT_GET_CTRZERO; - - id = netlink_send(nfacct->netlink, - NFNL_SUBSYS_ACCT << 8 | cmd, - NLM_F_DUMP, msg, len, - nfacct_dump_callback, cbd, NULL); - if (id == 0) - g_free(cbd); - - g_free(msg); - - return id; -} - -static void nfacct_get_callback(unsigned int error, uint16_t type, const void *data, - uint32_t len, void *user_data) -{ - struct cb_data *cbd = user_data; - nfacct_get_func_t callback = cbd->cb; - const struct nlattr *attr; - uint64_t packets = 0, bytes = 0; - char *name = NULL; - - if (error != 0) - goto done; - - for (attr = NFGEN_DATA(data); NLA_OK(attr, len); - attr = NLA_NEXT(attr, len)) - parse_nlattr_acct(attr, &name, &packets, &bytes); - -done: - callback(error, name, packets, bytes, cbd->user_data); - - if (type < NLMSG_MIN_TYPE) - g_free(cbd); -} - -unsigned int nfacct_get(struct nfacct_info *nfacct, const char *name, bool zero, - nfacct_get_func_t function, void *user_data) -{ - struct cb_data *cbd = cb_data_new(function, user_data); - struct nfgenmsg *msg; - uint16_t cmd; - size_t len; - unsigned id; - - len = calc_msg_size(name); - msg = create_nfgenmsg(len); - if (!msg) - return 0; - - set_attr_name(msg, name); - - if (zero == false) - cmd = NFNL_MSG_ACCT_GET; - else - cmd = NFNL_MSG_ACCT_GET_CTRZERO; - - id = netlink_send(nfacct->netlink, - NFNL_SUBSYS_ACCT << 8 | cmd, - NLM_F_ACK, msg, len, - nfacct_get_callback, cbd, NULL); - if (id == 0) - g_free(cbd); - - g_free(msg); - - return id; -} - -static void nfacct_del_callback(unsigned int error, uint16_t type, const void *data, - uint32_t len, void *user_data) -{ - struct cb_data *cbd = user_data; - nfacct_del_func_t callback = cbd->cb; - - callback(error, cbd->user_data); - - g_free(cbd); -} - -unsigned int nfacct_del(struct nfacct_info *nfacct, const char *name, - nfacct_del_func_t function, void *user_data) -{ - struct cb_data *cbd = cb_data_new(function, user_data); - struct nfgenmsg *msg; - size_t len; - unsigned id; - - len = calc_msg_size(name); - msg = create_nfgenmsg(len); - if (!msg) - return 0; - - set_attr_name(msg, name); - - id = netlink_send(nfacct->netlink, - NFNL_SUBSYS_ACCT << 8 | NFNL_MSG_ACCT_DEL, - NLM_F_ACK, msg, len, - nfacct_del_callback, cbd, NULL); - if (id == 0) - g_free(cbd); - - g_free(msg); - - return id; -} diff --git a/src/shared/nfacct.h b/src/shared/nfacct.h deleted file mode 100644 index 6fc46ce53..000000000 --- a/src/shared/nfacct.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * - * Connection Manager - * - * Copyright (C) 2013 BMW Car IT GmbH. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include -#include - -typedef void (*nfacct_add_func_t) (unsigned int error, void *user_data); -typedef void (*nfacct_get_func_t) (unsigned int error, const char *name, - uint64_t packets, uint64_t bytes, - void *user_data); -typedef void (*nfacct_dump_func_t) (unsigned int error, const char *name, - uint64_t packets, uint64_t bytes, - void *user_data); -typedef void (*nfacct_del_func_t) (unsigned int error, void *user_data); - -struct nfacct_info; - -struct nfacct_info *nfacct_new(void); -void nfacct_destroy(struct nfacct_info *nfacct); - -unsigned int nfacct_add(struct nfacct_info *nfacct, const char *name, - nfacct_add_func_t function, - void *user_data); -unsigned int nfacct_dump(struct nfacct_info *nfacct, bool zero, - nfacct_dump_func_t function, void *user_data); -unsigned int nfacct_get(struct nfacct_info *nfacct, const char *name, bool zero, - nfacct_get_func_t function, void *user_data); -unsigned int nfacct_del(struct nfacct_info *nfacct, const char *name, - nfacct_del_func_t function, void *user_data); diff --git a/src/shared/nfnetlink_acct_copy.h b/src/shared/nfnetlink_acct_copy.h deleted file mode 100644 index 9cc80bcee..000000000 --- a/src/shared/nfnetlink_acct_copy.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * include/uapi/linux/netfilter/nfnetlink_acct.h - * Copyright (C) 2011 Pablo Neira Ayuso - * - * This source code is licensed under the GNU General Public License, - * Version 2. See the file COPYING for more details. - */ - -#ifndef _UAPI_NFNL_ACCT_H_ -#define _UAPI_NFNL_ACCT_H_ - -#ifndef NFNL_SUBSYS_ACCT -#define NFNL_SUBSYS_ACCT 7 -#endif - -#ifndef NFACCT_NAME_MAX -#define NFACCT_NAME_MAX 32 -#endif - -enum nfnl_acct_msg_types { - NFNL_MSG_ACCT_NEW, - NFNL_MSG_ACCT_GET, - NFNL_MSG_ACCT_GET_CTRZERO, - NFNL_MSG_ACCT_DEL, - NFNL_MSG_ACCT_MAX -}; - -enum nfnl_acct_type { - NFACCT_UNSPEC, - NFACCT_NAME, - NFACCT_PKTS, - NFACCT_BYTES, - NFACCT_USE, - __NFACCT_MAX -}; -#define NFACCT_MAX (__NFACCT_MAX - 1) - - -#endif /* _UAPI_NFNL_ACCT_H_ */ diff --git a/connman/src/shared/sha1.c b/src/shared/sha1.c similarity index 100% rename from connman/src/shared/sha1.c rename to src/shared/sha1.c diff --git a/connman/src/shared/sha1.h b/src/shared/sha1.h similarity index 100% rename from connman/src/shared/sha1.h rename to src/shared/sha1.h diff --git a/connman/src/shared/util.c b/src/shared/util.c similarity index 100% rename from connman/src/shared/util.c rename to src/shared/util.c diff --git a/connman/src/shared/util.h b/src/shared/util.h similarity index 100% rename from connman/src/shared/util.h rename to src/shared/util.h diff --git a/connman/src/stats.c b/src/stats.c similarity index 77% rename from connman/src/stats.c rename to src/stats.c index f83f35f80..df5ab4eb8 100644 --- a/connman/src/stats.c +++ b/src/stats.c @@ -34,7 +34,6 @@ #include #include #include -#include #include "connman.h" @@ -47,8 +46,7 @@ #define TFR #endif -#define MAGIC32 0xFA00B916 -#define MAGIC64 0xFA01B916 +#define MAGIC 0xFA00B916 /* * Statistics counters are stored into a ring buffer which is stored @@ -102,24 +100,6 @@ struct stats_record { struct connman_stats_data data; }; -struct connman_stats_data32 { - unsigned int rx_packets; - unsigned int tx_packets; - unsigned int rx_bytes; - unsigned int tx_bytes; - unsigned int rx_errors; - unsigned int tx_errors; - unsigned int rx_dropped; - unsigned int tx_dropped; - unsigned int time; -}; - -struct stats_record32 { - time_t ts; - unsigned int roaming; - struct connman_stats_data32 data; -}; - struct stats_file { int fd; char *name; @@ -145,16 +125,7 @@ struct stats_iter { struct stats_record *it; }; -struct stats_iter32 { - struct stats_file *file; - struct stats_record32 *begin; - struct stats_record32 *end; - struct stats_record32 *it; -}; - -static void stats_convert(struct stats_file *file); - -GHashTable *stats_hash = NULL; +static GHashTable *stats_hash = NULL; static struct stats_file_header *get_hdr(struct stats_file *file) { @@ -168,13 +139,6 @@ static struct stats_record *get_begin(struct stats_file *file) return (struct stats_record *)(file->addr + off); } -static struct stats_record32 *get_begin32(struct stats_file *file) -{ - unsigned int off = get_hdr(file)->begin; - - return (struct stats_record32 *)(file->addr + off); -} - static struct stats_record *get_end(struct stats_file *file) { unsigned int off = get_hdr(file)->end; @@ -182,13 +146,6 @@ static struct stats_record *get_end(struct stats_file *file) return (struct stats_record *)(file->addr + off); } -static struct stats_record32 *get_end32(struct stats_file *file) -{ - unsigned int off = get_hdr(file)->end; - - return (struct stats_record32 *)(file->addr + off); -} - static struct stats_record *get_home(struct stats_file *file) { struct stats_file_header *hdr; @@ -248,36 +205,16 @@ static struct stats_record *get_next(struct stats_file *file, return cur; } -static struct stats_record32 *get_next32(struct stats_file *file, struct stats_record32 *cur) -{ - cur++; - - if (cur > (struct stats_record32 *)file->last) - cur = (struct stats_record32 *)file->first; - - return cur; -} - static struct stats_record *get_iterator_begin(struct stats_file *file) { return get_next(file, get_begin(file)); } -static struct stats_record32 *get_iterator_begin32(struct stats_file *file) -{ - return get_next32(file, get_begin32(file)); -} - static struct stats_record *get_iterator_end(struct stats_file *file) { return get_next(file, get_end(file)); } -static struct stats_record32 *get_iterator_end32(struct stats_file *file) -{ - return get_next32(file, get_end32(file)); -} - static void stats_free(gpointer user_data) { struct stats_file *file = user_data; @@ -321,15 +258,6 @@ static void update_last(struct stats_file *file) file->last = file->first + max_entries - 1; } -static void update_last32(struct stats_file *file) -{ - unsigned int max_entries; - - max_entries = (file->len - sizeof(struct stats_file_header)) / - sizeof(struct stats_record32); - file->last = file->first + max_entries - 1; -} - static void update_home(struct stats_file *file) { file->home = get_home(file); @@ -348,14 +276,6 @@ static void stats_file_update_cache(struct stats_file *file) update_roaming(file); } -static void stats_file_update_cache32(struct stats_file *file) -{ - update_first(file); - update_last32(file); - update_home(file); - update_roaming(file); -} - static int stats_file_remap(struct stats_file *file, size_t size) { size_t page_size, new_size; @@ -403,10 +323,7 @@ static int stats_file_remap(struct stats_file *file, size_t size) file->addr = addr; file->len = new_size; - if (get_hdr(file)->magic == MAGIC32) - stats_file_update_cache32(file); - else - stats_file_update_cache(file); + stats_file_update_cache(file); return 0; } @@ -484,27 +401,14 @@ static int stats_file_setup(struct stats_file *file) hdr = get_hdr(file); - /* Check if data file is in old format and convert */ - if (hdr->magic == MAGIC32 && - hdr->begin >= sizeof(struct stats_file_header) && - hdr->end >= sizeof(struct stats_file_header) && - hdr->home >= sizeof(struct stats_file_header) && - hdr->roaming >= sizeof(struct stats_file_header) && - hdr->begin <= file->len && - hdr->end <= file->len) { - stats_convert(file); - /* conversion changes the mapped address */ - hdr = get_hdr(file); - } - - if (hdr->magic != MAGIC64 || + if (hdr->magic != MAGIC || hdr->begin < sizeof(struct stats_file_header) || hdr->end < sizeof(struct stats_file_header) || hdr->home < sizeof(struct stats_file_header) || hdr->roaming < sizeof(struct stats_file_header) || hdr->begin > file->len || hdr->end > file->len) { - hdr->magic = MAGIC64; + hdr->magic = MAGIC; hdr->begin = sizeof(struct stats_file_header); hdr->end = sizeof(struct stats_file_header); hdr->home = UINT_MAX; @@ -531,20 +435,6 @@ static struct stats_record *get_next_record(struct stats_iter *iter) return NULL; } -static struct stats_record32 *get_next_record32(struct stats_iter32 *iter) -{ - if (iter->it != iter->end) { - struct stats_record32 *tmp; - - tmp = iter->it; - iter->it = get_next32(iter->file, iter->it); - - return tmp; - } - - return NULL; -} - static int append_record(struct stats_file *file, struct stats_record *rec) { @@ -589,9 +479,9 @@ static struct stats_record *process_file(struct stats_iter *iter, while (next) { GDate date_cur; GDate date_next; - int append; + bool append; - append = FALSE; + append = false; if (cur->roaming) roaming = cur; @@ -613,15 +503,15 @@ static struct stats_record *process_file(struct stats_iter *iter, day_next = g_date_get_day(&date_next); if (day_cur == day_next && month_cur != month_next) { - append = TRUE; + append = true; } else if (day_cur < account_period_offset && day_next >= account_period_offset) { - append = TRUE; + append = true; } } else { /* day period size */ if (g_date_days_between(&date_cur, &date_next) > 0) - append = TRUE; + append = true; } if (append) { @@ -778,95 +668,6 @@ static int stats_file_history_update(struct stats_file *data_file) return err; } -static void stats_convert(struct stats_file *file) -{ - struct stats_file temp_file; - int err; - - DBG("converting data file %s", file->name); - - stats_file_update_cache32(file); - - bzero(&temp_file, sizeof(struct stats_file)); - - err = stats_open_temp(&temp_file); - if (err < 0) { - connman_error("failed to open temporary file during data conversion"); - return; - } - stats_file_setup(&temp_file); - - struct stats_iter32 data_iter; - struct stats_record32 *record; - - data_iter.file = file; - data_iter.begin = get_iterator_begin32(data_iter.file); - data_iter.end = get_iterator_end32(data_iter.file); - data_iter.it = data_iter.begin; - - record = get_next_record32(&data_iter); - while (record) { - struct stats_record *next; - - if (temp_file.last == get_end(&temp_file)) { - err = stats_file_remap(&temp_file, temp_file.len + sysconf(_SC_PAGESIZE)); - if (err < 0) { - connman_error("failed to extend file %s", temp_file.name); - unlink(temp_file.name); - stats_file_unmap(&temp_file); - TFR(close(temp_file.fd)); - stats_file_cleanup(&temp_file); - return; - } - - stats_file_update_cache(&temp_file); - } - - next = get_next(&temp_file, get_end(&temp_file)); - if (next == get_begin(&temp_file)) { - connman_error("ring buffer is full"); - unlink(temp_file.name); - stats_file_unmap(&temp_file); - TFR(close(temp_file.fd)); - stats_file_cleanup(&temp_file); - return; - } - - next->ts = record->ts; - next->roaming = record->roaming; - next->data.rx_packets = record->data.rx_packets; - next->data.tx_packets = record->data.tx_packets; - next->data.rx_bytes = record->data.rx_bytes; - next->data.tx_bytes = record->data.tx_bytes; - next->data.rx_errors = record->data.rx_errors; - next->data.tx_errors = record->data.tx_errors; - next->data.rx_dropped = record->data.rx_dropped; - next->data.tx_dropped = record->data.tx_dropped; - next->data.time = record->data.time; - - if (next->roaming) - set_roaming(&temp_file, next); - else - set_home(&temp_file, next); - - set_end(&temp_file, next); - - record = get_next_record32(&data_iter); - } - - // close and swap - stats_file_unmap(file); - TFR(close(file->fd)); - err = rename(temp_file.name, file->name); - if (err < 0) - connman_error("failed to rename converted data file %s to %s", temp_file.name, file->name); - - g_free(temp_file.name); - temp_file.name = file->name; - - memcpy(file, &temp_file, sizeof(struct stats_file)); -} - int __connman_stats_service_register(struct connman_service *service) { struct stats_file *file; diff --git a/connman/src/storage.c b/src/storage.c similarity index 100% rename from connman/src/storage.c rename to src/storage.c diff --git a/connman/src/task.c b/src/task.c similarity index 100% rename from connman/src/task.c rename to src/task.c diff --git a/connman/src/technology.c b/src/technology.c similarity index 98% rename from connman/src/technology.c rename to src/technology.c index 656ca8d23..28f0ff422 100644 --- a/connman/src/technology.c +++ b/src/technology.c @@ -528,7 +528,6 @@ bool __connman_technology_get_offlinemode(void) static void connman_technology_save_offlinemode(void) { - DBG("enter"); GKeyFile *keyfile; keyfile = __connman_storage_load_global(); @@ -565,7 +564,6 @@ static bool connman_technology_load_offlinemode(void) g_key_file_free(keyfile); - DBG("offlinemode: %i", offlinemode); return offlinemode; } @@ -715,7 +713,6 @@ static int technology_affect_devices(struct connman_technology *technology, err = __connman_device_enable(device); else err = __connman_device_disable(device); - DBG("tech: %i, err: %i", technology->type, err); } return err; @@ -1337,7 +1334,7 @@ int __connman_technology_add_device(struct connman_device *device) __sync_synchronize(); if (technology->rfkill_driven) { - if (technology->enabled && !global_offlinemode) + if (technology->enabled) __connman_device_enable(device); else __connman_device_disable(device); @@ -1421,7 +1418,6 @@ static void powered_changed(struct connman_technology *technology) static int technology_enabled(struct connman_technology *technology) { - DBG(""); __sync_synchronize(); if (technology->enabled) return -EALREADY; @@ -1459,7 +1455,6 @@ int __connman_technology_enabled(enum connman_service_type type) static int technology_disabled(struct connman_technology *technology) { - DBG(""); __sync_synchronize(); if (!technology->enabled) return -EALREADY; @@ -1499,10 +1494,19 @@ int __connman_technology_set_offlinemode(bool offlinemode) int err = -EINVAL, enabled_tech_count = 0; if (global_offlinemode == offlinemode) - return; + return 0; DBG("offlinemode %s", offlinemode ? "On" : "Off"); + /* + * This is a bit tricky. When you set offlinemode, there is no + * way to differentiate between attempting offline mode and + * resuming offlinemode from last saved profile. We need that + * information in rfkill_update, otherwise it falls back on the + * technology's persistent state. Hence we set the offline mode here + * but save it & call the notifier only if its successful. + */ + global_offlinemode = offlinemode; /* Traverse technology list, enable/disable each technology. */ @@ -1515,8 +1519,7 @@ int __connman_technology_set_offlinemode(bool offlinemode) if (technology->hardblocked) continue; - if (!offlinemode && (technology->enable_persistent || - technology->type == CONNMAN_SERVICE_TYPE_CELLULAR)) + if (technology->enable_persistent) { err = technology_enable(technology); enabled_tech_count++; } @@ -1525,8 +1528,8 @@ int __connman_technology_set_offlinemode(bool offlinemode) if (err == 0 || err == -EINPROGRESS || err == -EALREADY || (err == -EINVAL && enabled_tech_count == 0)) { - connman_technology_save_offlinemode(); - __connman_notifier_offlinemode(offlinemode); + connman_technology_save_offlinemode(); + __connman_notifier_offlinemode(offlinemode); } else global_offlinemode = connman_technology_load_offlinemode(); diff --git a/connman/src/tethering.c b/src/tethering.c similarity index 100% rename from connman/src/tethering.c rename to src/tethering.c diff --git a/connman/src/timeserver.c b/src/timeserver.c similarity index 100% rename from connman/src/timeserver.c rename to src/timeserver.c diff --git a/connman/src/timezone.c b/src/timezone.c similarity index 100% rename from connman/src/timezone.c rename to src/timezone.c diff --git a/connman/src/utsname.c b/src/utsname.c similarity index 100% rename from connman/src/utsname.c rename to src/utsname.c diff --git a/connman/src/wispr.c b/src/wispr.c similarity index 99% rename from connman/src/wispr.c rename to src/wispr.c index 62abdb0a5..59379b8d3 100644 --- a/connman/src/wispr.c +++ b/src/wispr.c @@ -30,6 +30,9 @@ #include "connman.h" +#define STATUS_URL_IPV4 "http://ipv4.connman.net/online/status.html" +#define STATUS_URL_IPV6 "http://ipv6.connman.net/online/status.html" + struct connman_wispr_message { bool has_error; const char *current_element; @@ -644,7 +647,7 @@ static bool wispr_manage_message(GWebResult *result, wp_context) != -EINPROGRESS) wispr_portal_error(wp_context); else - return TRUE; + return true; break; case 120: /* Falling down */ @@ -827,12 +830,12 @@ static int wispr_portal_detect(struct connman_wispr_portal_context *wp_context) case CONNMAN_SERVICE_TYPE_WIFI: case CONNMAN_SERVICE_TYPE_BLUETOOTH: case CONNMAN_SERVICE_TYPE_CELLULAR: + case CONNMAN_SERVICE_TYPE_GADGET: break; case CONNMAN_SERVICE_TYPE_UNKNOWN: case CONNMAN_SERVICE_TYPE_SYSTEM: case CONNMAN_SERVICE_TYPE_GPS: case CONNMAN_SERVICE_TYPE_VPN: - case CONNMAN_SERVICE_TYPE_GADGET: return -EOPNOTSUPP; } @@ -868,11 +871,10 @@ static int wispr_portal_detect(struct connman_wispr_portal_context *wp_context) if (wp_context->type == CONNMAN_IPCONFIG_TYPE_IPV4) { g_web_set_address_family(wp_context->web, AF_INET); - wp_context->status_url = connman_option_get_string(CONF_STATUS_URL_IPV4); - + wp_context->status_url = STATUS_URL_IPV4; } else { g_web_set_address_family(wp_context->web, AF_INET6); - wp_context->status_url = connman_option_get_string(CONF_STATUS_URL_IPV6); + wp_context->status_url = STATUS_URL_IPV6; } for (i = 0; nameservers[i]; i++) diff --git a/connman/src/wpad.c b/src/wpad.c similarity index 100% rename from connman/src/wpad.c rename to src/wpad.c diff --git a/connman/test/backtrace b/test/backtrace similarity index 100% rename from connman/test/backtrace rename to test/backtrace diff --git a/connman/test/connect-provider b/test/connect-provider similarity index 100% rename from connman/test/connect-provider rename to test/connect-provider diff --git a/connman/test/disable-tethering b/test/disable-tethering similarity index 100% rename from connman/test/disable-tethering rename to test/disable-tethering diff --git a/connman/test/enable-tethering b/test/enable-tethering similarity index 100% rename from connman/test/enable-tethering rename to test/enable-tethering diff --git a/connman/test/get-global-timeservers b/test/get-global-timeservers similarity index 100% rename from connman/test/get-global-timeservers rename to test/get-global-timeservers diff --git a/connman/test/get-proxy-autoconfig b/test/get-proxy-autoconfig similarity index 100% rename from connman/test/get-proxy-autoconfig rename to test/get-proxy-autoconfig diff --git a/connman/test/get-services b/test/get-services similarity index 100% rename from connman/test/get-services rename to test/get-services diff --git a/connman/test/get-state b/test/get-state similarity index 100% rename from connman/test/get-state rename to test/get-state diff --git a/connman/test/list-services b/test/list-services similarity index 100% rename from connman/test/list-services rename to test/list-services diff --git a/connman/test/monitor-connman b/test/monitor-connman similarity index 100% rename from connman/test/monitor-connman rename to test/monitor-connman diff --git a/connman/test/monitor-services b/test/monitor-services similarity index 100% rename from connman/test/monitor-services rename to test/monitor-services diff --git a/connman/test/monitor-vpn b/test/monitor-vpn similarity index 100% rename from connman/test/monitor-vpn rename to test/monitor-vpn diff --git a/test/p2p-on-supplicant b/test/p2p-on-supplicant new file mode 100755 index 000000000..2bb02bada --- /dev/null +++ b/test/p2p-on-supplicant @@ -0,0 +1,396 @@ +#!/usr/bin/python + +from os import O_NONBLOCK +from sys import stdin, stdout, exit, version_info +from fcntl import fcntl, F_GETFL, F_SETFL +import glib +import dbus +import dbus.mainloop.glib +import gobject + +WPA_NAME='fi.w1.wpa_supplicant1' +WPA_INTF='fi.w1.wpa_supplicant1' +WPA_PATH='/fi/w1/wpa_supplicant1' +WPA_IF_INTF = WPA_INTF + '.Interface' +WPA_P2P_INTF = WPA_IF_INTF + '.P2PDevice' +WPA_PEER_INTF = WPA_INTF + '.Peer' +DBUS_PROPERTIES_INTF = 'org.freedesktop.DBus.Properties' + +class InputLine: + def __init__(self, handler): + self.line = '' + self.handler = handler + + flags = fcntl(stdin.fileno(), F_GETFL) + flags |= O_NONBLOCK + fcntl(stdin.fileno(), F_SETFL, flags) + glib.io_add_watch(stdin, glib.IO_IN, self.input_cb) + + self.prompt() + + def prompt(self): + self.line = '' + print '> ', + stdout.flush() + + def input_cb(self, fd, event): + if event != glib.IO_IN: + return + + self.line += fd.read(); + for line in self.line.split('\n'): + line = line.strip() + if len(line) == 0: + break + + self.handler(line.strip()) + + self.prompt() + + return True + +def error_print(ex): + print 'Command Error: %s' % ex + +def checkarg(nb_args = 0, min_args = False): + def under(function): + def wrapper(*args, **kwargs): + resuls = True + + if min_args: + result = len(args[1]) < nb_args + else: + result = len(args[1]) != nb_args + + if result: + raise Exception('Command %s takes %s arguments' % + (function.__name__, nb_args)) + return function(*args, **kwargs) + return wrapper + return under + +class Wpa_s: + def __init__(self, iface_name = None): + self.wpa = dbus.Interface(bus.get_object(WPA_NAME, WPA_PATH), WPA_INTF) + bus.add_signal_receiver(self.__wpa_property_changed, path=WPA_PATH, + member_keyword='signal') + self.__reset() + + self.line_in = InputLine(self.__command) + + if self.iface_name != None: + self.create_if(self.iface_name) + + def help(self, args): + print 'Commands:' + print 'quit' + print 'create_if ' + print 'get_if ' + print 'del_if' + print 'scan' + print 'p2p_find' + print 'p2p_stop_find' + print 'p2p_flush' + print 'p2p_group_add' + print 'p2p_group_remove' + print 'p2p_peers' + print 'p2p_peer ' + print 'p2p_connect ' + print 'p2p_serv_disc_req' + print 'p2p_serv_disc_cancel_req ' + print 'p2p_service_add ' + print 'p2p_service_del []' + print 'p2p_service_flush' + + def __command(self, cmd_line): + cmd = cmd_line.split(' ') + + try: + func = getattr(self, cmd[0]) + except Exception, e: + print 'Error: command unknown - %s' % e + return + + try: + func(cmd[1:]) + except Exception, e: + error_print(e) + + def __wpa_property_changed(*args, **kwargs): + print 'WPA - Signal: %s' % kwargs.get('signal') + + def __if_property_changed(*args, **kwargs): + print 'IF - Signal: %s' % kwargs.get('signal') + + def __p2p_property_changed(*args, **kwargs): + signal = kwargs.get('signal') + print 'IF P2P - Signal: %s' % signal + + """ + It should be: __DeviceFound(self, object_path, properties) + wpa_supplicant's DBus API is buggy here: + - no properties are given + """ + def __DeviceFound(self, object_path): + self.peers[object_path] = None + + peer = bus.get_object(WPA_INTF, object_path) + peer_if = dbus.Interface(peer, DBUS_PROPERTIES_INTF) + + self.peers[object_path] = peer_if.GetAll(WPA_PEER_INTF) + + def __DeviceLost(self, object_path): + if object_path in self.peers: + del self.peers[object_path] + + """ + "Of course"... properties are not the group's properties, + but a bunch of informations related to the group: + - object path of the interface object + - it's role + - object path of the group object + """ + def __GroupStarted(self, properties): + self.group = properties + self.group_if = dbus.Interface(bus.get_object(WPA_INTF, + self.group['interface_object']), + WPA_P2P_INTF) + + def __ServiceDiscoveryResponse(self, response): + peer = response['peer_object'] + if peer in self.peers: + print 'Peer %s has this TLVs:' % (self.peers[peer]['DeviceName']) + print response['tlvs'] + + def __listen_if_signals(self): + bus.add_signal_receiver(self.__if_property_changed, + dbus_interface=WPA_IF_INTF, + path=self.iface_path, + member_keyword='signal') + bus.add_signal_receiver(self.__p2p_property_changed, + dbus_interface=WPA_P2P_INTF, + path=self.iface_path, + member_keyword='signal') + bus.add_signal_receiver(self.__GroupStarted, + dbus_interface=WPA_P2P_INTF, + path=self.iface_path, + signal_name='GroupStarted') + bus.add_signal_receiver(self.__DeviceFound, + dbus_interface=WPA_P2P_INTF, + path=self.iface_path, + signal_name='DeviceFound') + bus.add_signal_receiver(self.__DeviceLost, + dbus_interface=WPA_P2P_INTF, + path=self.iface_path, + signal_name='DeviceLost') + bus.add_signal_receiver(self.__ServiceDiscoveryResponse, + dbus_interface=WPA_P2P_INTF, + path=self.iface_path, + signal_name='ServiceDiscoveryResponse') + + def __reset(self): + self.iface_path = self.iface_name = self.iface = None + self.p2p = self.group = self.group_if = None + self.peers = {} + + def __set_if(self, iface_name): + self.iface = dbus.Interface(bus.get_object(WPA_INTF, + self.iface_path), WPA_IF_INTF) + self.p2p = dbus.Interface(bus.get_object(WPA_INTF, + self.iface_path), WPA_P2P_INTF) + + print 'Interface %s: %s' % (iface_name, self.iface_path) + self.iface_name = iface_name + self.__listen_if_signals() + + @checkarg(nb_args=1) + def create_if(self, args): + self.__reset() + self.iface_path = self.wpa.CreateInterface(({ 'Ifname' : args[0]} )) + self.__set_if(args[0]) + + @checkarg(nb_args=1) + def get_if(self, args): + self.__reset() + self.iface_path = self.wpa.GetInterface(args[0]) + self.__set_if(args[0]) + + @checkarg() + def del_if(self, args = None): + if not self.iface_path: + return + + self.wpa.RemoveInterface(self.iface_path) + print 'Interface %s removed' % self.iface_name + self.__reset() + + @checkarg() + def scan(self, args = None): + if not self.iface: + return + + self.iface.Scan(({ 'Type': 'passive' })) + print 'Scan started' + + @checkarg() + def quit(self, args = None): + self.del_if(args) + exit(0) + + @checkarg() + def p2p_find(self, args = None): + if not self.p2p: + return + + self.p2p.Find(({})) + + @checkarg() + def p2p_stop_find(self, args = None): + if not self.p2p: + return + + self.p2p.StopFind() + + @checkarg() + def p2p_peers(self, args = None): + if not self.iface: + return + + for p in self.peers: + print 'Peer Name=%s' % (self.peers[p]['DeviceName']) + + def __find_peer(self, peer_name, ret_object_path = False): + if len(self.peers) == 0: + return None + + peer = None + for p in self.peers: + if self.peers[p]['DeviceName'] == peer_name: + peer = self.peers[p] + break + + if not peer: + print 'No peer found under the name: %s' % peer_name + p = None + + if ret_object_path: + return p + else: + return peer + + @checkarg(nb_args = 1) + def p2p_peer(self, args): + peer = self.__find_peer(args[0]) + if peer: + for k in peer: + print '%s = %s' % (k, peer[k]) + + @checkarg(nb_args = 1) + def p2p_connect(self, args): + if not self.p2p: + return + + peer = self.__find_peer(args[0], True) + if peer: + pin = self.p2p.Connect(({ 'peer' : peer, + 'wps_method' : 'pbc'})) + if not pin: + print 'WPS PIN in use: %s' % pin + + @checkarg() + def p2p_group_add(self, args): + if not self.p2p: + return + + self.p2p.GroupAdd(({ 'persistent' : dbus.Boolean(1) })) + + @checkarg() + def p2p_group_remove(self, args): + if not self.group_if: + return + + self.group_if.Disconnect() + + @checkarg() + def p2p_flush(self, args): + if not self.p2p: + return + + self.p2p.Flush() + + @checkarg() + def p2p_serv_disc_req(self, args = None): + if not self.p2p: + return + + """ We request all kind of services """ + sd_req = dbus.Array(signature='y', variant_level=1) + for a in [2,0,0,1]: + sd_req.append(dbus.Byte(a)) + + ref = self.p2p.ServiceDiscoveryRequest(({ 'tlv' : sd_req })) + print 'Service discovery reference: %s' % ref + + @checkarg(nb_args = 1) + def p2p_serv_disc_cancel_req(self, args): + if not self.p2p: + return + + self.p2p.ServiceDiscoveryCancelRequest(int(args[0])) + + @checkarg(nb_args = 3) + def p2p_service_add(self, args): + if not self.p2p: + return + + service = { 'service_type' : args[0] } + if args[0] == 'upnp': + service['version'] = args[1] + service['service'] = args[2] + elif args[0] == 'bonjour': + service['query'] = args[1] + service['response'] = args[2] + else: + print 'Unknown service: %s' % args[0] + return + + self.p2p.AddService((service)) + + @checkarg(nb_args = 2, min_args = True) + def p2p_service_del(self, args): + if not self.p2p: + return + + service = { 'service_type' : args[0] } + if args[0] == 'upnp': + service['version'] = args[1] + service['service'] = args[2] + elif args[0] == 'bonjour': + service['query'] = args[1] + else: + print 'Unknown service: %s' % args[0] + return + + self.p2p.DeleteService((service)) + + @checkarg() + def p2p_service_flush(self, args = None) + if not self.p2p: + return + + self.p2p.FlushService() + +if __name__ == '__main__': + if version_info.major != 2: + print 'You need to run this under Python 2.x' + exit(1) + + dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) + + bus = dbus.SystemBus() + + mainloop = gobject.MainLoop() + + wpa_s = Wpa_s() + + mainloop.run() diff --git a/connman/test/remove-provider b/test/remove-provider similarity index 100% rename from connman/test/remove-provider rename to test/remove-provider diff --git a/connman/test/service-move-before b/test/service-move-before similarity index 100% rename from connman/test/service-move-before rename to test/service-move-before diff --git a/connman/test/set-clock b/test/set-clock similarity index 100% rename from connman/test/set-clock rename to test/set-clock diff --git a/connman/test/set-domains b/test/set-domains similarity index 100% rename from connman/test/set-domains rename to test/set-domains diff --git a/connman/test/set-global-timeservers b/test/set-global-timeservers similarity index 100% rename from connman/test/set-global-timeservers rename to test/set-global-timeservers diff --git a/connman/test/set-ipv4-method b/test/set-ipv4-method similarity index 100% rename from connman/test/set-ipv4-method rename to test/set-ipv4-method diff --git a/connman/test/set-ipv6-method b/test/set-ipv6-method similarity index 100% rename from connman/test/set-ipv6-method rename to test/set-ipv6-method diff --git a/connman/test/set-nameservers b/test/set-nameservers similarity index 100% rename from connman/test/set-nameservers rename to test/set-nameservers diff --git a/connman/test/set-proxy b/test/set-proxy similarity index 100% rename from connman/test/set-proxy rename to test/set-proxy diff --git a/connman/test/set-timeservers b/test/set-timeservers similarity index 100% rename from connman/test/set-timeservers rename to test/set-timeservers diff --git a/test/set-timezone b/test/set-timezone new file mode 100755 index 000000000..dfc1c981a --- /dev/null +++ b/test/set-timezone @@ -0,0 +1,21 @@ +#!/usr/bin/python + +import sys +import dbus + +if (len(sys.argv) != 2): + print "Usage: %s " % (sys.argv[0]) + sys.exit(1) + +bus = dbus.SystemBus() + +clock = dbus.Interface(bus.get_object('net.connman', '/'), + 'net.connman.Clock') + +print "Setting timezone to %s" % (sys.argv[1]) + +try: + clock.SetProperty("Timezone", dbus.String(sys.argv[1], variant_level=1), + signature=dbus.Signature('sv')) +except dbus.exceptions.DBusException, e_msg: + print e_msg diff --git a/connman/test/show-introspection b/test/show-introspection similarity index 100% rename from connman/test/show-introspection rename to test/show-introspection diff --git a/connman/test/simple-agent b/test/simple-agent similarity index 100% rename from connman/test/simple-agent rename to test/simple-agent diff --git a/connman/test/test-clock b/test/test-clock similarity index 100% rename from connman/test/test-clock rename to test/test-clock diff --git a/connman/test/test-compat b/test/test-compat similarity index 100% rename from connman/test/test-compat rename to test/test-compat diff --git a/connman/test/test-connman b/test/test-connman similarity index 100% rename from connman/test/test-connman rename to test/test-connman diff --git a/connman/test/test-counter b/test/test-counter similarity index 100% rename from connman/test/test-counter rename to test/test-counter diff --git a/connman/test/test-manager b/test/test-manager similarity index 100% rename from connman/test/test-manager rename to test/test-manager diff --git a/connman/test/test-new-supplicant b/test/test-new-supplicant similarity index 100% rename from connman/test/test-new-supplicant rename to test/test-new-supplicant diff --git a/connman/test/test-session b/test/test-session similarity index 100% rename from connman/test/test-session rename to test/test-session diff --git a/connman/test/vpn-connect b/test/vpn-connect similarity index 100% rename from connman/test/vpn-connect rename to test/vpn-connect diff --git a/connman/test/vpn-disconnect b/test/vpn-disconnect similarity index 100% rename from connman/test/vpn-disconnect rename to test/vpn-disconnect diff --git a/connman/test/vpn-get b/test/vpn-get similarity index 100% rename from connman/test/vpn-get rename to test/vpn-get diff --git a/connman/test/vpn-property b/test/vpn-property similarity index 100% rename from connman/test/vpn-property rename to test/vpn-property diff --git a/connman/tools/addr-test.c b/tools/addr-test.c similarity index 100% rename from connman/tools/addr-test.c rename to tools/addr-test.c diff --git a/connman/tools/dbus-test.c b/tools/dbus-test.c similarity index 100% rename from connman/tools/dbus-test.c rename to tools/dbus-test.c diff --git a/connman/tools/dhcp-server-test.c b/tools/dhcp-server-test.c similarity index 100% rename from connman/tools/dhcp-server-test.c rename to tools/dhcp-server-test.c diff --git a/connman/tools/dhcp-test.c b/tools/dhcp-test.c similarity index 100% rename from connman/tools/dhcp-test.c rename to tools/dhcp-test.c diff --git a/connman/tools/dnsproxy-test.c b/tools/dnsproxy-test.c similarity index 100% rename from connman/tools/dnsproxy-test.c rename to tools/dnsproxy-test.c diff --git a/connman/tools/iptables-test.c b/tools/iptables-test.c similarity index 100% rename from connman/tools/iptables-test.c rename to tools/iptables-test.c diff --git a/connman/tools/iptables-unit.c b/tools/iptables-unit.c similarity index 100% rename from connman/tools/iptables-unit.c rename to tools/iptables-unit.c diff --git a/connman/tools/manager-api.c b/tools/manager-api.c similarity index 100% rename from connman/tools/manager-api.c rename to tools/manager-api.c diff --git a/tools/netlink-test.c b/tools/netlink-test.c index 4765367c9..c07806a3f 100644 --- a/tools/netlink-test.c +++ b/tools/netlink-test.c @@ -38,8 +38,6 @@ #include #include "../src/shared/netlink.h" -#include "../src/shared/nfacct.h" -#include "../src/shared/nfnetlink_acct_copy.h" #define NFGEN_DATA(nlh) ((void *)((char *)(nlh) + \ NLMSG_ALIGN(sizeof(struct nfgenmsg)))) @@ -115,249 +113,11 @@ static void test_case_1(void) netlink_destroy(netlink); } -static void test_nfacct_dump_callback(unsigned int error, uint16_t type, - const void *data, uint32_t len, void *user_data) -{ - const struct nfgenmsg *msg = data; - const struct nlattr *attr; - uint64_t packets = 0 , bytes = 0; - char *name = NULL; - int attrlen; - - if (error == EINVAL) - printf("nfnetlink_acct not loaded\n"); - - g_assert_cmpuint(error, ==, 0); - - attrlen = len - NLMSG_ALIGN(sizeof(struct nfgenmsg)); - - for (attr = NFGEN_DATA(msg); NLA_OK(attr, attrlen); - attr = NLA_NEXT(attr, attrlen)) { - switch (attr->nla_type) { - case NFACCT_NAME: - name = NLA_DATA(attr); - break; - case NFACCT_PKTS: - packets = be64toh(*(uint64_t *) NLA_DATA(attr)); - break; - case NFACCT_BYTES: - bytes = be64toh(*(uint64_t *) NLA_DATA(attr)); - break; - case NFACCT_USE: - break; - } - } - - printf("%s packets %" PRIu64 " bytes %" PRIu64 "\n", - name, packets, bytes); - - g_main_loop_quit(mainloop); -} - -static void test_nfacct_callback(unsigned int error, uint16_t type, - const void *data, uint32_t len, void *user_data) -{ - if (error == EINVAL) - printf("nfnetlink_acct not loaded\n"); - - g_assert_cmpuint(error, ==, 0); -} - -static void append_attr_str(struct nlattr *attr, - uint16_t type, size_t size, const char *str) -{ - char *dst; - - attr->nla_len = NLA_HDRLEN + size; - attr->nla_type = NFACCT_NAME; - - dst = (char *)NLA_DATA(attr); - strncpy(dst, str, size); - dst[size - 1] = '\0'; -} - -static void test_nfacct_new(struct netlink_info *netlink, const char *name) -{ - struct nfgenmsg *hdr; - size_t len, name_len; - - name_len = strlen(name) + 1; - len = NLMSG_ALIGN(sizeof(struct nfgenmsg)) + - NLA_ALIGN(sizeof(struct nlattr)) + - name_len; - - hdr = g_malloc0(len); - - hdr->nfgen_family = AF_UNSPEC; - hdr->version = NFNETLINK_V0; - hdr->res_id = 0; - - append_attr_str(NLA_DATA(hdr), NFACCT_NAME, name_len, name); - - netlink_send(netlink, - NFNL_SUBSYS_ACCT << 8 | NFNL_MSG_ACCT_NEW, - NLM_F_CREATE | NLM_F_ACK, hdr, len, - test_nfacct_callback, NULL, NULL); - - g_free(hdr); -} - -static void test_nfacct_del(struct netlink_info *netlink, const char *name) -{ - struct nfgenmsg *hdr; - size_t len, name_len; - - name_len = strlen(name) + 1; - len = NLMSG_ALIGN(sizeof(struct nfgenmsg)) + - NLA_ALIGN(sizeof(struct nlattr)) + - name_len; - - hdr = g_malloc0(len); - - hdr->nfgen_family = AF_UNSPEC; - hdr->version = NFNETLINK_V0; - hdr->res_id = 0; - - append_attr_str(NLA_DATA(hdr), NFACCT_NAME, name_len, name); - - netlink_send(netlink, - NFNL_SUBSYS_ACCT << 8 | NFNL_MSG_ACCT_DEL, - NLM_F_ACK, hdr, len, - test_nfacct_callback, NULL, NULL); - - g_free(hdr); -} - -static void test_nfacct_dump(struct netlink_info *netlink) -{ - struct nfgenmsg hdr; - - memset(&hdr, 0, sizeof(hdr)); - hdr.nfgen_family = AF_UNSPEC; - hdr.version = NFNETLINK_V0; - hdr.res_id = 0; - - netlink_send(netlink, - NFNL_SUBSYS_ACCT << 8 | NFNL_MSG_ACCT_GET, - NLM_F_DUMP , &hdr, sizeof(hdr), - test_nfacct_dump_callback, NULL, NULL); -} - -static void test_case_2(void) -{ - struct netlink_info *netlink; - - netlink = netlink_new(NETLINK_NETFILTER); - - printf("\n"); - netlink_set_debug(netlink, do_debug, "[NETLINK] ", NULL); - - test_nfacct_new(netlink, "session-foo"); - test_nfacct_dump(netlink); - test_nfacct_del(netlink, "session-foo"); - - mainloop = g_main_loop_new(NULL, FALSE); - g_main_loop_run(mainloop); - g_main_loop_unref(mainloop); - - netlink_destroy(netlink); -} - - -static void nfacct_add_callback(unsigned int error, void *user_data) -{ - const char *name = user_data; - - if (error == EINVAL) - printf("nfnetlink_acct not loaded\n"); - - g_assert_cmpuint(error, ==, 0); - - printf("nfacct_add: error %d name %s\n", error, name); -} - -static void nfacct_get_callback(unsigned int error, const char *name, - uint64_t packets, uint64_t bytes, - void *user_data) -{ - const char *expected_name = user_data; - - if (error == EINVAL) - printf("nfnetlink_acct not loaded\n"); - - g_assert_cmpuint(error, ==, 0); - - if (!name) { - /* end of dump */ - return; - } - - printf("nfacct_get: error %d name %s packets %" PRIu64 - " bytes %" PRIu64 "\n", error, name, packets, bytes); - - g_assert_cmpstr(expected_name, ==, name); - g_assert_cmpuint(packets, ==, 0); - g_assert_cmpuint(bytes, ==, 0); -} - -static void nfacct_dump_callback(unsigned int error, const char *name, - uint64_t packets, uint64_t bytes, - void *user_data) -{ - const char *expected_name = user_data; - - if (error == EINVAL) - printf("nfnetlink_acct not loaded\n"); - - g_assert_cmpuint(error, ==, 0); - - if (!name) { - /* end of dump */ - return; - } - - printf("nfacct_dump: error %d name %s packets %" PRIu64 - " bytes %" PRIu64 "\n", error, name, packets, bytes); - - g_assert_cmpstr(expected_name, ==, name); - g_assert_cmpuint(packets, ==, 0); - g_assert_cmpuint(bytes, ==, 0); -} - -static void nfacct_del_callback(unsigned int error, void *user_data) -{ - g_assert_cmpuint(error, ==, 0); - - g_main_loop_quit(mainloop); -} - -static void nfacct_case_1(void) -{ - struct nfacct_info *nfacct; - char *name = "session-bar"; - - printf("\n"); - nfacct = nfacct_new(); - - nfacct_add(nfacct, name, nfacct_add_callback, name); - nfacct_get(nfacct, name, false, nfacct_get_callback, name); - nfacct_dump(nfacct, false, nfacct_dump_callback, name); - nfacct_del(nfacct, name, nfacct_del_callback, name); - - mainloop = g_main_loop_new(NULL, FALSE); - g_main_loop_run(mainloop); - g_main_loop_unref(mainloop); - - nfacct_destroy(nfacct); -} - int main(int argc, char *argv[]) { g_test_init(&argc, &argv, NULL); g_test_add_func("/netlink/Test case 1", test_case_1); - g_test_add_func("/netlink/Test case 2", test_case_2); - g_test_add_func("/nfacct/Test case 1", nfacct_case_1); return g_test_run(); } diff --git a/connman/tools/polkit-test.c b/tools/polkit-test.c similarity index 100% rename from connman/tools/polkit-test.c rename to tools/polkit-test.c diff --git a/connman/tools/private-network-test.c b/tools/private-network-test.c similarity index 100% rename from connman/tools/private-network-test.c rename to tools/private-network-test.c diff --git a/connman/tools/resolv-test.c b/tools/resolv-test.c similarity index 100% rename from connman/tools/resolv-test.c rename to tools/resolv-test.c diff --git a/connman/tools/session-api.c b/tools/session-api.c similarity index 100% rename from connman/tools/session-api.c rename to tools/session-api.c diff --git a/connman/tools/session-test.c b/tools/session-test.c similarity index 100% rename from connman/tools/session-test.c rename to tools/session-test.c diff --git a/connman/tools/session-test.h b/tools/session-test.h similarity index 100% rename from connman/tools/session-test.h rename to tools/session-test.h diff --git a/connman/tools/session-utils.c b/tools/session-utils.c similarity index 100% rename from connman/tools/session-utils.c rename to tools/session-utils.c diff --git a/connman/tools/stats-tool.c b/tools/stats-tool.c similarity index 97% rename from connman/tools/stats-tool.c rename to tools/stats-tool.c index 6192cecac..7957c4715 100644 --- a/connman/tools/stats-tool.c +++ b/tools/stats-tool.c @@ -37,7 +37,6 @@ #include #include #include -#include #include #include @@ -48,17 +47,17 @@ #define TFR #endif -#define MAGIC 0xFA01B916 +#define MAGIC 0xFA00B916 struct connman_stats_data { - uint64_t rx_packets; - uint64_t tx_packets; - uint64_t rx_bytes; - uint64_t tx_bytes; - uint64_t rx_errors; - uint64_t tx_errors; - uint64_t rx_dropped; - uint64_t tx_dropped; + unsigned int rx_packets; + unsigned int tx_packets; + unsigned int rx_bytes; + unsigned int tx_bytes; + unsigned int rx_errors; + unsigned int tx_errors; + unsigned int rx_dropped; + unsigned int tx_dropped; unsigned int time; }; @@ -221,7 +220,7 @@ static void stats_print_record(struct stats_record *rec) char buffer[30]; strftime(buffer, 30, "%d-%m-%Y %T", localtime(&rec->ts)); - printf("%p %lld %s %01d %llu %llu %llu %llu %llu %llu %llu %llu %d\n", + printf("%p %lld %s %01d %d %d %d %d %d %d %d %d %d\n", rec, (long long int)rec->ts, buffer, rec->roaming, rec->data.rx_packets, @@ -311,21 +310,21 @@ static void stats_print_entries(struct stats_file *file) static void stats_print_rec_diff(struct stats_record *begin, struct stats_record *end) { - printf("\trx_packets: %llu\n", + printf("\trx_packets: %d\n", end->data.rx_packets - begin->data.rx_packets); - printf("\ttx_packets: %llu\n", + printf("\ttx_packets: %d\n", end->data.tx_packets - begin->data.tx_packets); - printf("\trx_bytes: %llu\n", + printf("\trx_bytes: %d\n", end->data.rx_bytes - begin->data.rx_bytes); - printf("\ttx_bytes: %llu\n", + printf("\ttx_bytes: %d\n", end->data.tx_bytes - begin->data.tx_bytes); - printf("\trx_errors: %llu\n", + printf("\trx_errors: %d\n", end->data.rx_errors - begin->data.rx_errors); - printf("\ttx_errors: %llu\n", + printf("\ttx_errors: %d\n", end->data.tx_errors - begin->data.tx_errors); - printf("\trx_dropped: %llu\n", + printf("\trx_dropped: %d\n", end->data.rx_dropped - begin->data.rx_dropped); - printf("\ttx_dropped: %llu\n", + printf("\ttx_dropped: %d\n", end->data.tx_dropped - begin->data.tx_dropped); printf("\ttime: %d\n", end->data.time - begin->data.time); diff --git a/connman/tools/supplicant-dbus.c b/tools/supplicant-dbus.c similarity index 100% rename from connman/tools/supplicant-dbus.c rename to tools/supplicant-dbus.c diff --git a/connman/tools/supplicant-dbus.h b/tools/supplicant-dbus.h similarity index 100% rename from connman/tools/supplicant-dbus.h rename to tools/supplicant-dbus.h diff --git a/connman/tools/supplicant-test.c b/tools/supplicant-test.c similarity index 100% rename from connman/tools/supplicant-test.c rename to tools/supplicant-test.c diff --git a/connman/tools/supplicant.c b/tools/supplicant.c similarity index 100% rename from connman/tools/supplicant.c rename to tools/supplicant.c diff --git a/connman/tools/supplicant.h b/tools/supplicant.h similarity index 100% rename from connman/tools/supplicant.h rename to tools/supplicant.h diff --git a/connman/tools/tap-test.c b/tools/tap-test.c similarity index 100% rename from connman/tools/tap-test.c rename to tools/tap-test.c diff --git a/connman/tools/web-test.c b/tools/web-test.c similarity index 100% rename from connman/tools/web-test.c rename to tools/web-test.c diff --git a/connman/tools/wispr.c b/tools/wispr.c similarity index 100% rename from connman/tools/wispr.c rename to tools/wispr.c diff --git a/connman/tools/wpad-test.c b/tools/wpad-test.c similarity index 100% rename from connman/tools/wpad-test.c rename to tools/wpad-test.c diff --git a/connman/unit/test-ippool.c b/unit/test-ippool.c similarity index 100% rename from connman/unit/test-ippool.c rename to unit/test-ippool.c diff --git a/connman/unit/test-pbkdf2-sha1.c b/unit/test-pbkdf2-sha1.c similarity index 100% rename from connman/unit/test-pbkdf2-sha1.c rename to unit/test-pbkdf2-sha1.c diff --git a/connman/unit/test-prf-sha1.c b/unit/test-prf-sha1.c similarity index 100% rename from connman/unit/test-prf-sha1.c rename to unit/test-prf-sha1.c diff --git a/upstream b/upstream deleted file mode 160000 index 075e1bbdd..000000000 --- a/upstream +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 075e1bbdda5b2ba2bba6fc75e458684365e5c6e9 diff --git a/connman/vpn/connman-task.te b/vpn/connman-task.te similarity index 100% rename from connman/vpn/connman-task.te rename to vpn/connman-task.te diff --git a/connman/vpn/connman-vpn.conf b/vpn/connman-vpn.conf similarity index 100% rename from connman/vpn/connman-vpn.conf rename to vpn/connman-vpn.conf diff --git a/connman/vpn/connman-vpn.service.in b/vpn/connman-vpn.service.in similarity index 100% rename from connman/vpn/connman-vpn.service.in rename to vpn/connman-vpn.service.in diff --git a/connman/vpn/main.c b/vpn/main.c similarity index 100% rename from connman/vpn/main.c rename to vpn/main.c diff --git a/connman/vpn/net.connman.vpn.service.in b/vpn/net.connman.vpn.service.in similarity index 100% rename from connman/vpn/net.connman.vpn.service.in rename to vpn/net.connman.vpn.service.in diff --git a/connman/vpn/plugins/l2tp.c b/vpn/plugins/l2tp.c similarity index 100% rename from connman/vpn/plugins/l2tp.c rename to vpn/plugins/l2tp.c diff --git a/connman/vpn/plugins/openconnect.c b/vpn/plugins/openconnect.c similarity index 100% rename from connman/vpn/plugins/openconnect.c rename to vpn/plugins/openconnect.c diff --git a/connman/vpn/plugins/openvpn.c b/vpn/plugins/openvpn.c similarity index 100% rename from connman/vpn/plugins/openvpn.c rename to vpn/plugins/openvpn.c diff --git a/connman/vpn/plugins/pptp.c b/vpn/plugins/pptp.c similarity index 100% rename from connman/vpn/plugins/pptp.c rename to vpn/plugins/pptp.c diff --git a/connman/vpn/plugins/vpn.c b/vpn/plugins/vpn.c similarity index 100% rename from connman/vpn/plugins/vpn.c rename to vpn/plugins/vpn.c diff --git a/connman/vpn/plugins/vpn.h b/vpn/plugins/vpn.h similarity index 100% rename from connman/vpn/plugins/vpn.h rename to vpn/plugins/vpn.h diff --git a/connman/vpn/plugins/vpnc.c b/vpn/plugins/vpnc.c similarity index 100% rename from connman/vpn/plugins/vpnc.c rename to vpn/plugins/vpnc.c diff --git a/connman/vpn/vpn-agent.c b/vpn/vpn-agent.c similarity index 100% rename from connman/vpn/vpn-agent.c rename to vpn/vpn-agent.c diff --git a/connman/vpn/vpn-agent.h b/vpn/vpn-agent.h similarity index 100% rename from connman/vpn/vpn-agent.h rename to vpn/vpn-agent.h diff --git a/connman/vpn/vpn-config.c b/vpn/vpn-config.c similarity index 100% rename from connman/vpn/vpn-config.c rename to vpn/vpn-config.c diff --git a/connman/vpn/vpn-dbus.conf b/vpn/vpn-dbus.conf similarity index 100% rename from connman/vpn/vpn-dbus.conf rename to vpn/vpn-dbus.conf diff --git a/connman/vpn/vpn-ipconfig.c b/vpn/vpn-ipconfig.c similarity index 98% rename from connman/vpn/vpn-ipconfig.c rename to vpn/vpn-ipconfig.c index 791dee3a9..c3e61453a 100644 --- a/connman/vpn/vpn-ipconfig.c +++ b/vpn/vpn-ipconfig.c @@ -362,7 +362,7 @@ void __vpn_ipconfig_newlink(int index, unsigned short type, unsigned int flags, const char *address, unsigned short mtu, - struct rtnl_link_stats64 *stats) + struct rtnl_link_stats *stats) { struct vpn_ipdevice *ipdevice; GString *str; @@ -418,7 +418,7 @@ void __vpn_ipconfig_newlink(int index, unsigned short type, g_string_free(str, TRUE); } -void __vpn_ipconfig_dellink(int index, struct rtnl_link_stats64 *stats) +void __vpn_ipconfig_dellink(int index, struct rtnl_link_stats *stats) { struct vpn_ipdevice *ipdevice; diff --git a/connman/vpn/vpn-manager.c b/vpn/vpn-manager.c similarity index 100% rename from connman/vpn/vpn-manager.c rename to vpn/vpn-manager.c diff --git a/connman/vpn/vpn-polkit.conf b/vpn/vpn-polkit.conf similarity index 100% rename from connman/vpn/vpn-polkit.conf rename to vpn/vpn-polkit.conf diff --git a/connman/vpn/vpn-polkit.policy b/vpn/vpn-polkit.policy similarity index 100% rename from connman/vpn/vpn-polkit.policy rename to vpn/vpn-polkit.policy diff --git a/connman/vpn/vpn-provider.c b/vpn/vpn-provider.c similarity index 100% rename from connman/vpn/vpn-provider.c rename to vpn/vpn-provider.c diff --git a/connman/vpn/vpn-provider.h b/vpn/vpn-provider.h similarity index 100% rename from connman/vpn/vpn-provider.h rename to vpn/vpn-provider.h diff --git a/connman/vpn/vpn-rtnl.c b/vpn/vpn-rtnl.c similarity index 99% rename from connman/vpn/vpn-rtnl.c rename to vpn/vpn-rtnl.c index 4a441eec1..af246747b 100644 --- a/connman/vpn/vpn-rtnl.c +++ b/vpn/vpn-rtnl.c @@ -227,7 +227,7 @@ static const char *operstate2str(unsigned char operstate) static void extract_link(struct ifinfomsg *msg, int bytes, struct ether_addr *address, const char **ifname, unsigned int *mtu, unsigned char *operstate, - struct rtnl_link_stats64 *stats) + struct rtnl_link_stats *stats) { struct rtattr *attr; @@ -246,10 +246,10 @@ static void extract_link(struct ifinfomsg *msg, int bytes, if (mtu) *mtu = *((unsigned int *) RTA_DATA(attr)); break; - case IFLA_STATS64: + case IFLA_STATS: if (stats) memcpy(stats, RTA_DATA(attr), - sizeof(struct rtnl_link_stats64)); + sizeof(struct rtnl_link_stats)); break; case IFLA_OPERSTATE: if (operstate) @@ -266,7 +266,7 @@ static void process_newlink(unsigned short type, int index, unsigned flags, { struct ether_addr address = {{ 0, 0, 0, 0, 0, 0 }}; struct ether_addr compare = {{ 0, 0, 0, 0, 0, 0 }}; - struct rtnl_link_stats64 stats; + struct rtnl_link_stats stats; unsigned char operstate = 0xff; struct interface_data *interface; const char *ifname = NULL; @@ -343,7 +343,7 @@ static void process_newlink(unsigned short type, int index, unsigned flags, static void process_dellink(unsigned short type, int index, unsigned flags, unsigned change, struct ifinfomsg *msg, int bytes) { - struct rtnl_link_stats64 stats; + struct rtnl_link_stats stats; unsigned char operstate = 0xff; const char *ifname = NULL; GSList *list; @@ -612,8 +612,8 @@ static void rtnl_link(struct nlmsghdr *hdr) case IFLA_QDISC: print_attr(attr, "qdisc"); break; - case IFLA_STATS64: - print_attr(attr, "stats64"); + case IFLA_STATS: + print_attr(attr, "stats"); break; case IFLA_COST: print_attr(attr, "cost"); diff --git a/connman/vpn/vpn-rtnl.h b/vpn/vpn-rtnl.h similarity index 100% rename from connman/vpn/vpn-rtnl.h rename to vpn/vpn-rtnl.h diff --git a/connman/vpn/vpn.h b/vpn/vpn.h similarity index 97% rename from connman/vpn/vpn.h rename to vpn/vpn.h index 743fd32be..1398d05e7 100644 --- a/connman/vpn/vpn.h +++ b/vpn/vpn.h @@ -60,13 +60,13 @@ void __vpn_ipconfig_unref_debug(struct vpn_ipconfig *ipconfig, struct vpn_ipconfig *__vpn_ipconfig_create(int index, int family); void __vpn_ipconfig_set_index(struct vpn_ipconfig *ipconfig, int index); -struct rtnl_link_stats64; +struct rtnl_link_stats; void __vpn_ipconfig_newlink(int index, unsigned short type, unsigned int flags, const char *address, unsigned short mtu, - struct rtnl_link_stats64 *stats); -void __vpn_ipconfig_dellink(int index, struct rtnl_link_stats64 *stats); + struct rtnl_link_stats *stats); +void __vpn_ipconfig_dellink(int index, struct rtnl_link_stats *stats); int __vpn_ipconfig_init(void); void __vpn_ipconfig_cleanup(void); diff --git a/connman/vpn/vpn.ver b/vpn/vpn.ver similarity index 100% rename from connman/vpn/vpn.ver rename to vpn/vpn.ver