Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Evergreen:11.2
NetworkManager
0001-Use-ModemManager.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 0001-Use-ModemManager.patch of Package NetworkManager
From 3c149a1ee2965601b7426b63df62ded1f2853364 Mon Sep 17 00:00:00 2001 From: Tambet Ingo <tambet@gmail.com> Date: Thu, 22 Jan 2009 12:37:52 +0200 Subject: [PATCH] Use ModemManager. Index: NetworkManager-0.7.1/callouts/Makefile.am =================================================================== --- NetworkManager-0.7.1.orig/callouts/Makefile.am +++ NetworkManager-0.7.1/callouts/Makefile.am @@ -62,17 +62,17 @@ nm_dispatcher_action_LDADD = \ nm-dispatcher-glue.h: nm-dispatcher.xml dbus-binding-tool --prefix=nm_dispatcher --mode=glib-server --output=$@ $< -udevdir = $(UDEV_BASE_DIR) -udev_PROGRAMS = nm-modem-probe +# udevdir = $(UDEV_BASE_DIR) +# udev_PROGRAMS = nm-modem-probe -nm_modem_probe_SOURCES = nm-modem-probe.c -nm_modem_probe_CPPFLAGS = $(GLIB_CFLAGS) -nm_modem_probe_LDADD = $(GLIB_LIBS) +# nm_modem_probe_SOURCES = nm-modem-probe.c +# nm_modem_probe_CPPFLAGS = $(GLIB_CFLAGS) +# nm_modem_probe_LDADD = $(GLIB_LIBS) -udevrulesdir = $(UDEV_BASE_DIR)/rules.d -udevrules_DATA = \ - 77-nm-probe-modem-capabilities.rules \ - 77-nm-zte-port-types.rules +# udevrulesdir = $(UDEV_BASE_DIR)/rules.d +# udevrules_DATA = \ +# 77-nm-probe-modem-capabilities.rules \ +# 77-nm-zte-port-types.rules dbusactivationdir = $(datadir)/dbus-1/system-services dbusactivation_in_files = org.freedesktop.nm_dispatcher.service.in Index: NetworkManager-0.7.1/configure.in =================================================================== --- NetworkManager-0.7.1.orig/configure.in +++ NetworkManager-0.7.1/configure.in @@ -404,32 +404,6 @@ fi AC_DEFINE_UNQUOTED(SYSTEM_CA_PATH, "$SYSTEM_CA_PATH", [Define to path to system CA certificates]) AC_SUBST(SYSTEM_CA_PATH) -##### Find out the version of libudev we're using -UDEV_VERSION=`pkg-config --modversion libudev` -if test "z$UDEV_VERSION" != "z"; then - HAVE_LIBUDEV=1 - AC_DEFINE_UNQUOTED(UDEV_VERSION, $UDEV_VERSION, [udev version]) - echo "libudev version: $UDEV_VERSION" - - PKG_CHECK_MODULES(LIBUDEV, libudev) -else - HAVE_LIBUDEV=0 - echo "libudev not present; using fallbacks" - LIBUDEV_CFLAGS="" - LIBUDEV_LIBS="" -fi -AC_DEFINE_UNQUOTED(HAVE_LIBUDEV, $HAVE_LIBUDEV, [Define if libudev is present]) -AC_SUBST(LIBUDEV_CFLAGS) -AC_SUBST(LIBUDEV_LIBS) - -AC_ARG_WITH(udev-dir, AS_HELP_STRING([--with-udev-dir=DIR], [where the udev base directory is])) -if test -n "$with_udev_dir" ; then - UDEV_BASE_DIR="$with_udev_dir" -else - UDEV_BASE_DIR="/lib/udev" -fi -AC_SUBST(UDEV_BASE_DIR) - AC_ARG_ENABLE(more-warnings, AS_HELP_STRING([--enable-more-warnings], [Maximum compiler warnings]), set_more_warnings="$enableval",set_more_warnings=yes) AC_MSG_CHECKING(for more warnings, including -Werror) @@ -489,6 +463,7 @@ src/supplicant-manager/Makefile src/supplicant-manager/tests/Makefile src/ppp-manager/Makefile src/dnsmasq-manager/Makefile +src/modem-manager/Makefile src/backends/Makefile libnm-util/libnm-util.pc libnm-util/Makefile Index: NetworkManager-0.7.1/marshallers/nm-marshal.list =================================================================== --- NetworkManager-0.7.1.orig/marshallers/nm-marshal.list +++ NetworkManager-0.7.1/marshallers/nm-marshal.list @@ -11,7 +11,7 @@ VOID:UINT,UINT,UINT VOID:STRING,STRING VOID:STRING,UCHAR VOID:STRING,OBJECT -VOID:STRING,STRING,POINTER,POINTER +VOID:STRING,STRING,POINTER VOID:OBJECT,UINT,UINT VOID:STRING,INT VOID:STRING,UINT Index: NetworkManager-0.7.1/po/ChangeLog =================================================================== --- NetworkManager-0.7.1.orig/po/ChangeLog +++ NetworkManager-0.7.1/po/ChangeLog @@ -1,3 +1,7 @@ +2009-03-12 Gintautas Miliauskas <gintautas@miliauskas.lt> + + * lt.po: Updated Lithuanian translation. + 2008-12-07 Simos Xenitellis <simos@gnome.org> * el.po: Updated Greek translation by Evgenia Petoumenou. Index: NetworkManager-0.7.1/po/lt.po =================================================================== --- NetworkManager-0.7.1.orig/po/lt.po +++ NetworkManager-0.7.1/po/lt.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: NetworkManager HEAD\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-09-25 00:59+0300\n" -"PO-Revision-Date: 2008-09-25 00:59+0300\n" +"POT-Creation-Date: 2009-03-12 13:21+0200\n" +"PO-Revision-Date: 2009-03-12 13:21+0200\n" "Last-Translator: Žygimantas Beručka <zygis@gnome.org>\n" "Language-Team: Lithuanian <komp_lt@konferencijos.lt>\n" "MIME-Version: 1.0\n" @@ -18,183 +18,124 @@ msgstr "" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%" "100<10 || n%100>=20) ? 1 : 2);\n" -#: ../src/nm-netlink-monitor.c:193 ../src/nm-netlink-monitor.c:474 -#, c-format -msgid "error processing netlink message: %s" -msgstr "klaida apdorojant netlink pranešimo: %s" - -#: ../src/nm-netlink-monitor.c:250 -#, c-format -msgid "unable to allocate netlink handle for monitoring link status: %s" -msgstr "nepavyko rezervuoti netlink valdiklio saito būsenos stebėjimui: %s" - -#: ../src/nm-netlink-monitor.c:260 -#, c-format -msgid "unable to connect to netlink for monitoring link status: %s" -msgstr "nepavyko prisijungti prie netlink saito būsenos stebėjimui: %s" - -#: ../src/nm-netlink-monitor.c:268 -#, c-format -msgid "unable to join netlink group for monitoring link status: %s" -msgstr "nepavyko prisijungti prie netlink grupės saito būsenos stebėjimui: %s" - -#: ../src/nm-netlink-monitor.c:276 -#, c-format -msgid "unable to allocate netlink link cache for monitoring link status: %s" -msgstr "nepavyko rezervuoti netlink saito podėlio saito būsenos stebėjimui: %s" - -#: ../src/nm-netlink-monitor.c:439 -#, c-format -msgid "error updating link cache: %s" -msgstr "klaida atnaujinant saito podėlį: %s" - -#: ../src/nm-netlink-monitor.c:497 -#, c-format -msgid "error occurred while waiting for data on socket" -msgstr "laukiant lizde duomenų įvyko klaida" - -#: ../src/NetworkManager.c:250 -#, c-format -msgid "Invalid option. Please use --help to see a list of valid options.\n" -msgstr "" -"Netinkama parinktis. Galimų parinkčių sąrašą galite pamatyti naudodami " -"parametrą --help.\n" - -#: ../src/dhcp-manager/nm-dhcp-dhclient.c:89 -msgid "# Created by NetworkManager\n" -msgstr "# Sukurta NetworkManager programos\n" - -#: ../src/dhcp-manager/nm-dhcp-dhclient.c:95 -#, c-format -msgid "" -"# Merged from %s\n" -"\n" -msgstr "" -"# Sulieta iš %s\n" -"\n" - -#: ../src/named-manager/nm-named-manager.c:256 -msgid "NOTE: the libc resolver may not support more than 3 nameservers." -msgstr "" -"PASTABA: libc sprendiklis gali nepalaikyti daugiau nei 3 vardų serverių." - -#: ../src/named-manager/nm-named-manager.c:258 -msgid "The nameservers listed below may not be recognized." -msgstr "Žemiau pateikti vardų serveriai gali būti neatpažinti." - -#: ../system-settings/src/main.c:366 -#, c-format -msgid "Auto %s" -msgstr "Automatinis %s" - -#: ../libnm-util/crypto.c:125 +#: ../libnm-util/crypto.c:120 #, c-format msgid "PEM key file had no end tag '%s'." msgstr "PEM rakto faile nėra pabaigos gairės „%s“." -#: ../libnm-util/crypto.c:135 +#: ../libnm-util/crypto.c:130 #, c-format msgid "Doesn't look like a PEM private key file." msgstr "Nepanašu į PEM asmeninio rakto failą." -#: ../libnm-util/crypto.c:143 +#: ../libnm-util/crypto.c:138 #, c-format msgid "Not enough memory to store PEM file data." msgstr "Nepakanka atminties PEM failo duomenų saugojimui." -#: ../libnm-util/crypto.c:159 +#: ../libnm-util/crypto.c:154 #, c-format msgid "Malformed PEM file: Proc-Type was not first tag." msgstr "Netinkamai suformuotas PEM failas: Proc-Type buvo ne pirma gairė." -#: ../libnm-util/crypto.c:167 +#: ../libnm-util/crypto.c:162 #, c-format msgid "Malformed PEM file: unknown Proc-Type tag '%s'." msgstr "Netinkamai suformuotas PEM failas: nežinoma Proc-Type gairė „%s“." -#: ../libnm-util/crypto.c:177 +#: ../libnm-util/crypto.c:172 #, c-format msgid "Malformed PEM file: DEK-Info was not the second tag." msgstr "Netinkamai suformuotas PEM failas: DEK-Info buvo ne antra gairė." -#: ../libnm-util/crypto.c:188 +#: ../libnm-util/crypto.c:183 #, c-format msgid "Malformed PEM file: no IV found in DEK-Info tag." msgstr "Netinkamai suformuotas PEM failas: DEK-Info gairėje nerasta IV." -#: ../libnm-util/crypto.c:195 +#: ../libnm-util/crypto.c:190 #, c-format msgid "Malformed PEM file: invalid format of IV in DEK-Info tag." msgstr "" "Netinkamai suformuotas PEM failas: DEK-Info gairėje netinkamas IV formatas." -#: ../libnm-util/crypto.c:208 +#: ../libnm-util/crypto.c:203 #, c-format msgid "Malformed PEM file: unknown private key cipher '%s'." msgstr "" "Netinkamai suformuotas PEM failas: nežinomas asmeninio rakto šifras „%s“." -#: ../libnm-util/crypto.c:227 +#: ../libnm-util/crypto.c:222 #, c-format msgid "Could not decode private key." msgstr "Nepavyko iškoduoti asmeninio rakto." -#: ../libnm-util/crypto.c:271 +#: ../libnm-util/crypto.c:267 #, c-format msgid "PEM certificate '%s' had no end tag '%s'." msgstr "PEM liudijime „%s“ nėra pabaigos gairės „%s“." -#: ../libnm-util/crypto.c:281 +#: ../libnm-util/crypto.c:277 #, c-format msgid "Failed to decode certificate." msgstr "Nepavyko iškoduoti liudijimo." -#: ../libnm-util/crypto.c:290 ../libnm-util/crypto.c:298 +#: ../libnm-util/crypto.c:286 #, c-format msgid "Not enough memory to store certificate data." msgstr "Nepakanka atminties liudijimo duomnų saugojimui." -#: ../libnm-util/crypto.c:328 +#: ../libnm-util/crypto.c:294 +#, c-format +msgid "Not enough memory to store file data." +msgstr "Nepakanka atminties įrašyti failo duomenis." + +#: ../libnm-util/crypto.c:324 #, c-format msgid "IV must be an even number of bytes in length." msgstr "IV ilgis turi būti lyginis baitų skaičius." -#: ../libnm-util/crypto.c:337 +#: ../libnm-util/crypto.c:333 #, c-format msgid "Not enough memory to store the IV." msgstr "Nepakanka atminties IV saugojimui." -#: ../libnm-util/crypto.c:348 +#: ../libnm-util/crypto.c:344 #, c-format msgid "IV contains non-hexadecimal digits." msgstr "IV yra ne šešioliktainių skaitmenų." -#: ../libnm-util/crypto.c:386 ../libnm-util/crypto_gnutls.c:143 -#: ../libnm-util/crypto_nss.c:157 +#: ../libnm-util/crypto.c:382 ../libnm-util/crypto_gnutls.c:143 +#: ../libnm-util/crypto_nss.c:169 #, c-format msgid "Private key cipher '%s' was unknown." msgstr "Asmeninio rakto šifras „%s“ nežinomas." -#: ../libnm-util/crypto.c:395 +#: ../libnm-util/crypto.c:391 #, c-format -msgid "Not enough memory to create private key decryption key." -msgstr "Nepakanka atminties asmeninio rakto iššifravimo rakto sukūrimui." +msgid "Not enough memory to decrypt private key." +msgstr "Nepakanka atminties iššifruoti asmeninį raktą." -#: ../libnm-util/crypto.c:513 +#: ../libnm-util/crypto.c:511 +#, c-format +msgid "Unable to determine private key type." +msgstr "Nepavyko nustatyti asmeninio rakto tipo." + +#: ../libnm-util/crypto.c:530 #, c-format msgid "Not enough memory to store decrypted private key." msgstr "Nepakanka atminties iššifruoto asmeninio rakto saugojimui." -#: ../libnm-util/crypto_gnutls.c:45 +#: ../libnm-util/crypto_gnutls.c:46 msgid "Failed to initialize the crypto engine." msgstr "Nepavyko inicijuoti šifravimo posistemės." -#: ../libnm-util/crypto_gnutls.c:89 +#: ../libnm-util/crypto_gnutls.c:90 #, c-format msgid "Failed to initialize the MD5 engine: %s / %s." msgstr "Nepavyko inicijuoti MD5 posistemės: %s / %s." -#: ../libnm-util/crypto_gnutls.c:152 ../libnm-util/crypto_nss.c:166 +#: ../libnm-util/crypto_gnutls.c:152 ../libnm-util/crypto_nss.c:178 #, c-format msgid "Not enough memory for decrypted key buffer." msgstr "Nepakanka atminties iššifruoto rakto buferiui." @@ -219,57 +160,168 @@ msgstr "Nepavyko iššifravimui nustatyt msgid "Failed to decrypt the private key: %s / %s." msgstr "Nepavyko iššifruoti asmeninio rakto: %s / %s." -#: ../libnm-util/crypto_gnutls.c:225 +#: ../libnm-util/crypto_gnutls.c:200 +#, c-format +msgid "Failed to decrypt the private key." +msgstr "Nepavyko iššifruoti asmeninio rakto." + +#: ../libnm-util/crypto_gnutls.c:235 #, c-format msgid "Error initializing certificate data: %s" msgstr "Klaida inicijuojant liudijimo duomenis: %s" -#: ../libnm-util/crypto_gnutls.c:237 +#: ../libnm-util/crypto_gnutls.c:257 #, c-format msgid "Couldn't decode certificate: %s" msgstr "Nepavyko iškoduoti liudijimo: %s" -#: ../libnm-util/crypto_nss.c:52 +#: ../libnm-util/crypto_gnutls.c:281 +#, c-format +msgid "Couldn't initialize PKCS#12 decoder: %s" +msgstr "Nepavyko inicializuoti PKCS#12 dekoderio: %s" + +#: ../libnm-util/crypto_gnutls.c:294 +#, c-format +msgid "Couldn't decode PKCS#12 file: %s" +msgstr "Nepavyko iškoduoti PKCS#12 failo: %s" + +#: ../libnm-util/crypto_gnutls.c:306 +#, c-format +msgid "Couldn't verify PKCS#12 file: %s" +msgstr "Nepavyko patvirtinti PKCS#12 failo: %s" + +#: ../libnm-util/crypto_nss.c:57 #, c-format msgid "Failed to initialize the crypto engine: %d." msgstr "Nepavyko inicijuoti šifravimo posistemės: %d." -#: ../libnm-util/crypto_nss.c:98 +#: ../libnm-util/crypto_nss.c:111 #, c-format msgid "Failed to initialize the MD5 context: %d." msgstr "Nepavyko inicijuoti MD5 konteksto: %d." -#: ../libnm-util/crypto_nss.c:174 +#: ../libnm-util/crypto_nss.c:186 #, c-format msgid "Failed to initialize the decryption cipher slot." msgstr "Nepavyko inicijuoti iššifravimo šifro lizdo." -#: ../libnm-util/crypto_nss.c:184 +#: ../libnm-util/crypto_nss.c:196 #, c-format msgid "Failed to set symmetric key for decryption." msgstr "Nepavyko iššifravimui nustatyti simetriško rakto." -#: ../libnm-util/crypto_nss.c:194 +#: ../libnm-util/crypto_nss.c:206 #, c-format msgid "Failed to set IV for decryption." msgstr "Nepavyko iššifravimui nustatyti IV." -#: ../libnm-util/crypto_nss.c:202 +#: ../libnm-util/crypto_nss.c:214 #, c-format msgid "Failed to initialize the decryption context." msgstr "Nepavyko inicijuoti iššifravimo konteksto." -#: ../libnm-util/crypto_nss.c:215 +#: ../libnm-util/crypto_nss.c:227 #, c-format msgid "Failed to decrypt the private key: %d." msgstr "Nepavyko iššifruoti asmeninio rakto: %d." -#: ../libnm-util/crypto_nss.c:227 +#: ../libnm-util/crypto_nss.c:239 #, c-format msgid "Failed to finalize decryption of the private key: %d." -msgstr "Nepavyko baigti asmeinio rakto iššifravimo: %d." +msgstr "Nepavyko baigti asmeninio rakto iššifravimo: %d." -#: ../libnm-util/crypto_nss.c:271 +#: ../libnm-util/crypto_nss.c:284 #, c-format msgid "Couldn't decode certificate: %d" msgstr "Nepavyko iškoduoti liudijimo: %d" + +#: ../libnm-util/crypto_nss.c:319 +#, c-format +msgid "Couldn't convert password to UCS2: %d" +msgstr "Nepavyko konvertuoti slaptažodžio į UCS-2: %d" + +#: ../libnm-util/crypto_nss.c:347 +#, c-format +msgid "Couldn't initialize PKCS#12 decoder: %d" +msgstr "Nepavyko inicializuoti PKCS#12 dekoderio: %d" + +#: ../libnm-util/crypto_nss.c:356 +#, c-format +msgid "Couldn't decode PKCS#12 file: %d" +msgstr "Nepavyko iškoduoti PKCS#12 failo: %d" + +#: ../libnm-util/crypto_nss.c:365 +#, c-format +msgid "Couldn't verify PKCS#12 file: %d" +msgstr "Nepavyko patvirtinti PKCS#12 failo: %d" + +#: ../src/nm-netlink-monitor.c:194 ../src/nm-netlink-monitor.c:458 +#, c-format +msgid "error processing netlink message: %s" +msgstr "klaida apdorojant netlink pranešimo: %s" + +#: ../src/nm-netlink-monitor.c:255 +#, c-format +msgid "unable to allocate netlink handle for monitoring link status: %s" +msgstr "nepavyko rezervuoti netlink valdiklio saito būsenos stebėjimui: %s" + +#: ../src/nm-netlink-monitor.c:265 +#, c-format +msgid "unable to connect to netlink for monitoring link status: %s" +msgstr "nepavyko prisijungti prie netlink saito būsenos stebėjimui: %s" + +#: ../src/nm-netlink-monitor.c:273 +#, c-format +msgid "unable to join netlink group for monitoring link status: %s" +msgstr "nepavyko prisijungti prie netlink grupės saito būsenos stebėjimui: %s" + +#: ../src/nm-netlink-monitor.c:281 +#, c-format +msgid "unable to allocate netlink link cache for monitoring link status: %s" +msgstr "nepavyko rezervuoti netlink saito podėlio saito būsenos stebėjimui: %s" + +#: ../src/nm-netlink-monitor.c:422 +#, c-format +msgid "error updating link cache: %s" +msgstr "klaida atnaujinant saito podėlį: %s" + +#: ../src/nm-netlink-monitor.c:488 +msgid "error occurred while waiting for data on socket" +msgstr "laukiant lizde duomenų įvyko klaida" + +#: ../src/NetworkManager.c:293 +#, c-format +msgid "Invalid option. Please use --help to see a list of valid options.\n" +msgstr "" +"Netinkama parinktis. Galimų parinkčių sąrašą galite pamatyti naudodami " +"parametrą --help.\n" + +#: ../src/dhcp-manager/nm-dhcp-dhclient.c:94 +msgid "# Created by NetworkManager\n" +msgstr "# Sukurta NetworkManager programos\n" + +#: ../src/dhcp-manager/nm-dhcp-dhclient.c:100 +#, c-format +msgid "" +"# Merged from %s\n" +"\n" +msgstr "" +"# Sulieta iš %s\n" +"\n" + +#: ../src/named-manager/nm-named-manager.c:256 +msgid "NOTE: the libc resolver may not support more than 3 nameservers." +msgstr "" +"PASTABA: libc sprendiklis gali nepalaikyti daugiau nei 3 vardų serverių." + +#: ../src/named-manager/nm-named-manager.c:258 +msgid "The nameservers listed below may not be recognized." +msgstr "Žemiau pateikti vardų serveriai gali būti neatpažinti." + +#: ../system-settings/src/nm-default-wired-connection.c:182 +#, c-format +msgid "Auto %s" +msgstr "Automatinis %s" + +#~ msgid "Not enough memory to create private key decryption key." +#~ msgstr "Nepakanka atminties asmeninio rakto iššifravimo rakto sukūrimui." Index: NetworkManager-0.7.1/src/Makefile.am =================================================================== --- NetworkManager-0.7.1.orig/src/Makefile.am +++ NetworkManager-0.7.1/src/Makefile.am @@ -6,6 +6,7 @@ SUBDIRS= \ ppp-manager \ backends \ dnsmasq-manager \ + modem-manager \ . \ tests @@ -17,6 +18,7 @@ INCLUDES = -I${top_srcdir} -I${top_srcdir}/src/dhcp-manager \ -I${top_srcdir}/src/supplicant-manager \ -I${top_srcdir}/src/dnsmasq-manager \ + -I${top_srcdir}/src/modem-manager \ -I${top_srcdir}/libnm-util \ -I${top_srcdir}/callouts @@ -87,14 +89,6 @@ NetworkManager_SOURCES = \ nm-activation-request.h \ nm-properties-changed-signal.c \ nm-properties-changed-signal.h \ - nm-serial-device.c \ - nm-serial-device.h \ - nm-gsm-device.c \ - nm-gsm-device.h \ - nm-cdma-device.c \ - nm-cdma-device.h \ - nm-hso-gsm-device.c \ - nm-hso-gsm-device.h \ wpa.c \ wpa.h \ nm-netlink.c \ @@ -117,15 +111,6 @@ nm-device-ethernet-glue.h: $(top_srcdir) nm-device-wifi-glue.h: $(top_srcdir)/introspection/nm-device-wifi.xml dbus-binding-tool --prefix=nm_device_wifi --mode=glib-server --output=$@ $< -nm-serial-device-glue.h: $(top_srcdir)/introspection/nm-device-serial.xml - dbus-binding-tool --prefix=nm_serial_device --mode=glib-server --output=$@ $< - -nm-cdma-device-glue.h: $(top_srcdir)/introspection/nm-device-cdma.xml - dbus-binding-tool --prefix=nm_cdma_device --mode=glib-server --output=$@ $< - -nm-gsm-device-glue.h: $(top_srcdir)/introspection/nm-device-gsm.xml - dbus-binding-tool --prefix=nm_gsm_device --mode=glib-server --output=$@ $< - nm-ip4-config-glue.h: $(top_srcdir)/introspection/nm-ip4-config.xml dbus-binding-tool --prefix=nm_ip4_config --mode=glib-server --output=$@ $< @@ -141,9 +126,6 @@ BUILT_SOURCES = \ nm-device-interface-glue.h \ nm-device-ethernet-glue.h \ nm-device-wifi-glue.h \ - nm-serial-device-glue.h \ - nm-cdma-device-glue.h \ - nm-gsm-device-glue.h \ nm-ip4-config-glue.h \ nm-active-connection-glue.h \ nm-dhcp4-config-glue.h @@ -154,7 +136,6 @@ NetworkManager_CPPFLAGS = \ $(HAL_CFLAGS) \ $(OPENSSL_CFLAGS) \ $(LIBNL_CFLAGS) \ - $(LIBUDEV_CFLAGS) \ -DG_DISABLE_DEPRECATED \ -DBINDIR=\"$(bindir)\" \ -DSBINDIR=\"$(sbindir)\" \ @@ -171,7 +152,6 @@ NetworkManager_LDADD = \ $(GLIB_LIBS) \ $(HAL_LIBS) \ $(LIBNL_LIBS) \ - $(LIBUDEV_LIBS) \ $(top_builddir)/marshallers/libmarshallers.la \ ./named-manager/libnamed-manager.la \ ./vpn-manager/libvpn-manager.la \ @@ -179,6 +159,7 @@ NetworkManager_LDADD = \ ./supplicant-manager/libsupplicant-manager.la \ ./dnsmasq-manager/libdnsmasq-manager.la \ ./ppp-manager/libppp-manager.la \ + ./modem-manager/libmodem-manager.la \ ./backends/libnmbackend.la \ $(top_builddir)/libnm-util/libnm-util.la Index: NetworkManager-0.7.1/src/NetworkManagerPolicy.c =================================================================== --- NetworkManager-0.7.1.orig/src/NetworkManagerPolicy.c +++ NetworkManager-0.7.1/src/NetworkManagerPolicy.c @@ -34,15 +34,13 @@ #include "nm-device.h" #include "nm-device-wifi.h" #include "nm-device-ethernet.h" -#include "nm-hso-gsm-device.h" -#include "nm-gsm-device.h" -#include "nm-cdma-device.h" #include "nm-dbus-manager.h" #include "nm-setting-ip4-config.h" #include "nm-setting-connection.h" #include "NetworkManagerSystem.h" #include "nm-named-manager.h" #include "nm-vpn-manager.h" +#include "nm-modem.h" typedef struct LookupThread LookupThread; @@ -234,8 +232,7 @@ get_best_device (NMManager *manager, NMA } } - /* 'hso' devices never get a gateway from the remote end */ - if (!can_default && !NM_IS_HSO_GSM_DEVICE (dev)) + if (!can_default && !NM_IS_MODEM (dev)) continue; /* 'never-default' devices can't ever be the default */ Index: NetworkManager-0.7.1/src/NetworkManagerUtils.c =================================================================== --- NetworkManager-0.7.1.orig/src/NetworkManagerUtils.c +++ NetworkManager-0.7.1/src/NetworkManagerUtils.c @@ -291,48 +291,6 @@ nm_utils_merge_ip4_config (NMIP4Config * nm_ip4_config_set_never_default (ip4_config, TRUE); } -static void -nm_gvalue_destroy (gpointer data) -{ - GValue *value = (GValue *) data; - - g_value_unset (value); - g_slice_free (GValue, value); -} - -static GValue * -str_to_gvalue (const char *str) -{ - GValue *value; - - value = g_slice_new0 (GValue); - g_value_init (value, G_TYPE_STRING); - g_value_set_string (value, str); - return value; -} - -static GValue * -op_to_gvalue (const char *op) -{ - GValue *value; - - value = g_slice_new0 (GValue); - g_value_init (value, DBUS_TYPE_G_OBJECT_PATH); - g_value_set_boxed (value, op); - return value; -} - -static GValue * -uint_to_gvalue (guint32 val) -{ - GValue *value; - - value = g_slice_new0 (GValue); - g_value_init (value, G_TYPE_UINT); - g_value_set_uint (value, val); - return value; -} - void nm_utils_call_dispatcher (const char *action, NMConnection *connection, @@ -367,57 +325,48 @@ nm_utils_call_dispatcher (const char *ac if (connection) { connection_hash = nm_connection_to_hash (connection); - connection_props = g_hash_table_new_full (g_str_hash, g_str_equal, - NULL, nm_gvalue_destroy); + connection_props = value_hash_create (); /* Service name */ if (nm_connection_get_scope (connection) == NM_CONNECTION_SCOPE_USER) { - g_hash_table_insert (connection_props, - NMD_CONNECTION_PROPS_SERVICE_NAME, - str_to_gvalue (NM_DBUS_SERVICE_USER_SETTINGS)); + value_hash_add_str (connection_props, + NMD_CONNECTION_PROPS_SERVICE_NAME, + NM_DBUS_SERVICE_USER_SETTINGS); } else if (nm_connection_get_scope (connection) == NM_CONNECTION_SCOPE_SYSTEM) { - g_hash_table_insert (connection_props, - NMD_CONNECTION_PROPS_SERVICE_NAME, - str_to_gvalue (NM_DBUS_SERVICE_SYSTEM_SETTINGS)); + value_hash_add_str (connection_props, + NMD_CONNECTION_PROPS_SERVICE_NAME, + NM_DBUS_SERVICE_SYSTEM_SETTINGS); } /* path */ - g_hash_table_insert (connection_props, - NMD_CONNECTION_PROPS_PATH, - op_to_gvalue (nm_connection_get_path (connection))); + value_hash_add_object_path (connection_props, + NMD_CONNECTION_PROPS_PATH, + nm_connection_get_path (connection)); } else { - connection_hash = g_hash_table_new (g_direct_hash, g_direct_equal); - connection_props = g_hash_table_new (g_direct_hash, g_direct_equal); + connection_hash = value_hash_create (); + connection_props = value_hash_create (); } - device_props = g_hash_table_new_full (g_str_hash, g_str_equal, - NULL, nm_gvalue_destroy); + device_props = value_hash_create (); /* Hostname actions do not require a device */ if (strcmp (action, "hostname")) { /* interface */ - g_hash_table_insert (device_props, NMD_DEVICE_PROPS_INTERFACE, - str_to_gvalue (nm_device_get_iface (device))); + value_hash_add_str (device_props, NMD_DEVICE_PROPS_INTERFACE, nm_device_get_iface (device)); /* IP interface */ if (vpn_iface) { - g_hash_table_insert (device_props, NMD_DEVICE_PROPS_IP_INTERFACE, - str_to_gvalue (vpn_iface)); + value_hash_add_str (device_props, NMD_DEVICE_PROPS_IP_INTERFACE, vpn_iface); } else if (nm_device_get_ip_iface (device)) { - g_hash_table_insert (device_props, NMD_DEVICE_PROPS_IP_INTERFACE, - str_to_gvalue (nm_device_get_ip_iface (device))); + value_hash_add_str (device_props, NMD_DEVICE_PROPS_IP_INTERFACE, nm_device_get_ip_iface (device)); } /* type */ - g_hash_table_insert (device_props, NMD_DEVICE_PROPS_TYPE, - uint_to_gvalue (nm_device_get_device_type (device))); + value_hash_add_uint (device_props, NMD_DEVICE_PROPS_TYPE, nm_device_get_device_type (device)); /* state */ - g_hash_table_insert (device_props, NMD_DEVICE_PROPS_STATE, - uint_to_gvalue (nm_device_get_state (device))); - - g_hash_table_insert (device_props, NMD_DEVICE_PROPS_PATH, - op_to_gvalue (nm_device_get_udi (device))); + value_hash_add_uint (device_props, NMD_DEVICE_PROPS_STATE, nm_device_get_state (device)); + value_hash_add_object_path (device_props, NMD_DEVICE_PROPS_PATH, nm_device_get_udi (device)); } dbus_g_proxy_call_no_reply (proxy, "Action", @@ -434,3 +383,69 @@ nm_utils_call_dispatcher (const char *ac g_object_unref (dbus_mgr); } +/*********************************/ + +static void +nm_gvalue_destroy (gpointer data) +{ + GValue *value = (GValue *) data; + + g_value_unset (value); + g_slice_free (GValue, value); +} + +GHashTable * +value_hash_create (void) +{ + return g_hash_table_new_full (g_str_hash, g_str_equal, g_free, nm_gvalue_destroy); +} + +void +value_hash_add (GHashTable *hash, + const char *key, + GValue *value) +{ + g_hash_table_insert (hash, g_strdup (key), value); +} + +void +value_hash_add_str (GHashTable *hash, + const char *key, + const char *str) +{ + GValue *value; + + value = g_slice_new0 (GValue); + g_value_init (value, G_TYPE_STRING); + g_value_set_string (value, str); + + value_hash_add (hash, key, value); +} + +void +value_hash_add_object_path (GHashTable *hash, + const char *key, + const char *op) +{ + GValue *value; + + value = g_slice_new0 (GValue); + g_value_init (value, DBUS_TYPE_G_OBJECT_PATH); + g_value_set_boxed (value, op); + + value_hash_add (hash, key, value); +} + +void +value_hash_add_uint (GHashTable *hash, + const char *key, + guint32 val) +{ + GValue *value; + + value = g_slice_new0 (GValue); + g_value_init (value, G_TYPE_UINT); + g_value_set_uint (value, val); + + value_hash_add (hash, key, value); +} Index: NetworkManager-0.7.1/src/NetworkManagerUtils.h =================================================================== --- NetworkManager-0.7.1.orig/src/NetworkManagerUtils.h +++ NetworkManager-0.7.1/src/NetworkManagerUtils.h @@ -46,5 +46,23 @@ void nm_utils_call_dispatcher (const cha NMDevice *device, const char *vpn_iface); -#endif +GHashTable *value_hash_create (void); +void value_hash_add (GHashTable *hash, + const char *key, + GValue *value); + +void value_hash_add_str (GHashTable *hash, + const char *key, + const char *str); + +void value_hash_add_object_path (GHashTable *hash, + const char *key, + const char *op); + +void value_hash_add_uint (GHashTable *hash, + const char *key, + guint32 val); + + +#endif /* NETWORK_MANAGER_UTILS_H */ Index: NetworkManager-0.7.1/src/modem-manager/Makefile.am =================================================================== --- /dev/null +++ NetworkManager-0.7.1/src/modem-manager/Makefile.am @@ -0,0 +1,41 @@ +INCLUDES = \ + -I${top_srcdir}/src \ + -I${top_srcdir}/include \ + -I${top_srcdir}/libnm-util \ + -I${top_builddir}/marshallers + +noinst_LTLIBRARIES = libmodem-manager.la + +libmodem_manager_la_SOURCES = \ + nm-modem-cdma.c \ + nm-modem-cdma.h \ + nm-modem-gsm.c \ + nm-modem-gsm.h \ + nm-modem.c \ + nm-modem.h \ + nm-modem-manager.h \ + nm-modem-manager.c \ + nm-modem-types.h + +libmodem_manager_la_CPPFLAGS = \ + $(DBUS_CFLAGS) + +libmodem_manager_la_LIBADD = \ + $(DBUS_LIBS) \ + $(top_builddir)/marshallers/libmarshallers.la + +nm-device-cdma-glue.h: $(top_srcdir)/introspection/nm-device-cdma.xml + dbus-binding-tool --prefix=nm_device_cdma --mode=glib-server --output=$@ $< + +nm-device-gsm-glue.h: $(top_srcdir)/introspection/nm-device-gsm.xml + dbus-binding-tool --prefix=nm_device_gsm --mode=glib-server --output=$@ $< + +nm-serial-device-glue.h: $(top_srcdir)/introspection/nm-device-serial.xml + dbus-binding-tool --prefix=nm_serial_device --mode=glib-server --output=$@ $< + +BUILT_SOURCES = \ + nm-device-cdma-glue.h \ + nm-device-gsm-glue.h \ + nm-serial-device-glue.h + +CLEANFILES = $(BUILT_SOURCES) Index: NetworkManager-0.7.1/src/modem-manager/nm-modem-cdma.c =================================================================== --- /dev/null +++ NetworkManager-0.7.1/src/modem-manager/nm-modem-cdma.c @@ -0,0 +1,209 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ + +#include <string.h> + +#include "nm-dbus-glib-types.h" +#include "nm-modem-cdma.h" +#include "nm-modem-types.h" +#include "nm-device-interface.h" +#include "nm-device-private.h" +#include "nm-dbus-manager.h" +#include "nm-setting-connection.h" +#include "nm-setting-cdma.h" +#include "nm-utils.h" +#include "NetworkManagerUtils.h" + +#include "nm-device-cdma-glue.h" + +G_DEFINE_TYPE (NMModemCdma, nm_modem_cdma, NM_TYPE_MODEM) + +NMDevice * +nm_modem_cdma_new (const char *path, + const char *data_device, + const char *driver) +{ + g_return_val_if_fail (path != NULL, NULL); + g_return_val_if_fail (data_device != NULL, NULL); + g_return_val_if_fail (driver != NULL, NULL); + + return (NMDevice *) g_object_new (NM_TYPE_MODEM_CDMA, + NM_DEVICE_INTERFACE_UDI, path, + NM_DEVICE_INTERFACE_IFACE, data_device, + NM_DEVICE_INTERFACE_DRIVER, driver, + NM_DEVICE_INTERFACE_MANAGED, TRUE, + NM_MODEM_PATH, path, + NULL); +} + +static void +stage1_prepare_done (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data) +{ + NMDevice *device = NM_DEVICE (user_data); + GError *error = NULL; + + dbus_g_proxy_end_call (proxy, call_id, &error, G_TYPE_INVALID); + if (!error) + nm_device_activate_schedule_stage2_device_config (device); + else { + nm_warning ("CDMA modem connection failed: %s", error->message); + g_error_free (error); + nm_device_state_changed (device, NM_DEVICE_STATE_FAILED, NM_DEVICE_STATE_REASON_NONE); + } +} + +static GHashTable * +create_connect_properties (NMConnection *connection) +{ + NMSettingCdma *setting; + GHashTable *properties; + const char *str; + + setting = NM_SETTING_CDMA (nm_connection_get_setting (connection, NM_TYPE_SETTING_CDMA)); + properties = value_hash_create (); + + str = nm_setting_cdma_get_number (setting); + if (str) + value_hash_add_str (properties, "number", str); + + return properties; +} + +static NMActStageReturn +real_act_stage1_prepare (NMDevice *device, NMDeviceStateReason *reason) +{ + NMConnection *connection; + GHashTable *properties; + + connection = nm_act_request_get_connection (nm_device_get_act_request (device)); + g_assert (connection); + + properties = create_connect_properties (connection); + dbus_g_proxy_begin_call_with_timeout (nm_modem_get_proxy (NM_MODEM (device), MM_DBUS_INTERFACE_MODEM_SIMPLE), + "Connect", stage1_prepare_done, + device, NULL, 120000, + DBUS_TYPE_G_MAP_OF_VARIANT, properties, + G_TYPE_INVALID); + + return NM_ACT_STAGE_RETURN_POSTPONE; +} + +static NMConnection * +real_get_best_auto_connection (NMDevice *dev, + GSList *connections, + char **specific_object) +{ + GSList *iter; + + for (iter = connections; iter; iter = g_slist_next (iter)) { + NMConnection *connection = NM_CONNECTION (iter->data); + NMSettingConnection *s_con; + + s_con = (NMSettingConnection *) nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION); + g_assert (s_con); + + if (!nm_setting_connection_get_autoconnect (s_con)) + continue; + + if (strcmp (nm_setting_connection_get_connection_type (s_con), NM_SETTING_CDMA_SETTING_NAME)) + continue; + + return connection; + } + return NULL; +} + +static void +real_connection_secrets_updated (NMDevice *dev, + NMConnection *connection, + GSList *updated_settings, + RequestSecretsCaller caller) +{ + NMActRequest *req; + gboolean found = FALSE; + GSList *iter; + + if (caller == SECRETS_CALLER_PPP) { + NMPPPManager *ppp_manager; + NMSettingCdma *s_cdma = NULL; + + ppp_manager = nm_modem_get_ppp_manager (NM_MODEM (dev)); + g_return_if_fail (ppp_manager != NULL); + + s_cdma = (NMSettingCdma *) nm_connection_get_setting (connection, NM_TYPE_SETTING_CDMA); + if (!s_cdma) { + /* Shouldn't ever happen */ + nm_ppp_manager_update_secrets (ppp_manager, + nm_device_get_iface (dev), + NULL, + NULL, + "missing CDMA setting; no secrets could be found."); + } else { + const char *username = nm_setting_cdma_get_username (s_cdma); + const char *password = nm_setting_cdma_get_password (s_cdma); + + nm_ppp_manager_update_secrets (ppp_manager, + nm_device_get_iface (dev), + username ? username : "", + password ? password : "", + NULL); + } + return; + } + + g_return_if_fail (caller == SECRETS_CALLER_CDMA); + g_return_if_fail (nm_device_get_state (dev) == NM_DEVICE_STATE_NEED_AUTH); + + for (iter = updated_settings; iter; iter = g_slist_next (iter)) { + const char *setting_name = (const char *) iter->data; + + if (!strcmp (setting_name, NM_SETTING_CDMA_SETTING_NAME)) + found = TRUE; + else + nm_warning ("Ignoring updated secrets for setting '%s'.", setting_name); + } + + if (!found) + return; + + req = nm_device_get_act_request (dev); + g_assert (req); + + g_return_if_fail (nm_act_request_get_connection (req) == connection); + + nm_device_activate_schedule_stage1_device_prepare (dev); +} + +static const char * +real_get_ppp_name (NMModem *device, NMConnection *connection) +{ + NMSettingCdma *s_cdma; + + s_cdma = (NMSettingCdma *) nm_connection_get_setting (connection, NM_TYPE_SETTING_CDMA); + g_assert (s_cdma); + + return nm_setting_cdma_get_username (s_cdma); +} + +/*****************************************************************************/ + +static void +nm_modem_cdma_init (NMModemCdma *self) +{ + nm_device_set_device_type (NM_DEVICE (self), NM_DEVICE_TYPE_CDMA); +} + +static void +nm_modem_cdma_class_init (NMModemCdmaClass *klass) +{ + NMDeviceClass *device_class = NM_DEVICE_CLASS (klass); + NMModemClass *modem_class = NM_MODEM_CLASS (klass); + + /* Virtual methods */ + device_class->get_best_auto_connection = real_get_best_auto_connection; + device_class->connection_secrets_updated = real_connection_secrets_updated; + device_class->act_stage1_prepare = real_act_stage1_prepare; + modem_class->get_ppp_name = real_get_ppp_name; + + dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (klass), + &dbus_glib_nm_device_cdma_object_info); +} Index: NetworkManager-0.7.1/src/modem-manager/nm-modem-cdma.h =================================================================== --- /dev/null +++ NetworkManager-0.7.1/src/modem-manager/nm-modem-cdma.h @@ -0,0 +1,36 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ + +#ifndef NM_MODEM_CDMA_H +#define NM_MODEM_CDMA_H + +#include <nm-modem.h> + +G_BEGIN_DECLS + +#define NM_TYPE_MODEM_CDMA (nm_modem_cdma_get_type ()) +#define NM_MODEM_CDMA(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_MODEM_CDMA, NMModemCdma)) +#define NM_MODEM_CDMA_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_MODEM_CDMA, NMModemCdmaClass)) +#define NM_IS_MODEM_CDMA(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_MODEM_CDMA)) +#define NM_IS_MODEM_CDMA_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_MODEM_CDMA)) +#define NM_MODEM_CDMA_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_MODEM_CDMA, NMModemCdmaClass)) + +typedef struct { + NMModem parent; +} NMModemCdma; + +typedef struct { + NMModemClass parent; + + /* Signals */ + void (*signal_quality) (NMModemCdma *self, guint32 quality); +} NMModemCdmaClass; + +GType nm_modem_cdma_get_type (void); + +NMDevice *nm_modem_cdma_new (const char *path, + const char *data_device, + const char *driver); + +G_END_DECLS + +#endif /* NM_MODEM_CDMA_H */ Index: NetworkManager-0.7.1/src/modem-manager/nm-modem-gsm.c =================================================================== --- /dev/null +++ NetworkManager-0.7.1/src/modem-manager/nm-modem-gsm.c @@ -0,0 +1,342 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ + +#include <string.h> +#include "nm-dbus-glib-types.h" +#include "nm-modem-gsm.h" +#include "nm-device-private.h" +#include "nm-device-interface.h" +#include "nm-setting-connection.h" +#include "nm-setting-gsm.h" +#include "nm-modem-types.h" +#include "nm-utils.h" +#include "NetworkManagerUtils.h" + +#include "nm-device-gsm-glue.h" + +#define GSM_SECRETS_TRIES "gsm-secrets-tries" + +G_DEFINE_TYPE (NMModemGsm, nm_modem_gsm, NM_TYPE_MODEM) + +NMDevice * +nm_modem_gsm_new (const char *path, + const char *data_device, + const char *driver, + guint32 ip_method) +{ + g_return_val_if_fail (path != NULL, NULL); + g_return_val_if_fail (data_device != NULL, NULL); + g_return_val_if_fail (driver != NULL, NULL); + + return (NMDevice *) g_object_new (NM_TYPE_MODEM_GSM, + NM_DEVICE_INTERFACE_UDI, path, + NM_DEVICE_INTERFACE_IFACE, data_device, + NM_DEVICE_INTERFACE_DRIVER, driver, + NM_DEVICE_INTERFACE_MANAGED, TRUE, + NM_MODEM_PATH, path, + NM_MODEM_IP_METHOD, ip_method, + NULL); +} + +static NMDeviceStateReason +translate_mm_error (GError *error) +{ + NMDeviceStateReason reason; + + if (dbus_g_error_has_name (error, MM_MODEM_CONNECT_ERROR_NO_CARRIER)) + reason = NM_DEVICE_STATE_REASON_MODEM_NO_CARRIER; + if (dbus_g_error_has_name (error, MM_MODEM_CONNECT_ERROR_NO_DIALTONE)) + reason = NM_DEVICE_STATE_REASON_MODEM_DIAL_TIMEOUT; + if (dbus_g_error_has_name (error, MM_MODEM_CONNECT_ERROR_BUSY)) + reason = NM_DEVICE_STATE_REASON_MODEM_BUSY; + if (dbus_g_error_has_name (error, MM_MODEM_CONNECT_ERROR_NO_ANSWER)) + reason = NM_DEVICE_STATE_REASON_MODEM_DIAL_TIMEOUT; + if (dbus_g_error_has_name (error, MM_MODEM_ERROR_NETWORK_NOT_ALLOWED)) + reason = NM_DEVICE_STATE_REASON_GSM_REGISTRATION_DENIED; + if (dbus_g_error_has_name (error, MM_MODEM_ERROR_NETWORK_TIMEOUT)) + reason = NM_DEVICE_STATE_REASON_GSM_REGISTRATION_TIMEOUT; + if (dbus_g_error_has_name (error, MM_MODEM_ERROR_NO_NETWORK)) + reason = NM_DEVICE_STATE_REASON_GSM_REGISTRATION_NOT_SEARCHING; + + /* FIXME: We have only GSM error messages here, and we have no idea which + activation state failed. Reasons like: + NM_DEVICE_STATE_REASON_MODEM_DIAL_FAILED, + NM_DEVICE_STATE_REASON_MODEM_INIT_FAILED, + NM_DEVICE_STATE_REASON_GSM_APN_FAILED, + NM_DEVICE_STATE_REASON_GSM_REGISTRATION_FAILED, + NM_DEVICE_STATE_REASON_GSM_PIN_CHECK_FAILED + are not used. + */ + else + reason = NM_DEVICE_STATE_REASON_UNKNOWN; + + return reason; +} + +static void +clear_pin (NMDevice *device) +{ + NMActRequest *req; + NMConnection *connection; + NMSettingGsm *setting; + + req = nm_device_get_act_request (device); + g_assert (req); + connection = nm_act_request_get_connection (req); + g_assert (connection); + setting = NM_SETTING_GSM (nm_connection_get_setting (connection, NM_TYPE_SETTING_GSM)); + g_assert (setting); + + g_object_set (G_OBJECT (setting), NM_SETTING_GSM_PIN, NULL, NULL); +} + +static void +stage1_prepare_done (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data) +{ + NMDevice *device = NM_DEVICE (user_data); + GError *error = NULL; + + dbus_g_proxy_end_call (proxy, call_id, &error, G_TYPE_INVALID); + if (!error) + nm_device_activate_schedule_stage2_device_config (device); + else { + const char *required_secret = NULL; + gboolean retry_secret = FALSE; + + if (dbus_g_error_has_name (error, MM_MODEM_ERROR_SIM_PIN)) + required_secret = NM_SETTING_GSM_PIN; + else if (dbus_g_error_has_name (error, MM_MODEM_ERROR_SIM_PUK)) + required_secret = NM_SETTING_GSM_PUK; + else if (dbus_g_error_has_name (error, MM_MODEM_ERROR_SIM_WRONG)) { + clear_pin (device); + required_secret = NM_SETTING_GSM_PIN; + retry_secret = TRUE; + } else + nm_warning ("GSM modem connection failed: %s", error->message); + + if (required_secret) { + nm_device_state_changed (device, NM_DEVICE_STATE_NEED_AUTH, NM_DEVICE_STATE_REASON_NONE); + nm_act_request_request_connection_secrets (nm_device_get_act_request (device), + NM_SETTING_GSM_SETTING_NAME, + retry_secret, + SECRETS_CALLER_GSM, + required_secret, + NULL); + } else + nm_device_state_changed (device, NM_DEVICE_STATE_FAILED, translate_mm_error (error)); + + g_error_free (error); + } +} + +static GHashTable * +create_connect_properties (NMConnection *connection) +{ + NMSettingGsm *setting; + GHashTable *properties; + const char *str; + + setting = NM_SETTING_GSM (nm_connection_get_setting (connection, NM_TYPE_SETTING_GSM)); + properties = value_hash_create (); + + str = nm_setting_gsm_get_number (setting); + if (str) + value_hash_add_str (properties, "number", str); + + str = nm_setting_gsm_get_apn (setting); + if (str) + value_hash_add_str (properties, "apn", str); + + str = nm_setting_gsm_get_network_id (setting); + if (str) + value_hash_add_str (properties, "network_id", str); + + str = nm_setting_gsm_get_pin (setting); + if (str) + value_hash_add_str (properties, "pin", str); + + str = nm_setting_gsm_get_username (setting); + if (str) + value_hash_add_str (properties, "username", str); + + str = nm_setting_gsm_get_password (setting); + if (str) + value_hash_add_str (properties, "password", str); + + /* FIXME: network_type, band */ + + return properties; +} + +static NMActStageReturn +real_act_stage1_prepare (NMDevice *device, NMDeviceStateReason *reason) +{ + NMActRequest *req; + NMConnection *connection; + const char *setting_name; + GPtrArray *hints = NULL; + const char *hint1 = NULL, *hint2 = NULL; + guint32 tries; + + req = nm_device_get_act_request (device); + g_assert (req); + connection = nm_act_request_get_connection (req); + g_assert (connection); + + setting_name = nm_connection_need_secrets (connection, &hints); + if (!setting_name) { + GHashTable *properties; + + properties = create_connect_properties (connection); + dbus_g_proxy_begin_call_with_timeout (nm_modem_get_proxy (NM_MODEM (device), MM_DBUS_INTERFACE_MODEM_SIMPLE), + "Connect", stage1_prepare_done, + device, NULL, 120000, + DBUS_TYPE_G_MAP_OF_VARIANT, properties, + G_TYPE_INVALID); + + return NM_ACT_STAGE_RETURN_POSTPONE; + } + + if (hints) { + if (hints->len > 0) + hint1 = g_ptr_array_index (hints, 0); + if (hints->len > 1) + hint2 = g_ptr_array_index (hints, 1); + } + + nm_device_state_changed (device, NM_DEVICE_STATE_NEED_AUTH, NM_DEVICE_STATE_REASON_NONE); + + tries = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (connection), GSM_SECRETS_TRIES)); + nm_act_request_request_connection_secrets (req, + setting_name, + tries ? TRUE : FALSE, + SECRETS_CALLER_HSO_GSM, + hint1, + hint2); + g_object_set_data (G_OBJECT (connection), GSM_SECRETS_TRIES, GUINT_TO_POINTER (++tries)); + + if (hints) + g_ptr_array_free (hints, TRUE); + + return NM_ACT_STAGE_RETURN_POSTPONE; +} + +static NMConnection * +real_get_best_auto_connection (NMDevice *dev, + GSList *connections, + char **specific_object) +{ + GSList *iter; + + for (iter = connections; iter; iter = g_slist_next (iter)) { + NMConnection *connection = NM_CONNECTION (iter->data); + NMSettingConnection *s_con; + + s_con = (NMSettingConnection *) nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION); + g_assert (s_con); + + if (!nm_setting_connection_get_autoconnect (s_con)) + continue; + + if (strcmp (nm_setting_connection_get_connection_type (s_con), NM_SETTING_GSM_SETTING_NAME)) + continue; + + return connection; + } + return NULL; +} + +static void +real_connection_secrets_updated (NMDevice *dev, + NMConnection *connection, + GSList *updated_settings, + RequestSecretsCaller caller) +{ + NMActRequest *req; + gboolean found = FALSE; + GSList *iter; + + if (caller == SECRETS_CALLER_PPP) { + NMPPPManager *ppp_manager; + NMSettingGsm *s_gsm = NULL; + + ppp_manager = nm_modem_get_ppp_manager (NM_MODEM (dev)); + g_return_if_fail (ppp_manager != NULL); + + s_gsm = (NMSettingGsm *) nm_connection_get_setting (connection, NM_TYPE_SETTING_GSM); + if (!s_gsm) { + /* Shouldn't ever happen */ + nm_ppp_manager_update_secrets (ppp_manager, + nm_device_get_iface (dev), + NULL, + NULL, + "missing GSM setting; no secrets could be found."); + } else { + const char *username = nm_setting_gsm_get_username (s_gsm); + const char *password = nm_setting_gsm_get_password (s_gsm); + + nm_ppp_manager_update_secrets (ppp_manager, + nm_device_get_iface (dev), + username ? username : "", + password ? password : "", + NULL); + } + return; + } + + g_return_if_fail (caller == SECRETS_CALLER_GSM); + g_return_if_fail (nm_device_get_state (dev) == NM_DEVICE_STATE_NEED_AUTH); + + for (iter = updated_settings; iter; iter = g_slist_next (iter)) { + const char *setting_name = (const char *) iter->data; + + if (!strcmp (setting_name, NM_SETTING_GSM_SETTING_NAME)) + found = TRUE; + else + nm_warning ("Ignoring updated secrets for setting '%s'.", setting_name); + } + + if (!found) + return; + + req = nm_device_get_act_request (dev); + g_assert (req); + + g_return_if_fail (nm_act_request_get_connection (req) == connection); + + nm_device_activate_schedule_stage1_device_prepare (dev); +} + +static const char * +real_get_ppp_name (NMModem *device, NMConnection *connection) +{ + NMSettingGsm *s_gsm; + + s_gsm = (NMSettingGsm *) nm_connection_get_setting (connection, NM_TYPE_SETTING_GSM); + g_assert (s_gsm); + + return nm_setting_gsm_get_username (s_gsm); +} + +/*****************************************************************************/ + +static void +nm_modem_gsm_init (NMModemGsm *self) +{ + nm_device_set_device_type (NM_DEVICE (self), NM_DEVICE_TYPE_GSM); +} + +static void +nm_modem_gsm_class_init (NMModemGsmClass *klass) +{ + NMDeviceClass *device_class = NM_DEVICE_CLASS (klass); + NMModemClass *modem_class = NM_MODEM_CLASS (klass); + + /* Virtual methods */ + device_class->get_best_auto_connection = real_get_best_auto_connection; + device_class->connection_secrets_updated = real_connection_secrets_updated; + device_class->act_stage1_prepare = real_act_stage1_prepare; + modem_class->get_ppp_name = real_get_ppp_name; + + dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (klass), + &dbus_glib_nm_device_gsm_object_info); +} Index: NetworkManager-0.7.1/src/modem-manager/nm-modem-gsm.h =================================================================== --- /dev/null +++ NetworkManager-0.7.1/src/modem-manager/nm-modem-gsm.h @@ -0,0 +1,37 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ + +#ifndef NM_MODEM_GSM_H +#define NM_MODEM_GSM_H + +#include <nm-modem.h> + +G_BEGIN_DECLS + +#define NM_TYPE_MODEM_GSM (nm_modem_gsm_get_type ()) +#define NM_MODEM_GSM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_MODEM_GSM, NMModemGsm)) +#define NM_MODEM_GSM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_MODEM_GSM, NMModemGsmClass)) +#define NM_IS_MODEM_GSM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_MODEM_GSM)) +#define NM_IS_MODEM_GSM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_MODEM_GSM)) +#define NM_MODEM_GSM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_MODEM_GSM, NMModemGsmClass)) + +typedef struct { + NMModem parent; +} NMModemGsm; + +typedef struct { + NMModemClass parent; + + /* Signals */ + void (*signal_quality) (NMModemGsm *self, guint32 quality); +} NMModemGsmClass; + +GType nm_modem_gsm_get_type (void); + +NMDevice *nm_modem_gsm_new (const char *path, + const char *data_device, + const char *driver, + guint32 ip_method); + +G_END_DECLS + +#endif /* NM_MODEM_GSM_H */ Index: NetworkManager-0.7.1/src/modem-manager/nm-modem-manager.c =================================================================== --- /dev/null +++ NetworkManager-0.7.1/src/modem-manager/nm-modem-manager.c @@ -0,0 +1,403 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ + +#include <string.h> +#include "nm-modem-manager.h" +#include "nm-modem.h" +#include "nm-modem-gsm.h" +#include "nm-modem-cdma.h" +#include "nm-dbus-manager.h" +#include "nm-utils.h" +#include "nm-modem-types.h" + +#define MODEM_POKE_INTERVAL 120000 + +G_DEFINE_TYPE (NMModemManager, nm_modem_manager, G_TYPE_OBJECT) + +#define NM_MODEM_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_MODEM_MANAGER, NMModemManagerPrivate)) + +typedef struct { + NMDBusManager *dbus_mgr; + DBusGProxy *proxy; + GHashTable *modems; + gboolean disposed; + guint poke_id; +} NMModemManagerPrivate; + +enum { + DEVICE_ADDED, + DEVICE_REMOVED, + + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL] = { 0 }; + + +NMModemManager * +nm_modem_manager_get (void) +{ + static NMModemManager *singleton = NULL; + + if (!singleton) + singleton = NM_MODEM_MANAGER (g_object_new (NM_TYPE_MODEM_MANAGER, NULL)); + else + g_object_ref (singleton); + + g_assert (singleton); + return singleton; +} + +static gboolean +get_modem_properties (DBusGConnection *connection, + const char *path, + char **data_device, + char **driver, + guint32 *type, + guint32 *ip_method) +{ + DBusGProxy *proxy; + GValue value = { 0 }; + GError *err = NULL; + + proxy = dbus_g_proxy_new_for_name (connection, + MM_DBUS_SERVICE, + path, + "org.freedesktop.DBus.Properties"); + + if (dbus_g_proxy_call_with_timeout (proxy, "Get", 15000, &err, + G_TYPE_STRING, MM_DBUS_INTERFACE_MODEM, + G_TYPE_STRING, "Type", + G_TYPE_INVALID, + G_TYPE_VALUE, &value, + G_TYPE_INVALID)) { + *type = g_value_get_uint (&value); + g_value_unset (&value); + } else { + g_warning ("Could not get device type: %s", err->message); + goto out; + } + + if (dbus_g_proxy_call_with_timeout (proxy, "Get", 15000, &err, + G_TYPE_STRING, MM_DBUS_INTERFACE_MODEM, + G_TYPE_STRING, "IpMethod", + G_TYPE_INVALID, + G_TYPE_VALUE, &value, + G_TYPE_INVALID)) { + *ip_method = g_value_get_uint (&value); + g_value_unset (&value); + } else { + g_warning ("Could not get IP method: %s", err->message); + goto out; + } + + if (dbus_g_proxy_call_with_timeout (proxy, "Get", 15000, &err, + G_TYPE_STRING, MM_DBUS_INTERFACE_MODEM, + G_TYPE_STRING, "Device", + G_TYPE_INVALID, + G_TYPE_VALUE, &value, + G_TYPE_INVALID)) { + *data_device = g_value_dup_string (&value); + g_value_unset (&value); + } else { + g_warning ("Could not get modem data device: %s", err->message); + goto out; + } + + if (dbus_g_proxy_call_with_timeout (proxy, "Get", 15000, &err, + G_TYPE_STRING, MM_DBUS_INTERFACE_MODEM, + G_TYPE_STRING, "Driver", + G_TYPE_INVALID, + G_TYPE_VALUE, &value, + G_TYPE_INVALID)) { + *driver = g_value_dup_string (&value); + g_value_unset (&value); + } else { + g_warning ("Could not get modem driver: %s", err->message); + goto out; + } + + out: + if (err) + g_error_free (err); + + g_object_unref (proxy); + + return *data_device && *driver; +} + +static void +create_modem (NMModemManager *manager, const char *path) +{ + NMModemManagerPrivate *priv = NM_MODEM_MANAGER_GET_PRIVATE (manager); + NMDevice *device; + char *data_device = NULL; + char *driver = NULL; + uint modem_type = MM_MODEM_TYPE_UNKNOWN; + uint ip_method = MM_MODEM_IP_METHOD_PPP; + + if (g_hash_table_lookup (priv->modems, path)) { + nm_warning ("Modem with path %s already exists, ignoring", path); + return; + } + + if (!get_modem_properties (nm_dbus_manager_get_connection (priv->dbus_mgr), path, + &data_device, &driver, &modem_type, &ip_method)) + return; + + if (modem_type == MM_MODEM_TYPE_UNKNOWN) { + nm_warning ("Modem with path %s has unknown type, ignoring", path); + return; + } + + if (!driver || !strlen (driver)) { + nm_warning ("Modem with path %s has unknown driver, ignoring", path); + return; + } + + if (!data_device || !strlen (data_device)) { + nm_warning ("Modem with path %s has unknown data device, ignoring", path); + return; + } + + if (modem_type == MM_MODEM_TYPE_GSM) + device = nm_modem_gsm_new (path, data_device, driver, ip_method); + else if (modem_type == MM_MODEM_TYPE_CDMA) + device = nm_modem_cdma_new (path, data_device, driver); + else + g_error ("Invalid modem type"); + + g_free (data_device); + g_free (driver); + + if (device) { + g_hash_table_insert (priv->modems, g_strdup (path), device); + g_signal_emit (manager, signals[DEVICE_ADDED], 0, device); + } +} + +static void +modem_added (DBusGProxy *proxy, const char *path, gpointer user_data) +{ + create_modem (NM_MODEM_MANAGER (user_data), path); +} + +static void +modem_removed (DBusGProxy *proxy, const char *path, gpointer user_data) +{ + NMModemManagerPrivate *priv = NM_MODEM_MANAGER_GET_PRIVATE (user_data); + NMModem *modem; + + modem = (NMModem *) g_hash_table_lookup (priv->modems, path); + if (modem) { + g_signal_emit (user_data, signals[DEVICE_REMOVED], 0, modem); + g_hash_table_remove (priv->modems, path); + } +} + +static gboolean +poke_modem_cb (gpointer user_data) +{ + NMModemManager *self = NM_MODEM_MANAGER (user_data); + NMModemManagerPrivate *priv = NM_MODEM_MANAGER_GET_PRIVATE (self); + DBusGConnection *g_connection; + DBusGProxy *proxy; + + g_connection = nm_dbus_manager_get_connection (priv->dbus_mgr); + proxy = dbus_g_proxy_new_for_name (g_connection, + MM_DBUS_SERVICE, + MM_DBUS_PATH, + MM_DBUS_INTERFACE); + + nm_info ("Trying to start the modem-manager..."); + dbus_g_proxy_call_no_reply (proxy, "EnumerateDevices", G_TYPE_INVALID); + g_object_unref (proxy); + + return TRUE; +} + +static void +enumerate_devices_done (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer data) +{ + NMModemManager *manager = NM_MODEM_MANAGER (data); + GPtrArray *modems; + GError *error = NULL; + + if (!dbus_g_proxy_end_call (proxy, call_id, &error, + dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_G_OBJECT_PATH), &modems, + G_TYPE_INVALID)) { + nm_warning ("Could not get modem list: %s", error->message); + g_error_free (error); + } else { + int i; + + for (i = 0; i < modems->len; i++) { + char *path = (char *) g_ptr_array_index (modems, i); + + create_modem (manager, path); + g_free (path); + } + + g_ptr_array_free (modems, TRUE); + } +} + +static void +modem_manager_appeared (NMModemManager *self, gboolean enumerate_devices) +{ + NMModemManagerPrivate *priv = NM_MODEM_MANAGER_GET_PRIVATE (self); + + if (priv->poke_id) { + g_source_remove (priv->poke_id); + priv->poke_id = 0; + } + + priv->proxy = dbus_g_proxy_new_for_name (nm_dbus_manager_get_connection (priv->dbus_mgr), + MM_DBUS_SERVICE, MM_DBUS_PATH, MM_DBUS_INTERFACE); + + dbus_g_proxy_add_signal (priv->proxy, "DeviceAdded", DBUS_TYPE_G_OBJECT_PATH, G_TYPE_INVALID); + dbus_g_proxy_connect_signal (priv->proxy, "DeviceAdded", + G_CALLBACK (modem_added), self, + NULL); + + dbus_g_proxy_add_signal (priv->proxy, "DeviceRemoved", DBUS_TYPE_G_OBJECT_PATH, G_TYPE_INVALID); + dbus_g_proxy_connect_signal (priv->proxy, "DeviceRemoved", + G_CALLBACK (modem_removed), self, + NULL); + + if (enumerate_devices) + dbus_g_proxy_begin_call (priv->proxy, "EnumerateDevices", enumerate_devices_done, self, NULL, G_TYPE_INVALID); +} + +static gboolean +remove_one_modem (gpointer key, gpointer value, gpointer user_data) +{ + g_signal_emit (user_data, signals[DEVICE_REMOVED], 0, value); + + return TRUE; +} + +static void +modem_manager_disappeared (NMModemManager *self) +{ + NMModemManagerPrivate *priv = NM_MODEM_MANAGER_GET_PRIVATE (self); + + g_hash_table_foreach_remove (priv->modems, remove_one_modem, self); + + if (priv->proxy) { + g_object_unref (priv->proxy); + priv->proxy = NULL; + } + + /* Try to activate the modem-manager */ + poke_modem_cb (self); + priv->poke_id = g_timeout_add (MODEM_POKE_INTERVAL, poke_modem_cb, self); +} + +static void +nm_modem_manager_name_owner_changed (NMDBusManager *dbus_mgr, + const char *name, + const char *old_owner, + const char *new_owner, + gpointer user_data) +{ + gboolean old_owner_good; + gboolean new_owner_good; + + /* Can't handle the signal if its not from the modem service */ + if (strcmp (MM_DBUS_SERVICE, name) != 0) + return; + + old_owner_good = (old_owner && strlen (old_owner)); + new_owner_good = (new_owner && strlen (new_owner)); + + if (!old_owner_good && new_owner_good) { + nm_info ("modem manager appeared"); + modem_manager_appeared (NM_MODEM_MANAGER (user_data), FALSE); + } else if (old_owner_good && !new_owner_good) { + nm_info ("modem manager disappeared"); + modem_manager_disappeared (NM_MODEM_MANAGER (user_data)); + } +} + +/*******************************************************/ + +static void +nm_modem_manager_init (NMModemManager *self) +{ + NMModemManagerPrivate *priv = NM_MODEM_MANAGER_GET_PRIVATE (self); + + priv->modems = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); + priv->dbus_mgr = nm_dbus_manager_get (); + + g_signal_connect (priv->dbus_mgr, "name-owner-changed", + G_CALLBACK (nm_modem_manager_name_owner_changed), + self); + + if (nm_dbus_manager_name_has_owner (priv->dbus_mgr, MM_DBUS_SERVICE)) + modem_manager_appeared (self, TRUE); + else + modem_manager_disappeared (self); +} + +static void +dispose (GObject *object) +{ + NMModemManagerPrivate *priv = NM_MODEM_MANAGER_GET_PRIVATE (object); + + if (priv->disposed) + return; + + priv->disposed = TRUE; + + if (priv->poke_id) { + g_source_remove (priv->poke_id); + priv->poke_id = 0; + } + + g_hash_table_foreach_remove (priv->modems, remove_one_modem, object); + g_hash_table_destroy (priv->modems); + + if (priv->proxy) { + g_object_unref (priv->proxy); + priv->proxy = NULL; + } + + if (priv->dbus_mgr) { + g_object_unref (priv->dbus_mgr); + priv->dbus_mgr = NULL; + } + + /* Chain up to the parent class */ + G_OBJECT_CLASS (nm_modem_manager_parent_class)->dispose (object); +} + +static void +nm_modem_manager_class_init (NMModemManagerClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + g_type_class_add_private (object_class, sizeof (NMModemManagerPrivate)); + + object_class->dispose = dispose; + + /* signals */ + signals[DEVICE_ADDED] = + g_signal_new ("device-added", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (NMModemManagerClass, device_added), + NULL, NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, + G_TYPE_OBJECT); + + signals[DEVICE_REMOVED] = + g_signal_new ("device-removed", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (NMModemManagerClass, device_removed), + NULL, NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, + G_TYPE_OBJECT); +} Index: NetworkManager-0.7.1/src/modem-manager/nm-modem-manager.h =================================================================== --- /dev/null +++ NetworkManager-0.7.1/src/modem-manager/nm-modem-manager.h @@ -0,0 +1,35 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ + +#ifndef NM_MODEM_MANAGER_H +#define NM_MODEM_MANAGER_H + +#include <glib-object.h> +#include "nm-device.h" + +#define NM_TYPE_MODEM_MANAGER (nm_modem_manager_get_type ()) +#define NM_MODEM_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_MODEM_MANAGER, NMModemManager)) +#define NM_MODEM_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_MODEM_MANAGER, NMModemManagerClass)) +#define NM_IS_MODEM_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_MODEM_MANAGER)) +#define NM_IS_MODEM_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_MODEM_MANAGER)) +#define NM_MODEM_MANAGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_MODEM_MANAGER, NMModemManagerClass)) + +typedef struct { + GObject parent; +} NMModemManager; + +typedef struct { + GObjectClass parent; + + /* Signals */ + void (*device_added) (NMModemManager *manager, + NMDevice *device); + + void (*device_removed) (NMModemManager *manager, + NMDevice *device); +} NMModemManagerClass; + +GType nm_modem_manager_get_type (void); + +NMModemManager *nm_modem_manager_get (void); + +#endif /* NM_MODEM_MANAGER_H */ Index: NetworkManager-0.7.1/src/modem-manager/nm-modem-types.h =================================================================== --- /dev/null +++ NetworkManager-0.7.1/src/modem-manager/nm-modem-types.h @@ -0,0 +1,93 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ + +#ifndef NM_MODEM_TYPES_H +#define NM_MODEM_TYPES_H + +#define MM_DBUS_SERVICE "org.freedesktop.ModemManager" +#define MM_DBUS_PATH "/org/freedesktop/ModemManager" +#define MM_DBUS_INTERFACE "org.freedesktop.ModemManager" +#define MM_DBUS_INTERFACE_MODEM "org.freedesktop.ModemManager.Modem" +#define MM_DBUS_INTERFACE_MODEM_SIMPLE "org.freedesktop.ModemManager.Modem.Simple" +#define MM_DBUS_INTERFACE_MODEM_CDMA "org.freedesktop.ModemManager.Modem.Cdma" + +#define MM_DBUS_INTERFACE_MODEM_GSM_CARD "org.freedesktop.ModemManager.Modem.Gsm.Card" +#define MM_DBUS_INTERFACE_MODEM_GSM_NETWORK "org.freedesktop.ModemManager.Modem.Gsm.Network" + +#define MM_MODEM_TYPE_UNKNOWN 0 +#define MM_MODEM_TYPE_GSM 1 +#define MM_MODEM_TYPE_CDMA 2 + +#define MM_MODEM_IP_METHOD_PPP 0 +#define MM_MODEM_IP_METHOD_STATIC 1 +#define MM_MODEM_IP_METHOD_DHCP 2 + +/* Errors */ + +#define MM_SERIAL_OPEN_FAILED MM_DBUS_INTERFACE_MODEM ".SerialOpenFailed" +#define MM_SERIAL_SEND_FAILED MM_DBUS_INTERFACE_MODEM ".SerialSendFailed" +#define MM_SERIAL_RESPONSE_TIMEOUT MM_DBUS_INTERFACE_MODEM ".SerialResponseTimeout" + +#define MM_MODEM_ERROR_GENERAL MM_DBUS_INTERFACE_MODEM ".General" +#define MM_MODEM_ERROR_OPERATION_NOT_SUPPORTED MM_DBUS_INTERFACE_MODEM ".OperationNotSupported" + +#define MM_MODEM_CONNECT_ERROR_NO_CARRIER MM_DBUS_INTERFACE_MODEM ".NoCarrier" +#define MM_MODEM_CONNECT_ERROR_NO_DIALTONE MM_DBUS_INTERFACE_MODEM ".NoDialtone" +#define MM_MODEM_CONNECT_ERROR_BUSY MM_DBUS_INTERFACE_MODEM ".Busy" +#define MM_MODEM_CONNECT_ERROR_NO_ANSWER MM_DBUS_INTERFACE_MODEM ".NoAnswer" + +#define MM_MODEM_ERROR "org.freedesktop.ModemManager.Modem.Gsm" + +#define MM_MODEM_ERROR_PHONE_FAILURE MM_MODEM_ERROR ".PhoneFailure" +#define MM_MODEM_ERROR_NO_CONNECTION MM_MODEM_ERROR ".NoConnection" +#define MM_MODEM_ERROR_LINK_RESERVED MM_MODEM_ERROR ".LinkReserved" +#define MM_MODEM_ERROR_NOT_ALLOWED MM_MODEM_ERROR ".OperationNotAllowed" +#define MM_MODEM_ERROR_NOT_SUPPORTED MM_MODEM_ERROR ".OperationNotSupported" +#define MM_MODEM_ERROR_PH_SIM_PIN MM_MODEM_ERROR ".PhSimPinRequired" +#define MM_MODEM_ERROR_PH_FSIM_PIN MM_MODEM_ERROR ".PhFSimPinRequired" +#define MM_MODEM_ERROR_PH_FSIM_PUK MM_MODEM_ERROR ".PhFPukRequired" +#define MM_MODEM_ERROR_SIM_NOT_INSERTED MM_MODEM_ERROR ".SimNotInserted" +#define MM_MODEM_ERROR_SIM_PIN MM_MODEM_ERROR ".SimPinRequired" +#define MM_MODEM_ERROR_SIM_PUK MM_MODEM_ERROR ".SimPukRequired" +#define MM_MODEM_ERROR_SIM_FAILURE MM_MODEM_ERROR ".SimFailure" +#define MM_MODEM_ERROR_SIM_BUSY MM_MODEM_ERROR ".SimBusy" +#define MM_MODEM_ERROR_SIM_WRONG MM_MODEM_ERROR ".SimWrong" +#define MM_MODEM_ERROR_WRONG_PASSWORD MM_MODEM_ERROR ".IncorrectPassword" +#define MM_MODEM_ERROR_SIM_PIN2 MM_MODEM_ERROR ".SimPin2Required" +#define MM_MODEM_ERROR_SIM_PUK2 MM_MODEM_ERROR ".SimPuk2Required" +#define MM_MODEM_ERROR_MEMORY_FULL MM_MODEM_ERROR ".MemoryFull" +#define MM_MODEM_ERROR_INVALID_INDEX MM_MODEM_ERROR ".InvalidIndex" +#define MM_MODEM_ERROR_NOT_FOUND MM_MODEM_ERROR ".NotFound" +#define MM_MODEM_ERROR_MEMORY_FAILURE MM_MODEM_ERROR ".MemoryFailure" +#define MM_MODEM_ERROR_TEXT_TOO_LONG MM_MODEM_ERROR ".TextTooLong" +#define MM_MODEM_ERROR_INVALID_CHARS MM_MODEM_ERROR ".InvalidChars" +#define MM_MODEM_ERROR_DIAL_STRING_TOO_LONG MM_MODEM_ERROR ".DialStringTooLong" +#define MM_MODEM_ERROR_DIAL_STRING_INVALID MM_MODEM_ERROR ".InvalidDialString" +#define MM_MODEM_ERROR_NO_NETWORK MM_MODEM_ERROR ".NoNetwork" +#define MM_MODEM_ERROR_NETWORK_TIMEOUT MM_MODEM_ERROR ".NetworkTimeout" +#define MM_MODEM_ERROR_NETWORK_NOT_ALLOWED MM_MODEM_ERROR ".NetworkNotAllowed" +#define MM_MODEM_ERROR_NETWORK_PIN MM_MODEM_ERROR ".NetworkPinRequired" +#define MM_MODEM_ERROR_NETWORK_PUK MM_MODEM_ERROR ".NetworkPukRequired" +#define MM_MODEM_ERROR_NETWORK_SUBSET_PIN MM_MODEM_ERROR ".NetworkSubsetPinRequired" +#define MM_MODEM_ERROR_NETWORK_SUBSET_PUK MM_MODEM_ERROR ".NetworkSubsetPukRequired" +#define MM_MODEM_ERROR_SERVICE_PIN MM_MODEM_ERROR ".ServicePinRequired" +#define MM_MODEM_ERROR_SERVICE_PUK MM_MODEM_ERROR ".ServicePukRequired" +#define MM_MODEM_ERROR_CORP_PIN MM_MODEM_ERROR ".CorporatePinRequired" +#define MM_MODEM_ERROR_CORP_PUK MM_MODEM_ERROR ".CorporatePukRequired" +#define MM_MODEM_ERROR_HIDDEN_KEY MM_MODEM_ERROR ".HiddenKeyRequired" +#define MM_MODEM_ERROR_EAP_NOT_SUPPORTED MM_MODEM_ERROR ".EapMethodNotSupported" +#define MM_MODEM_ERROR_INCORRECT_PARAMS MM_MODEM_ERROR ".IncorrectParams" +#define MM_MODEM_ERROR_UNKNOWN MM_MODEM_ERROR ".Unknown" +#define MM_MODEM_ERROR_GPRS_ILLEGAL_MS MM_MODEM_ERROR ".GprsIllegalMs" +#define MM_MODEM_ERROR_GPRS_ILLEGAL_ME MM_MODEM_ERROR ".GprsIllegalMe" +#define MM_MODEM_ERROR_GPRS_SERVICE_NOT_ALLOWED MM_MODEM_ERROR ".GprsServiceNotAllowed" +#define MM_MODEM_ERROR_GPRS_PLMN_NOT_ALLOWED MM_MODEM_ERROR ".GprsPlmnNotAllowed" +#define MM_MODEM_ERROR_GPRS_LOCATION_NOT_ALLOWED MM_MODEM_ERROR ".GprsLocationNotAllowed" +#define MM_MODEM_ERROR_GPRS_ROAMING_NOT_ALLOWED MM_MODEM_ERROR ".GprsRoamingNotAllowed" +#define MM_MODEM_ERROR_GPRS_OPTION_NOT_SUPPORTED MM_MODEM_ERROR ".GprsOptionNotSupported" +#define MM_MODEM_ERROR_GPRS_NOT_SUBSCRIBED MM_MODEM_ERROR ".GprsNotSubscribed" +#define MM_MODEM_ERROR_GPRS_OUT_OF_ORDER MM_MODEM_ERROR ".GprsOutOfOrder" +#define MM_MODEM_ERROR_GPRS_PDP_AUTH_FAILURE MM_MODEM_ERROR ".GprsPdpAuthFailure" +#define MM_MODEM_ERROR_GPRS_UNKNOWN MM_MODEM_ERROR ".GprsUnspecified" +#define MM_MODEM_ERROR_GPRS_INVALID_CLASS MM_MODEM_ERROR ".GprsInvalidClass" + +#endif /* NM_MODEM_TYPES_H */ Index: NetworkManager-0.7.1/src/modem-manager/nm-modem.c =================================================================== --- /dev/null +++ NetworkManager-0.7.1/src/modem-manager/nm-modem.c @@ -0,0 +1,639 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ + +#include <string.h> +#include "nm-modem.h" +#include "nm-device-private.h" +#include "NetworkManagerSystem.h" +#include "nm-device-interface.h" +#include "nm-dbus-manager.h" +#include "nm-setting-connection.h" +#include "nm-setting-gsm.h" +#include "nm-setting-cdma.h" +#include "nm-marshal.h" +#include "nm-properties-changed-signal.h" +#include "nm-modem-types.h" +#include "nm-utils.h" +#include "nm-serial-device-glue.h" + +G_DEFINE_TYPE (NMModem, nm_modem, NM_TYPE_DEVICE) + +#define NM_MODEM_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_MODEM, NMModemPrivate)) + +enum { + PROP_0, + PROP_PATH, + PROP_IP_METHOD, + + LAST_PROP +}; + +typedef struct { + NMDBusManager *dbus_mgr; + char *path; + DBusGProxy *proxy; + NMPPPManager *ppp_manager; + NMIP4Config *pending_ip4_config; + guint32 ip_method; + + guint state_to_disconnected_id; + + /* PPP stats */ + guint32 in_bytes; + guint32 out_bytes; +} NMModemPrivate; + +enum { + PPP_STATS, + PROPERTIES_CHANGED, + + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL] = { 0 }; + +NMPPPManager * +nm_modem_get_ppp_manager (NMModem *self) +{ + g_return_val_if_fail (NM_IS_MODEM (self), NULL); + + return NM_MODEM_GET_PRIVATE (self)->ppp_manager; +} + +DBusGProxy * +nm_modem_get_proxy (NMModem *self, + const char *interface) +{ + + NMModemPrivate *priv = NM_MODEM_GET_PRIVATE (self); + const char *current_iface; + + g_return_val_if_fail (NM_IS_MODEM (self), NULL); + + /* Default to the default interface. */ + if (interface == NULL) + interface = MM_DBUS_INTERFACE_MODEM; + + current_iface = dbus_g_proxy_get_interface (priv->proxy); + if (!current_iface || strcmp (current_iface, interface)) + dbus_g_proxy_set_interface (priv->proxy, interface); + + return priv->proxy; +} + +const char * +nm_modem_get_ppp_name (NMModem *self, + NMConnection *connection) +{ + g_return_val_if_fail (NM_IS_MODEM (self), NULL); + g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL); + + if (NM_MODEM_GET_CLASS (self)->get_ppp_name) + return NM_MODEM_GET_CLASS (self)->get_ppp_name (self, connection); + + return NULL; +} + +/*****************************************************************************/ +/* IP method PPP */ + +static void +ppp_state_changed (NMPPPManager *ppp_manager, NMPPPStatus status, gpointer user_data) +{ + NMDevice *device = NM_DEVICE (user_data); + + switch (status) { + case NM_PPP_STATUS_NETWORK: + nm_device_state_changed (device, NM_DEVICE_STATE_IP_CONFIG, NM_DEVICE_STATE_REASON_NONE); + break; + case NM_PPP_STATUS_DISCONNECT: + nm_device_state_changed (device, NM_DEVICE_STATE_FAILED, NM_DEVICE_STATE_REASON_PPP_DISCONNECT); + break; + case NM_PPP_STATUS_DEAD: + nm_device_state_changed (device, NM_DEVICE_STATE_FAILED, NM_DEVICE_STATE_REASON_PPP_FAILED); + break; + case NM_PPP_STATUS_AUTHENTICATE: + nm_device_state_changed (device, NM_DEVICE_STATE_NEED_AUTH, NM_DEVICE_STATE_REASON_NONE); + break; + default: + break; + } +} + +static void +ppp_ip4_config (NMPPPManager *ppp_manager, + const char *iface, + NMIP4Config *config, + gpointer user_data) +{ + NMDevice *device = NM_DEVICE (user_data); + + nm_device_set_ip_iface (device, iface); + NM_MODEM_GET_PRIVATE (device)->pending_ip4_config = g_object_ref (config); + nm_device_activate_schedule_stage4_ip_config_get (device); +} + +static void +ppp_stats (NMPPPManager *ppp_manager, + guint32 in_bytes, + guint32 out_bytes, + gpointer user_data) +{ + NMModem *self = NM_MODEM (user_data); + NMModemPrivate *priv = NM_MODEM_GET_PRIVATE (self); + + if (priv->in_bytes != in_bytes || priv->out_bytes != out_bytes) { + priv->in_bytes = in_bytes; + priv->out_bytes = out_bytes; + + g_signal_emit (self, signals[PPP_STATS], 0, in_bytes, out_bytes); + } +} + +static NMActStageReturn +ppp_stage2_config (NMDevice *device, NMDeviceStateReason *reason) +{ + NMModemPrivate *priv = NM_MODEM_GET_PRIVATE (device); + NMActRequest *req; + const char *ppp_name = NULL; + GError *err = NULL; + NMActStageReturn ret; + + req = nm_device_get_act_request (device); + g_assert (req); + + ppp_name = nm_modem_get_ppp_name (NM_MODEM (device), + nm_act_request_get_connection (req)); + + priv->ppp_manager = nm_ppp_manager_new (nm_device_get_iface (device)); + if (nm_ppp_manager_start (priv->ppp_manager, req, ppp_name, &err)) { + g_signal_connect (priv->ppp_manager, "state-changed", + G_CALLBACK (ppp_state_changed), + device); + g_signal_connect (priv->ppp_manager, "ip4-config", + G_CALLBACK (ppp_ip4_config), + device); + g_signal_connect (priv->ppp_manager, "stats", + G_CALLBACK (ppp_stats), + device); + + ret = NM_ACT_STAGE_RETURN_POSTPONE; + } else { + nm_warning ("%s", err->message); + g_error_free (err); + + g_object_unref (priv->ppp_manager); + priv->ppp_manager = NULL; + + *reason = NM_DEVICE_STATE_REASON_PPP_START_FAILED; + ret = NM_ACT_STAGE_RETURN_FAILURE; + } + + return ret; +} + +static NMActStageReturn +ppp_stage4 (NMDevice *device, NMIP4Config **config, NMDeviceStateReason *reason) +{ + + NMModemPrivate *priv = NM_MODEM_GET_PRIVATE (device); + + *config = priv->pending_ip4_config; + priv->pending_ip4_config = NULL; + + return NM_ACT_STAGE_RETURN_SUCCESS; +} + +/*****************************************************************************/ +/* IP method static */ + +static void +static_stage3_done (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data) +{ + NMDevice *device = NM_DEVICE (user_data); + GValueArray *ret_array = NULL; + GError *error = NULL; + + if (dbus_g_proxy_end_call (proxy, call_id, &error, + G_TYPE_VALUE_ARRAY, &ret_array, + G_TYPE_INVALID)) { + + NMModemPrivate *priv = NM_MODEM_GET_PRIVATE (device); + NMIP4Address *addr; + int i; + + addr = nm_ip4_address_new (); + nm_ip4_address_set_address (addr, g_value_get_uint (g_value_array_get_nth (ret_array, 0))); + nm_ip4_address_set_prefix (addr, 32); + + priv->pending_ip4_config = nm_ip4_config_new (); + nm_ip4_config_take_address (priv->pending_ip4_config, addr); + + for (i = 1; i < ret_array->n_values; i++) + nm_ip4_config_add_nameserver (priv->pending_ip4_config, + g_value_get_uint (g_value_array_get_nth (ret_array, i))); + + g_value_array_free (ret_array); + nm_device_activate_schedule_stage4_ip_config_get (device); + } else { + nm_warning ("Retrieving IP4 configuration failed: %s", error->message); + g_error_free (error); + nm_device_state_changed (device, + NM_DEVICE_STATE_FAILED, + NM_DEVICE_STATE_REASON_IP_CONFIG_UNAVAILABLE); + } +} + +static NMActStageReturn +static_stage3_config (NMDevice *device, NMDeviceStateReason *reason) +{ + dbus_g_proxy_begin_call (nm_modem_get_proxy (NM_MODEM (device), MM_DBUS_INTERFACE_MODEM), + "GetIP4Config", static_stage3_done, + device, NULL, + G_TYPE_INVALID); + + return NM_ACT_STAGE_RETURN_POSTPONE; +} + +static NMActStageReturn +static_stage4 (NMDevice *device, NMIP4Config **config, NMDeviceStateReason *reason) +{ + NMModemPrivate *priv = NM_MODEM_GET_PRIVATE (device); + gboolean no_firmware = FALSE; + + if (!nm_device_hw_bring_up (device, TRUE, &no_firmware)) { + if (no_firmware) + *reason = NM_DEVICE_STATE_REASON_FIRMWARE_MISSING; + else + *reason = NM_DEVICE_STATE_REASON_CONFIG_FAILED; + return NM_ACT_STAGE_RETURN_FAILURE; + } + + *config = priv->pending_ip4_config; + priv->pending_ip4_config = NULL; + + return NM_ACT_STAGE_RETURN_SUCCESS; +} + +/*****************************************************************************/ + +static NMActStageReturn +real_act_stage2_config (NMDevice *device, NMDeviceStateReason *reason) +{ + NMActStageReturn ret; + + switch (NM_MODEM_GET_PRIVATE (device)->ip_method) { + case MM_MODEM_IP_METHOD_PPP: + ret = ppp_stage2_config (device, reason); + break; + case MM_MODEM_IP_METHOD_STATIC: + ret = NM_ACT_STAGE_RETURN_SUCCESS; + break; + case MM_MODEM_IP_METHOD_DHCP: + ret = NM_ACT_STAGE_RETURN_SUCCESS; + break; + default: + g_warning ("Invalid IP method"); + ret = NM_ACT_STAGE_RETURN_FAILURE; + break; + } + + return ret; +} + +static NMActStageReturn +real_act_stage3_ip_config_start (NMDevice *device, NMDeviceStateReason *reason) +{ + NMActStageReturn ret; + + switch (NM_MODEM_GET_PRIVATE (device)->ip_method) { + case MM_MODEM_IP_METHOD_PPP: + ret = NM_ACT_STAGE_RETURN_SUCCESS; + break; + case MM_MODEM_IP_METHOD_STATIC: + ret = static_stage3_config (device, reason); + break; + case MM_MODEM_IP_METHOD_DHCP: + ret = NM_DEVICE_CLASS (nm_modem_parent_class)->act_stage3_ip_config_start (device, reason); + break; + default: + g_warning ("Invalid IP method"); + ret = NM_ACT_STAGE_RETURN_FAILURE; + break; + } + + return ret; +} + +static NMActStageReturn +real_act_stage4_get_ip4_config (NMDevice *device, + NMIP4Config **config, + NMDeviceStateReason *reason) +{ + NMActStageReturn ret; + + switch (NM_MODEM_GET_PRIVATE (device)->ip_method) { + case MM_MODEM_IP_METHOD_PPP: + ret = ppp_stage4 (device, config, reason); + break; + case MM_MODEM_IP_METHOD_STATIC: + ret = static_stage4 (device, config, reason); + break; + case MM_MODEM_IP_METHOD_DHCP: + ret = NM_DEVICE_CLASS (nm_modem_parent_class)->act_stage4_get_ip4_config (device, config, reason); + break; + default: + g_warning ("Invalid IP method"); + ret = NM_ACT_STAGE_RETURN_FAILURE; + break; + } + + return ret; +} + +static void +real_deactivate_quickly (NMDevice *device) +{ + NMModemPrivate *priv = NM_MODEM_GET_PRIVATE (device); + const char *iface; + + if (priv->pending_ip4_config) { + g_object_unref (priv->pending_ip4_config); + priv->pending_ip4_config = NULL; + } + + priv->in_bytes = priv->out_bytes = 0; + + switch (NM_MODEM_GET_PRIVATE (device)->ip_method) { + case MM_MODEM_IP_METHOD_PPP: + if (priv->ppp_manager) { + g_object_unref (priv->ppp_manager); + priv->ppp_manager = NULL; + } + break; + case MM_MODEM_IP_METHOD_STATIC: + case MM_MODEM_IP_METHOD_DHCP: + iface = nm_device_get_iface (device); + + nm_system_device_flush_ip4_routes_with_iface (iface); + nm_system_device_flush_ip4_addresses_with_iface (iface); + nm_system_device_set_up_down_with_iface (iface, FALSE, NULL); + break; + default: + g_warning ("Invalid IP method"); + break; + } + + if (NM_DEVICE_CLASS (nm_modem_parent_class)->deactivate) + NM_DEVICE_CLASS (nm_modem_parent_class)->deactivate (device); +} + +static guint32 +real_get_generic_capabilities (NMDevice *dev) +{ + return NM_DEVICE_CAP_NM_SUPPORTED; +} + +static gboolean +unavailable_to_disconnected (gpointer user_data) +{ + nm_device_state_changed (NM_DEVICE (user_data), + NM_DEVICE_STATE_DISCONNECTED, + NM_DEVICE_STATE_REASON_NONE); + return FALSE; +} + +static void +device_state_changed (NMDeviceInterface *device, + NMDeviceState new_state, + NMDeviceState old_state, + NMDeviceStateReason reason, + gpointer user_data) +{ + NMModem *self = NM_MODEM (user_data); + NMModemPrivate *priv = NM_MODEM_GET_PRIVATE (self); + + /* Remove any previous delayed transition to disconnected */ + if (priv->state_to_disconnected_id) { + g_source_remove (priv->state_to_disconnected_id); + priv->state_to_disconnected_id = 0; + } + + /* If transitioning to UNAVAILBLE and we have a carrier, transition to + * DISCONNECTED because the device is ready to use. Otherwise the carrier-on + * handler will handle the transition to DISCONNECTED when the carrier is detected. + */ + if (new_state == NM_DEVICE_STATE_UNAVAILABLE) + priv->state_to_disconnected_id = g_idle_add (unavailable_to_disconnected, user_data); + + /* Make sure we don't leave the serial device open */ + switch (new_state) { + case NM_DEVICE_STATE_NEED_AUTH: + if (priv->ppp_manager) + break; + /* else fall through */ + case NM_DEVICE_STATE_UNMANAGED: + case NM_DEVICE_STATE_UNAVAILABLE: + case NM_DEVICE_STATE_FAILED: + case NM_DEVICE_STATE_DISCONNECTED: + dbus_g_proxy_call_no_reply (nm_modem_get_proxy (self, NULL), + "Disconnect", G_TYPE_INVALID); + break; + default: + break; + } +} + +static gboolean +real_hw_is_up (NMDevice *device) +{ + guint32 ip_method = NM_MODEM_GET_PRIVATE (device)->ip_method; + + if (ip_method == MM_MODEM_IP_METHOD_STATIC || ip_method == MM_MODEM_IP_METHOD_DHCP) { + NMModemPrivate *priv = NM_MODEM_GET_PRIVATE (device); + NMDeviceState state; + + state = nm_device_interface_get_state (NM_DEVICE_INTERFACE (device)); + if (priv->pending_ip4_config || state == NM_DEVICE_STATE_IP_CONFIG || state == NM_DEVICE_STATE_ACTIVATED) + return nm_system_device_is_up (device); + } + + return TRUE; +} + +static gboolean +real_hw_bring_up (NMDevice *device, gboolean *no_firmware) +{ + guint32 ip_method = NM_MODEM_GET_PRIVATE (device)->ip_method; + + if (ip_method == MM_MODEM_IP_METHOD_STATIC || ip_method == MM_MODEM_IP_METHOD_DHCP) { + NMModemPrivate *priv = NM_MODEM_GET_PRIVATE (device); + NMDeviceState state; + + state = nm_device_interface_get_state (NM_DEVICE_INTERFACE (device)); + if (priv->pending_ip4_config || state == NM_DEVICE_STATE_IP_CONFIG || state == NM_DEVICE_STATE_ACTIVATED) + return nm_system_device_set_up_down (device, TRUE, no_firmware); + } + + return TRUE; +} + +/*****************************************************************************/ + +static void +nm_modem_init (NMModem *self) +{ + NMModemPrivate *priv = NM_MODEM_GET_PRIVATE (self); + + priv->dbus_mgr = nm_dbus_manager_get (); +} + +static GObject* +constructor (GType type, + guint n_construct_params, + GObjectConstructParam *construct_params) +{ + GObject *object; + NMModemPrivate *priv; + + object = G_OBJECT_CLASS (nm_modem_parent_class)->constructor (type, + n_construct_params, + construct_params); + if (!object) + return NULL; + + priv = NM_MODEM_GET_PRIVATE (object); + + if (!priv->path) { + g_warning ("DBus path not provided"); + goto err; + } + + priv->proxy = dbus_g_proxy_new_for_name (nm_dbus_manager_get_connection (priv->dbus_mgr), + MM_DBUS_SERVICE, priv->path, MM_DBUS_INTERFACE_MODEM); + + g_signal_connect (object, "state-changed", G_CALLBACK (device_state_changed), object); + + return object; + + err: + g_object_unref (object); + return NULL; +} + +static void +get_property (GObject *object, guint prop_id, + GValue *value, GParamSpec *pspec) +{ + NMModemPrivate *priv = NM_MODEM_GET_PRIVATE (object); + + switch (prop_id) { + case PROP_PATH: + g_value_set_string (value, priv->path); + break; + case PROP_IP_METHOD: + g_value_set_uint (value, priv->ip_method); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + +} + +static void +set_property (GObject *object, guint prop_id, + const GValue *value, GParamSpec *pspec) +{ + NMModemPrivate *priv = NM_MODEM_GET_PRIVATE (object); + + switch (prop_id) { + case PROP_PATH: + /* Construct only */ + priv->path = g_value_dup_string (value); + break; + case PROP_IP_METHOD: + priv->ip_method = g_value_get_uint (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +finalize (GObject *object) +{ + NMModemPrivate *priv = NM_MODEM_GET_PRIVATE (object); + + if (priv->state_to_disconnected_id) { + g_source_remove (priv->state_to_disconnected_id); + priv->state_to_disconnected_id = 0; + } + + if (priv->proxy) + g_object_unref (priv->proxy); + + g_object_unref (priv->dbus_mgr); + + G_OBJECT_CLASS (nm_modem_parent_class)->finalize (object); +} + +static void +nm_modem_class_init (NMModemClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + NMDeviceClass *device_class = NM_DEVICE_CLASS (klass); + + g_type_class_add_private (object_class, sizeof (NMModemPrivate)); + + /* Virtual methods */ + object_class->constructor = constructor; + object_class->set_property = set_property; + object_class->get_property = get_property; + object_class->finalize = finalize; + + device_class->get_generic_capabilities = real_get_generic_capabilities; + device_class->act_stage2_config = real_act_stage2_config; + device_class->act_stage3_ip_config_start = real_act_stage3_ip_config_start; + device_class->act_stage4_get_ip4_config = real_act_stage4_get_ip4_config; + device_class->deactivate_quickly = real_deactivate_quickly; + device_class->hw_is_up = real_hw_is_up; + device_class->hw_bring_up = real_hw_bring_up; + + /* Properties */ + g_object_class_install_property + (object_class, PROP_PATH, + g_param_spec_string (NM_MODEM_PATH, + "DBus path", + "DBus path", + NULL, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + + g_object_class_install_property + (object_class, PROP_IP_METHOD, + g_param_spec_uint (NM_MODEM_IP_METHOD, + "IP method", + "IP method", + MM_MODEM_IP_METHOD_PPP, + MM_MODEM_IP_METHOD_DHCP, + MM_MODEM_IP_METHOD_PPP, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + + /* Signals */ + signals[PPP_STATS] = + g_signal_new ("ppp-stats", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (NMModemClass, ppp_stats), + NULL, NULL, + _nm_marshal_VOID__UINT_UINT, + G_TYPE_NONE, 2, + G_TYPE_UINT, G_TYPE_UINT); + + signals[PROPERTIES_CHANGED] = + nm_properties_changed_signal_new (object_class, + G_STRUCT_OFFSET (NMModemClass, properties_changed)); + + dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (klass), + &dbus_glib_nm_serial_device_object_info); +} Index: NetworkManager-0.7.1/src/modem-manager/nm-modem.h =================================================================== --- /dev/null +++ NetworkManager-0.7.1/src/modem-manager/nm-modem.h @@ -0,0 +1,50 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ + +#ifndef NM_MODEM_H +#define NM_MODEM_H + +#include <dbus/dbus-glib.h> +#include <nm-device.h> +#include "ppp-manager/nm-ppp-manager.h" + +G_BEGIN_DECLS + +#define NM_TYPE_MODEM (nm_modem_get_type ()) +#define NM_MODEM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_MODEM, NMModem)) +#define NM_MODEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_MODEM, NMModemClass)) +#define NM_IS_MODEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_MODEM)) +#define NM_IS_MODEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_MODEM)) +#define NM_MODEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_MODEM, NMModemClass)) + +#define NM_MODEM_PATH "path" +#define NM_MODEM_IP_METHOD "ip-method" + +typedef struct { + NMDevice parent; +} NMModem; + +typedef struct { + NMDeviceClass parent; + + const char *(*get_ppp_name) (NMModem *self, + NMConnection *connection); + + /* Signals */ + void (*ppp_stats) (NMModem *self, guint32 in_bytes, guint32 out_bytes); + void (*properties_changed) (NMModem *self, GHashTable *properties); +} NMModemClass; + +GType nm_modem_get_type (void); + +/* Protected */ + +NMPPPManager *nm_modem_get_ppp_manager (NMModem *self); +DBusGProxy *nm_modem_get_proxy (NMModem *self, + const char *interface); + +const char *nm_modem_get_ppp_name (NMModem *self, + NMConnection *connection); + +G_END_DECLS + +#endif /* NM_MODEM_H */ Index: NetworkManager-0.7.1/src/nm-cdma-device.h =================================================================== --- NetworkManager-0.7.1.orig/src/nm-cdma-device.h +++ /dev/null @@ -1,59 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* NetworkManager -- Network link manager - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Copyright (C) 2008 Red Hat, Inc. - * Copyright (C) 2008 Novell, Inc. - */ - -#ifndef NM_CDMA_DEVICE_H -#define NM_CDMA_DEVICE_H - -#include <nm-serial-device.h> - -G_BEGIN_DECLS - -#define NM_TYPE_CDMA_DEVICE (nm_cdma_device_get_type ()) -#define NM_CDMA_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_CDMA_DEVICE, NMCdmaDevice)) -#define NM_CDMA_DEVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_CDMA_DEVICE, NMCdmaDeviceClass)) -#define NM_IS_CDMA_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_CDMA_DEVICE)) -#define NM_IS_CDMA_DEVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_CDMA_DEVICE)) -#define NM_CDMA_DEVICE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_CDMA_DEVICE, NMCdmaDeviceClass)) - -#define NM_CDMA_DEVICE_MONITOR_IFACE "monitor-iface" - -typedef struct { - NMSerialDevice parent; -} NMCdmaDevice; - -typedef struct { - NMSerialDeviceClass parent; - - /* Signals */ - void (*properties_changed) (NMCdmaDevice *device, GHashTable *properties); -} NMCdmaDeviceClass; - -GType nm_cdma_device_get_type (void); - -NMCdmaDevice *nm_cdma_device_new (const char *udi, - const char *data_iface, - const char *monitor_iface, - const char *driver, - gboolean managed); - -G_END_DECLS - -#endif /* NM_CDMA_DEVICE_H */ Index: NetworkManager-0.7.1/src/nm-hal-manager.c =================================================================== --- NetworkManager-0.7.1.orig/src/nm-hal-manager.c +++ NetworkManager-0.7.1/src/nm-hal-manager.c @@ -29,11 +29,6 @@ #include <dbus/dbus-glib.h> #include <dbus/dbus-glib-lowlevel.h> -#if HAVE_LIBUDEV -#define LIBUDEV_I_KNOW_THE_API_IS_SUBJECT_TO_CHANGE -#include <libudev.h> -#endif /* HAVE_LIBUDEV */ - #include "nm-glib-compat.h" #include "nm-hal-manager.h" #include "nm-marshal.h" @@ -41,9 +36,6 @@ #include "nm-utils.h" #include "nm-device-wifi.h" #include "nm-device-ethernet.h" -#include "nm-gsm-device.h" -#include "nm-hso-gsm-device.h" -#include "nm-cdma-device.h" /* Killswitch poll frequency in seconds */ #define RFKILL_POLL_FREQUENCY 6 @@ -51,25 +43,19 @@ #define HAL_DBUS_SERVICE "org.freedesktop.Hal" typedef struct { - GType device_type; + char *device_type_name; char *capability_str; char *category; gboolean (*is_device_fn) (NMHalManager *self, const char *udi); NMDeviceCreatorFn creator_fn; } DeviceCreator; -static void emit_udi_added (NMHalManager *self, const char *udi, DeviceCreator *creator); - typedef struct { LibHalContext *hal_ctx; NMDBusManager *dbus_mgr; GSList *device_creators; gboolean rfkilled; /* Authoritative rfkill state */ - GSList *deferred_modems; - guint deferred_modem_id; - DeviceCreator *modem_creator; - /* Killswitch handling */ GSList *killswitch_list; guint32 killswitch_poll_id; @@ -137,10 +123,12 @@ hal_get_subsystem (LibHalContext *ctx, c } static char * -nm_get_device_driver_name (LibHalContext *ctx, const char *origdev_udi) +nm_get_device_driver_name (LibHalContext *ctx, const char *udi) { + char *origdev_udi; char *driver_name = NULL, *subsystem, *drv, *od_parent = NULL; + origdev_udi = libhal_device_get_property_string (ctx, udi, "net.originating_device", NULL); if (!origdev_udi) return NULL; @@ -148,7 +136,8 @@ nm_get_device_driver_name (LibHalContext subsystem = hal_get_subsystem (ctx, origdev_udi); if (subsystem && !strcmp (subsystem, "ibmebus")) { od_parent = libhal_device_get_property_string (ctx, origdev_udi, "info.parent", NULL); - origdev_udi = (const char *) od_parent; + libhal_free_string (origdev_udi); + origdev_udi = od_parent; } drv = libhal_device_get_property_string (ctx, origdev_udi, "info.linux.driver", NULL); @@ -156,8 +145,8 @@ nm_get_device_driver_name (LibHalContext driver_name = g_strdup (drv); libhal_free_string (drv); - libhal_free_string (od_parent); libhal_free_string (subsystem); + libhal_free_string (origdev_udi); return driver_name; } @@ -262,7 +251,6 @@ is_wired_device (NMHalManager *self, con static GObject * wired_device_creator (NMHalManager *self, const char *udi, - const char *origdev_udi, gboolean managed) { NMHalManagerPrivate *priv = NM_HAL_MANAGER_GET_PRIVATE (self); @@ -276,7 +264,7 @@ wired_device_creator (NMHalManager *self return NULL; } - driver = nm_get_device_driver_name (priv->hal_ctx, origdev_udi); + driver = nm_get_device_driver_name (priv->hal_ctx, udi); /* Special handling of Ericsson F3507g 'mbm' devices; ignore the * cdc-ether device that it provides since we don't use it yet. @@ -317,7 +305,6 @@ is_wireless_device (NMHalManager *self, static GObject * wireless_device_creator (NMHalManager *self, const char *udi, - const char *origdev_udi, gboolean managed) { NMHalManagerPrivate *priv = NM_HAL_MANAGER_GET_PRIVATE (self); @@ -331,7 +318,7 @@ wireless_device_creator (NMHalManager *s return NULL; } - driver = nm_get_device_driver_name (priv->hal_ctx, origdev_udi); + driver = nm_get_device_driver_name (priv->hal_ctx, udi); device = (GObject *) nm_device_wifi_new (udi, iface, driver, managed); libhal_free_string (iface); @@ -340,800 +327,6 @@ wireless_device_creator (NMHalManager *s return device; } -/* Modem device creator */ - -static gboolean -is_modem_device (NMHalManager *self, const char *udi) -{ - NMHalManagerPrivate *priv = NM_HAL_MANAGER_GET_PRIVATE (self); - gboolean is_modem = FALSE; - - if (libhal_device_property_exists (priv->hal_ctx, udi, "info.category", NULL)) { - char *category; - - category = libhal_device_get_property_string (priv->hal_ctx, udi, "info.category", NULL); - if (category) { - is_modem = strcmp (category, "serial") == 0; - libhal_free_string (category); - } - } - - return is_modem; -} - -static char * -hal_get_originating_device (LibHalContext *ctx, const char *udi, const char *prefix) -{ - char *od_key = g_strdup_printf ("%s.originating_device", prefix); - char *pd_key = g_strdup_printf ("%s.physical_device", prefix); - char *od; - - od = libhal_device_get_property_string (ctx, udi, od_key, NULL); - if (!od) { - /* physical_device is deprecated */ - od = libhal_device_get_property_string (ctx, udi, pd_key, NULL); - } - - g_free (od_key); - g_free (pd_key); - return od; -} - -static char * -get_hso_netdev (LibHalContext *ctx, const char *udi) -{ - char *serial_od = NULL, *serial_od_parent = NULL, *netdev = NULL, *subsys; - char **netdevs = NULL; - int num, i; - - /* Get the serial interface's originating device UDI, used to find the - * originating device's netdev. - */ - serial_od = hal_get_originating_device (ctx, udi, "serial"); - if (!serial_od) - goto out; - - serial_od_parent = libhal_device_get_property_string (ctx, serial_od, "info.parent", NULL); - if (!serial_od_parent) - goto out; - - /* Check to ensure we've got the actual "USB Device" */ - subsys = hal_get_subsystem (ctx, serial_od_parent); - if (!subsys || strcmp (subsys, "usb_device")) { - libhal_free_string (subsys); - goto out; - } - libhal_free_string (subsys); - - /* Look for the originating device's netdev */ - netdevs = libhal_find_device_by_capability (ctx, "net", &num, NULL); - for (i = 0; netdevs && !netdev && (i < num); i++) { - char *net_od = NULL, *net_od_parent = NULL, *tmp; - - net_od = hal_get_originating_device (ctx, netdevs[i], "net"); - if (!net_od) - goto next; - - net_od_parent = libhal_device_get_property_string (ctx, net_od, "info.parent", NULL); - if (!net_od_parent) - goto next; - - /* Check to ensure we've got the actual "USB Device" */ - subsys = hal_get_subsystem (ctx, net_od_parent); - if (!subsys || strcmp (subsys, "usb_device")) { - libhal_free_string (subsys); - goto next; - } - libhal_free_string (subsys); - - if (!strcmp (net_od_parent, serial_od_parent)) { - /* We found it */ - tmp = libhal_device_get_property_string (ctx, netdevs[i], "net.interface", NULL); - if (tmp) - netdev = g_strdup (tmp); - libhal_free_string (tmp); - } - - next: - libhal_free_string (net_od_parent); - libhal_free_string (net_od); - } - -out: - libhal_free_string_array (netdevs); - libhal_free_string (serial_od); - libhal_free_string (serial_od_parent); - - return netdev; -} - -#define PROP_GSM "ID_NM_MODEM_GSM" -#define PROP_CDMA "ID_NM_MODEM_IS707_A" -#define PROP_EVDO1 "ID_NM_MODEM_IS856" -#define PROP_EVDOA "ID_NM_MODEM_IS856_A" -#define PROP_ZTE_MAIN "ID_NM_ZTE_PORT_TYPE_MODEM" -#define PROP_ZTE_SET "ID_NM_ZTE_PORT_TYPE_SET" - -#if HAVE_LIBUDEV - -typedef struct { - gboolean gsm; - gboolean cdma; - gboolean zte_main; - gboolean zte_set; -} UdevIterData; - -#if UDEV_VERSION >= 129 -static const char * -get_udev_property (struct udev_device *device, const char *name) -{ - struct udev_list_entry *entry; - - udev_list_entry_foreach (entry, udev_device_get_properties_list_entry (device)) { - if (strcmp (udev_list_entry_get_name (entry), name) == 0) - return udev_list_entry_get_value (entry); - } - - return NULL; -} -#else -static int udev_device_prop_iter(struct udev_device *udev_device, - const char *key, - const char *value, - void *data) -{ - UdevIterData *types = data; - - if (!strcmp (key, PROP_GSM) && !strcmp (value, "1")) - types->gsm = TRUE; - if (!strcmp (key, PROP_CDMA) && !strcmp (value, "1")) - types->cdma = TRUE; - if (!strcmp (key, PROP_EVDO1) && !strcmp (value, "1")) - types->cdma = TRUE; - if (!strcmp (key, PROP_EVDOA) && !strcmp (value, "1")) - types->cdma = TRUE; - - if (types->cdma || types->gsm) { - if (!strcmp (key, PROP_ZTE_MAIN) && !strcmp (value, "1")) - types->zte_main = TRUE; - if (!strcmp (key, PROP_ZTE_SET) && !strcmp (value, "1")) - types->zte_set = TRUE; - } - - /* Return 0 to continue looking */ - return types->gsm && types->cdma; -} -#endif - -static gboolean -libudev_get_modem_capabilities (const char *sysfs_path, - gboolean *gsm, - gboolean *cdma, - gboolean *zte_main, - gboolean *zte_set) -{ - struct udev *udev; - struct udev_device *device; - - g_return_val_if_fail (sysfs_path != NULL, FALSE); - g_return_val_if_fail (gsm != NULL, FALSE); - g_return_val_if_fail (*gsm == FALSE, FALSE); - g_return_val_if_fail (cdma != NULL, FALSE); - g_return_val_if_fail (*cdma == FALSE, FALSE); - g_return_val_if_fail (zte_main != NULL, FALSE); - g_return_val_if_fail (*zte_main == FALSE, FALSE); - g_return_val_if_fail (zte_set != NULL, FALSE); - g_return_val_if_fail (*zte_set == FALSE, FALSE); - - udev = udev_new (); - if (!udev) - return FALSE; - -#if UDEV_VERSION >= 129 - device = udev_device_new_from_syspath (udev, sysfs_path); -#else - /* udev_device_new_from_devpath() requires the sysfs mount point to be - * stripped off the path. - */ - if (!strncmp (sysfs_path, "/sys", 4)) - sysfs_path += 4; - device = udev_device_new_from_devpath (udev, sysfs_path); -#endif - if (!device) { - udev_unref (udev); - nm_warning ("couldn't inspect device '%s' with libudev", sysfs_path); - return FALSE; - } - -#if UDEV_VERSION >= 129 - { - const char *gsm_val = get_udev_property (device, PROP_GSM); - const char *cdma_val = get_udev_property (device, PROP_CDMA); - const char *evdo1_val = get_udev_property (device, PROP_EVDO1); - const char *evdoa_val = get_udev_property (device, PROP_EVDOA); - const char *zte_main_val = get_udev_property (device, PROP_ZTE_MAIN); - const char *zte_set_val = get_udev_property (device, PROP_ZTE_SET); - - if (gsm_val && !strcmp (gsm_val, "1")) - *gsm = TRUE; - if (cdma_val && !strcmp (cdma_val, "1")) - *cdma = TRUE; - if (evdo1_val && !strcmp (evdo1_val, "1")) - *cdma = TRUE; - if (evdoa_val && !strcmp (evdoa_val, "1")) - *cdma = TRUE; - - if (*gsm || *cdma) { - if (zte_main_val && !strcmp (zte_main_val, "1")) - *zte_main = TRUE; - if (zte_set_val && !strcmp (zte_set_val, "1")) - *zte_set = TRUE; - } - } -#else - { - UdevIterData iterdata = { FALSE, FALSE }; - - udev_device_get_properties (device, udev_device_prop_iter, &iterdata); - *gsm = iterdata.gsm; - *cdma = iterdata.cdma; - if (*gsm || *cdma) { - *zte_main = iterdata.zte_main; - *zte_set = iterdata.zte_set; - } - } -#endif - - udev_device_unref (device); - udev_unref (udev); - return TRUE; -} -#else -static gboolean -udevadm_get_modem_capabilities (const char *sysfs_path, - gboolean *gsm, - gboolean *cdma, - gboolean *zte_main, - gboolean *zte_set) -{ - char *udevadm_argv[] = { "/sbin/udevadm", "info", "--query=env", NULL, NULL }; - char *syspath_arg = NULL; - char *udevadm_stdout = NULL; - int exitcode; - GError *error = NULL; - char **lines = NULL, **iter; - gboolean success = FALSE, is_zte_main = FALSE, is_zte_set = FALSE; - - g_return_val_if_fail (sysfs_path != NULL, FALSE); - g_return_val_if_fail (gsm != NULL, FALSE); - g_return_val_if_fail (*gsm == FALSE, FALSE); - g_return_val_if_fail (cdma != NULL, FALSE); - g_return_val_if_fail (*cdma == FALSE, FALSE); - g_return_val_if_fail (zte_main != NULL, FALSE); - g_return_val_if_fail (*zte_main == FALSE, FALSE); - g_return_val_if_fail (zte_set != NULL, FALSE); - g_return_val_if_fail (*zte_set == FALSE, FALSE); - - udevadm_argv[3] = syspath_arg = g_strdup_printf ("--path=%s", sysfs_path); - if (g_spawn_sync ("/", udevadm_argv, NULL, 0, NULL, NULL, - &udevadm_stdout, - NULL, - &exitcode, - &error) != TRUE) { - nm_warning ("could not run udevadm to get modem capabilities for '%s': %s", - sysfs_path, - (error && error->message) ? error->message : "(unknown)"); - g_clear_error (&error); - goto error; - } - - if (exitcode != 0) { - nm_warning ("udevadm error while getting modem capabilities for '%s': %d", - sysfs_path, WEXITSTATUS (exitcode)); - goto error; - } - - lines = g_strsplit_set (udevadm_stdout, "\n\r", -1); - for (iter = lines; *iter; iter++) { - if (!strcmp (*iter, PROP_GSM "=1")) { - *gsm = TRUE; - } else if ( !strcmp (*iter, PROP_CDMA "=1") - || !strcmp (*iter, PROP_EVDO1 "=1") - || !strcmp (*iter, PROP_EVDOA "=1")) { - *cdma = TRUE; - } else if (!strcmp (*iter, PROP_ZTE_MAIN "=1")) - is_zte_main = TRUE; - else if (!strcmp (*iter, PROP_ZTE_SET "=1")) - is_zte_set = TRUE; - } - - if (*gsm || *cdma) { - *zte_main = is_zte_main; - *zte_set = is_zte_set; - } - - success = TRUE; - -error: - if (lines) - g_strfreev (lines); - g_free (udevadm_stdout); - g_free (syspath_arg); - return success; -} -#endif - -static void -hal_get_modem_capabilities (LibHalContext *ctx, - const char *udi, - gboolean *gsm, - gboolean *cdma) -{ - char **capabilities, **iter; - - g_return_if_fail (ctx != NULL); - g_return_if_fail (udi != NULL); - g_return_if_fail (gsm != NULL); - g_return_if_fail (*gsm == FALSE); - g_return_if_fail (cdma != NULL); - g_return_if_fail (*cdma == FALSE); - - /* Make sure it has the 'modem' capability first */ - if (!libhal_device_query_capability (ctx, udi, "modem", NULL)) - return; - - capabilities = libhal_device_get_property_strlist (ctx, udi, "modem.command_sets", NULL); - /* 'capabilites' may be NULL */ - for (iter = capabilities; iter && *iter; iter++) { - if (!strcmp (*iter, "GSM-07.07")) { - *gsm = TRUE; - break; - } - if (!strcmp (*iter, "IS-707-A")) { - *cdma = TRUE; - break; - } - } - if (capabilities) - g_strfreev (capabilities); -} - -typedef struct { - guint32 refcount; - char *udi; - char *origdev_udi; - gboolean gsm; - gboolean cdma; - guint32 usb_interface_number; - guint32 serial_port; -} DeferredModem; - -#if 0 -static void -deferred_modem_ref (DeferredModem *modem) -{ - g_return_if_fail (modem != NULL); - g_return_if_fail (modem->refcount > 0); - modem->refcount++; -} -#endif - -static void -deferred_modem_unref (DeferredModem *modem) -{ - g_return_if_fail (modem != NULL); - g_return_if_fail (modem->refcount > 0); - - modem->refcount--; - if (modem->refcount == 0) { - g_free (modem->udi); - g_free (modem->origdev_udi); - memset (modem, 0, sizeof (DeferredModem)); - g_free (modem); - } -} - -static DeferredModem * -deferred_modem_new (const char *udi, - const char *origdev_udi, - gboolean gsm, - gboolean cdma, - LibHalContext *ctx) -{ - DeferredModem *modem; - char *parent; - dbus_int32_t serial_port = -1, usb_interface = -1; - DBusError error; - - parent = libhal_device_get_property_string (ctx, udi, "info.parent", NULL); - if (!parent) { - g_warning ("couldn't get parent for '%s'", udi); - return NULL; - } - - modem = g_new0 (DeferredModem, 1); - modem->refcount = 1; - modem->udi = g_strdup (udi); - modem->origdev_udi = g_strdup (origdev_udi); - modem->gsm = gsm; - modem->cdma = cdma; - - dbus_error_init (&error); - usb_interface = libhal_device_get_property_int (ctx, parent, "usb.interface.number", &error); - if (dbus_error_is_set (&error)) { - dbus_error_free (&error); - usb_interface = -1; - } - - dbus_error_init (&error); - serial_port = libhal_device_get_property_int (ctx, udi, "serial.port", &error); - if (dbus_error_is_set (&error)) { - dbus_error_free (&error); - serial_port = -1; - } - - if (usb_interface == -1 && serial_port == -1) { - g_warning ("couldn't get usb.interface.number and serial.port for '%s'", udi); - deferred_modem_unref (modem); - modem = NULL; - } else { - modem->usb_interface_number = usb_interface; - modem->serial_port = serial_port; - } - - libhal_free_string (parent); - return modem; -} - -static gint -deferred_modem_sort_func (const DeferredModem *a, const DeferredModem *b) -{ - gint ret; - - /* Sort is: origdev_udi, usb_interface, serial_port */ - - ret = strcmp (a->origdev_udi, b->origdev_udi); - if (ret) - return ret; - - if (a->usb_interface_number < b->usb_interface_number) - return -1; - else if (a->usb_interface_number > b->usb_interface_number) - return 1; - - if (a->serial_port < b->serial_port) - return -1; - else if (a->serial_port > b->serial_port) - return 1; - - return 0; -} - -static DeferredModem * -deferred_modem_find (NMHalManager *self, const char *udi) -{ - NMHalManagerPrivate *priv = NM_HAL_MANAGER_GET_PRIVATE (self); - GSList *iter; - - for (iter = priv->deferred_modems; iter; iter = g_slist_next (iter)) { - DeferredModem *candidate = iter->data; - - if (!strcmp (candidate->udi, udi)) - return candidate; - } - return NULL; -} - -static DeferredModem * -deferred_modem_find_by_origdev (NMHalManager *self, const char *origdev_udi) -{ - NMHalManagerPrivate *priv = NM_HAL_MANAGER_GET_PRIVATE (self); - GSList *iter; - - for (iter = priv->deferred_modems; iter; iter = g_slist_next (iter)) { - DeferredModem *candidate = iter->data; - - if (!strcmp (candidate->origdev_udi, origdev_udi)) - return candidate; - } - return NULL; -} - -static void -deferred_modem_remove (NMHalManager *self, DeferredModem *modem) -{ - NMHalManagerPrivate *priv = NM_HAL_MANAGER_GET_PRIVATE (self); - GSList *iter, *new = NULL; - - g_return_if_fail (modem != NULL); - - for (iter = priv->deferred_modems; iter; iter = g_slist_next (iter)) { - if (iter->data != modem) - new = g_slist_insert_sorted (new, iter->data, (GCompareFunc) deferred_modem_sort_func); - } - g_slist_free (priv->deferred_modems); - priv->deferred_modems = new; -} - -static gboolean -deferred_modem_timeout (gpointer data) -{ - NMHalManager *self = data; - NMHalManagerPrivate *priv = NM_HAL_MANAGER_GET_PRIVATE (self); - GSList *iter; - - nm_info ("Re-checking deferred serial ports"); - for (iter = priv->deferred_modems; iter; iter = g_slist_next (iter)) { - DeferredModem *modem = iter->data; - - /* re-emit udi-added for each UDI that was deferred */ - emit_udi_added (self, modem->udi, priv->modem_creator); - } - - g_slist_foreach (priv->deferred_modems, (GFunc) deferred_modem_unref, NULL); - g_slist_free (priv->deferred_modems); - priv->deferred_modems = NULL; - priv->deferred_modem_id = 0; - return FALSE; -} - -static GObject * -new_modem_device (const char *udi, - gboolean gsm, - gboolean cdma, - const char *ttyname, - const char *driver, - gboolean managed, - LibHalContext *ctx) -{ - GObject *device = NULL; - char *netdev = NULL; - - g_return_val_if_fail (udi != NULL, NULL); - g_return_val_if_fail (gsm || cdma, NULL); - g_return_val_if_fail (ttyname != NULL, NULL); - g_return_val_if_fail (driver != NULL, NULL); - g_return_val_if_fail (ctx != NULL, NULL); - - /* Special handling of 'hso' cards (until punted to ModemManager) */ - if (gsm && !strcmp (driver, "hso")) { - char *hsotype_path; - char *contents = NULL; - gboolean success; - - /* We only want the "Control" interface, since that's the only - * one that gives us the unsolicited OWANCALL responses. Ignore - * errors since we didn't care about them before. - */ - hsotype_path = g_strdup_printf ("/sys/class/tty/%s/hsotype", ttyname); - success = g_file_get_contents (hsotype_path, &contents, NULL, NULL); - g_free (hsotype_path); - if (success && contents) { - if ( !strstr (contents, "Control") - && !strstr (contents, "control")) { - g_free (contents); - return NULL; - } - g_free (contents); - } - - netdev = get_hso_netdev (ctx, udi); - if (!netdev) { - nm_warning ("couldn't find HSO modem network device."); - return NULL; - } - } - - /* Special handling of Option cards (until punted to ModemManager). Only - * the first USB interface can be used for control and PPP. - */ - if (gsm && !strcmp (driver, "option")) { - char *parent; - guint32 vendor_id = 0, usb_interface = 0; - - parent = libhal_device_get_property_string (ctx, udi, "info.parent", NULL); - if (!parent) - return NULL; - - vendor_id = libhal_device_get_property_int (ctx, parent, "usb.vendor_id", NULL); - if (vendor_id == 0x0AF0) { - usb_interface = libhal_device_get_property_int (ctx, parent, "usb.interface.number", NULL); - if (usb_interface > 0) { - libhal_free_string (parent); - return NULL; - } - } - libhal_free_string (parent); - } - - /* Special handling of Ericsson F3507g 'mbm' devices; already handled by - * ModemManager more correctly in HEAD. - */ - if (gsm && !strcmp (driver, "cdc_acm")) { - char *parent = NULL; - guint32 usb_interface; - - if (is_mbm (ctx, udi, &parent)) { - usb_interface = libhal_device_get_property_int (ctx, parent, "usb.interface.number", NULL); - g_free (parent); - if (usb_interface != 1) - return NULL; - } - } - - if (gsm && netdev) { - device = (GObject *) nm_hso_gsm_device_new (udi, ttyname, NULL, netdev, driver, managed); - g_free (netdev); - } else if (gsm) - device = (GObject *) nm_gsm_device_new (udi, ttyname, NULL, driver, managed); - else if (cdma) - device = (GObject *) nm_cdma_device_new (udi, ttyname, NULL, driver, managed); - else - g_assert_not_reached (); - - return device; -} - -static char * -nm_get_modem_device_driver_name (LibHalContext *ctx, const char *udi) -{ - char *driver_name = NULL, *origdev_udi, *driver; - - origdev_udi = hal_get_originating_device (ctx, udi, "serial"); - if (!origdev_udi) - return NULL; - - driver = libhal_device_get_property_string (ctx, origdev_udi, "info.linux.driver", NULL); - if (driver) { - driver_name = g_strdup (driver); - libhal_free_string (driver); - } - libhal_free_string (origdev_udi); - return driver_name; -} - -static GObject * -modem_device_creator (NMHalManager *self, - const char *udi, - const char *origdev_udi, - gboolean managed) -{ - NMHalManagerPrivate *priv = NM_HAL_MANAGER_GET_PRIVATE (self); - char *serial_device; - const char *ttyname; - char *sysfs_path; - char *driver = NULL; - GObject *device = NULL; - gboolean udev_gsm = FALSE; - gboolean udev_cdma = FALSE; - gboolean hal_gsm = FALSE; - gboolean hal_cdma = FALSE; - gboolean later = FALSE; - gboolean udev_success = FALSE; - gboolean zte_main = FALSE; - gboolean zte_set = FALSE; - DeferredModem *deferred = NULL; - guint16 vid = 0; - - serial_device = libhal_device_get_property_string (priv->hal_ctx, udi, "serial.device", NULL); - /* For serial devices, 'origdev_udi' will be the actual USB or platform device, - * not HAL's 'serial.originating_device'. - */ - driver = nm_get_modem_device_driver_name (priv->hal_ctx, udi); - if (!serial_device || !driver) - goto out; - - ttyname = serial_device + strlen ("/dev/"); - - /* If the UDI was deferred from earlier, just make the device with the - * cached capabilities. - */ - deferred = deferred_modem_find (self, udi); - if (deferred) { - udev_gsm = deferred->gsm; - udev_cdma = deferred->cdma; - device = new_modem_device (udi, deferred->gsm, deferred->cdma, ttyname, driver, managed, priv->hal_ctx); - goto out; - } - - /* Get udev probed capabilities */ - sysfs_path = libhal_device_get_property_string (priv->hal_ctx, udi, "linux.sysfs_path", NULL); - if (!sysfs_path) { - nm_warning ("(%s): could not determine sysfs path", ttyname); - goto out; - } - -#if HAVE_LIBUDEV - udev_success = libudev_get_modem_capabilities (sysfs_path, &udev_gsm, &udev_cdma, &zte_main, &zte_set); -#else - udev_success = udevadm_get_modem_capabilities (sysfs_path, &udev_gsm, &udev_cdma, &zte_main, &zte_set); -#endif - libhal_free_string (sysfs_path); - - /* Get HAL capabilities too */ - hal_get_modem_capabilities (priv->hal_ctx, udi, &hal_gsm, &hal_cdma); - - /* If for some reason running the udev prober failed fall back to HAL */ - if (!udev_success) { - nm_warning ("(%s): udev probing failed; using only HAL modem capabilities.", ttyname); - udev_gsm = hal_gsm; - udev_cdma = hal_cdma; - } - - /* ZTE modem ports get tagged by udev rules, so if the modem was known to - * the rules (in which case ID_NM_ZTE_PORT_TYPE_SET will be set), and the - * port isn't a "main" port, we should ignore it. - */ - if (get_vid_pid (priv->hal_ctx, udi, &vid, NULL, NULL) && (vid == 0x19d2)) { - if (zte_set && !zte_main) { - udev_gsm = FALSE; - udev_cdma = FALSE; - } - } - - /* If it's not known to either udev or HAL as a modem, nothing to do */ - if (!udev_gsm && !udev_cdma && !hal_gsm && !hal_cdma) { - nm_info ("(%s): ignoring due to lack of mobile broadband capabilties", ttyname); - goto out; - } - - nm_info ("(%s): found serial port (udev:%s%s%s hal:%s%s%s)", - ttyname, - udev_gsm ? "GSM" : "", udev_gsm && udev_cdma ? "/" : "", udev_cdma ? "CDMA" : "", - hal_gsm ? "GSM" : "", hal_gsm && hal_cdma ? "/" : "", hal_cdma ? "CDMA" : ""); - - /* If other ports owned by this port's originating device are already - * deferred, defer this port as well. - */ - later = !!deferred_modem_find_by_origdev (self, origdev_udi); - - /* The logic goes like this: - * - * a) if both udev and HAL agree on the port command sets, use it - * b) if HAL thinks its a modem, but the command set disagrees with udev, - * assume udev probing is correct - * c) if HAL thinks it's a modem but udev does not, don't use it - * d) if HAL doesn't think it's a modem but udev does, schedule a timer - * to check back later after HAL is done sending ttys. - */ - if (udev_gsm == hal_gsm && udev_cdma == hal_cdma) { - /* Case (a): HAL and udev agree. */ - if (!later) - device = new_modem_device (udi, udev_gsm, udev_cdma, ttyname, driver, managed, priv->hal_ctx); - } else if ((hal_gsm || hal_cdma) && (udev_gsm || udev_cdma)) { - /* Case (b): HAL and udev think it's a modem, but they don't - * agree on the command set the modem supports. Trust udev. - */ - if (!later) - device = new_modem_device (udi, udev_gsm, udev_cdma, ttyname, driver, managed, priv->hal_ctx); - } else if ((hal_gsm || hal_cdma) && !udev_gsm && !udev_cdma) { - /* Case (c): HAL thinks it's a modem, but udev doesn't */ - nm_info ("(%s): ignoring due to lack of probed mobile broadband capabilties", ttyname); - later = FALSE; - } else { - /* Case (d): HAL doesn't think its a modem, but udev does */ - later = TRUE; - } - - if (!device && later) { - deferred = deferred_modem_new (udi, origdev_udi, udev_gsm, udev_cdma, priv->hal_ctx); - priv->deferred_modems = g_slist_insert_sorted (priv->deferred_modems, - deferred, - (GCompareFunc) deferred_modem_sort_func); - - if (priv->deferred_modem_id) - g_source_remove (priv->deferred_modem_id); - priv->deferred_modem_id = g_timeout_add_seconds (4, deferred_modem_timeout, self); - - nm_info ("(%s): deferring until all ports found", ttyname); - } - -out: - libhal_free_string (serial_device); - g_free (driver); - return device; -} - static void register_built_in_creators (NMHalManager *self) { @@ -1142,7 +335,7 @@ register_built_in_creators (NMHalManager /* Wired device */ creator = g_slice_new0 (DeviceCreator); - creator->device_type = NM_TYPE_DEVICE_ETHERNET; + creator->device_type_name = g_strdup ("Ethernet"); creator->capability_str = g_strdup ("net.80203"); creator->category = g_strdup ("net"); creator->is_device_fn = is_wired_device; @@ -1151,82 +344,12 @@ register_built_in_creators (NMHalManager /* Wireless device */ creator = g_slice_new0 (DeviceCreator); - creator->device_type = NM_TYPE_DEVICE_WIFI; + creator->device_type_name = g_strdup ("802.11 WiFi"); creator->capability_str = g_strdup ("net.80211"); creator->category = g_strdup ("net"); creator->is_device_fn = is_wireless_device; creator->creator_fn = wireless_device_creator; priv->device_creators = g_slist_append (priv->device_creators, creator); - - /* Modem */ - creator = g_slice_new0 (DeviceCreator); - creator->device_type = NM_TYPE_SERIAL_DEVICE; - creator->capability_str = g_strdup ("serial"); - creator->category = g_strdup ("serial"); - creator->is_device_fn = is_modem_device; - creator->creator_fn = modem_device_creator; - priv->device_creators = g_slist_append (priv->device_creators, creator); - priv->modem_creator = creator; -} - -static void -emit_udi_added (NMHalManager *self, const char *udi, DeviceCreator *creator) -{ - NMHalManagerPrivate *priv = NM_HAL_MANAGER_GET_PRIVATE (self); - char *od = NULL, *tmp, *parent, *subsys = NULL; - - g_return_if_fail (self != NULL); - g_return_if_fail (udi != NULL); - g_return_if_fail (creator != NULL); - - /* For USB serial devices, originating device should really be the "USB Device" - * object, which is the grandparent of the tty device. Only this grandparent - * is really common among all ttys of the device; HAL's "serial.originating_device" - * points to the "USB Interface" parent of the tty, but this interface only - * sometimes has multiple child ttys. More commonly, the "USB Device" - * object provides several "USB Interface" objects, which each provide one tty. - * Thus, to ensure that NM only uses the correct tty for the deivce, - * we need to filter on the "USB Device" instead of the "USB Interface". - */ - parent = libhal_device_get_property_string (priv->hal_ctx, udi, "info.parent", NULL); - if (parent) - subsys = hal_get_subsystem (priv->hal_ctx, parent); - if (subsys && !strcmp (subsys, "usb")) { - char *usb_intf_udi; - - usb_intf_udi = libhal_device_get_property_string (priv->hal_ctx, udi, "info.parent", NULL); - if (usb_intf_udi) { - od = libhal_device_get_property_string (priv->hal_ctx, usb_intf_udi, "info.parent", NULL); - - /* Ensure the grandparent really is the "USB Device" */ - if (od) { - tmp = hal_get_subsystem (priv->hal_ctx, od); - if (!tmp || strcmp (tmp, "usb_device")) { - libhal_free_string (od); - od = NULL; - } - if (tmp) - libhal_free_string (tmp); - } - libhal_free_string (usb_intf_udi); - } - } - libhal_free_string (subsys); - libhal_free_string (parent); - - /* For non-USB devices, and ss a fallback, just use the originating device - * of the tty; though this might result in more than one modem being detected by NM. - */ - if (!od) - od = hal_get_originating_device (priv->hal_ctx, udi, creator->category); - - g_signal_emit (self, signals[UDI_ADDED], 0, - udi, - od, - GSIZE_TO_POINTER (creator->device_type), - creator->creator_fn); - - libhal_free_string (od); } static void @@ -1241,20 +364,13 @@ device_added (LibHalContext *ctx, const */ creator = get_creator (self, udi); if (creator) - emit_udi_added (self, udi, creator); + g_signal_emit (self, signals[UDI_ADDED], 0, udi, creator->device_type_name, creator->creator_fn); } static void device_removed (LibHalContext *ctx, const char *udi) { NMHalManager *self = NM_HAL_MANAGER (libhal_ctx_get_user_data (ctx)); - DeferredModem *modem; - - modem = deferred_modem_find (self, udi); - if (modem) { - deferred_modem_remove (self, modem); - deferred_modem_unref (modem); - } g_signal_emit (self, signals[UDI_REMOVED], 0, udi); } @@ -1267,7 +383,7 @@ device_new_capability (LibHalContext *ct creator = get_creator (self, udi); if (creator) - emit_udi_added (self, udi, creator); + g_signal_emit (self, signals[UDI_ADDED], 0, udi, creator->device_type_name, creator->creator_fn); } static void @@ -1299,7 +415,7 @@ add_initial_devices (NMHalManager *self) for (i = 0; i < num_devices; i++) { if (creator->is_device_fn (self, devices[i])) - emit_udi_added (self, devices[i], creator); + g_signal_emit (self, signals[UDI_ADDED], 0, devices[i], creator->device_type_name, creator->creator_fn); } libhal_free_string_array (devices); @@ -1698,12 +814,6 @@ dispose (GObject *object) g_slist_foreach (priv->device_creators, destroy_creator, NULL); g_slist_free (priv->device_creators); - g_slist_foreach (priv->deferred_modems, (GFunc) deferred_modem_unref, NULL); - g_slist_free (priv->deferred_modems); - - if (priv->deferred_modem_id) - g_source_remove (priv->deferred_modem_id); - hal_deinit (self); G_OBJECT_CLASS (nm_hal_manager_parent_class)->dispose (object); @@ -1738,9 +848,9 @@ nm_hal_manager_class_init (NMHalManagerC G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (NMHalManagerClass, udi_added), NULL, NULL, - _nm_marshal_VOID__STRING_STRING_POINTER_POINTER, - G_TYPE_NONE, 4, - G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_POINTER); + _nm_marshal_VOID__STRING_STRING_POINTER, + G_TYPE_NONE, 3, + G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER); signals[UDI_REMOVED] = g_signal_new ("udi-removed", Index: NetworkManager-0.7.1/src/nm-hal-manager.h =================================================================== --- NetworkManager-0.7.1.orig/src/nm-hal-manager.h +++ NetworkManager-0.7.1/src/nm-hal-manager.h @@ -40,7 +40,6 @@ typedef struct { typedef GObject *(*NMDeviceCreatorFn) (NMHalManager *manager, const char *udi, - const char *origdev_udi, gboolean managed); typedef struct { @@ -49,8 +48,7 @@ typedef struct { /* Virtual functions */ void (*udi_added) (NMHalManager *manager, const char *udi, - const char *originating_device, - gpointer general_device_type, + const char *type_name, NMDeviceCreatorFn creator_fn); void (*udi_removed) (NMHalManager *manager, const char *udi); Index: NetworkManager-0.7.1/src/nm-hso-gsm-device.h =================================================================== --- NetworkManager-0.7.1.orig/src/nm-hso-gsm-device.h +++ /dev/null @@ -1,56 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* NetworkManager -- Network link manager - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Copyright (C) 2008 Red Hat, Inc. - */ - -#ifndef NM_HSO_GSM_DEVICE_H -#define NM_HSO_GSM_DEVICE_H - -#include <nm-gsm-device.h> - -G_BEGIN_DECLS - -#define NM_TYPE_HSO_GSM_DEVICE (nm_hso_gsm_device_get_type ()) -#define NM_HSO_GSM_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_HSO_GSM_DEVICE, NMHsoGsmDevice)) -#define NM_HSO_GSM_DEVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_HSO_GSM_DEVICE, NMHsoGsmDeviceClass)) -#define NM_IS_HSO_GSM_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_HSO_GSM_DEVICE)) -#define NM_IS_HSO_GSM_DEVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_HSO_GSM_DEVICE)) -#define NM_HSO_GSM_DEVICE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_HSO_GSM_DEVICE, NMHsoGsmDeviceClass)) - -#define NM_HSO_GSM_DEVICE_NETDEV_IFACE "netdev-iface" - -typedef struct { - NMGsmDevice parent; -} NMHsoGsmDevice; - -typedef struct { - NMGsmDeviceClass parent; -} NMHsoGsmDeviceClass; - -GType nm_hso_gsm_device_get_type (void); - -NMHsoGsmDevice *nm_hso_gsm_device_new (const char *udi, - const char *data_iface, - const char *monitor_iface, - const char *netdev_iface, - const char *driver, - gboolean managed); - -G_END_DECLS - -#endif /* NM_HSO_GSM_DEVICE_H */ Index: NetworkManager-0.7.1/src/nm-manager.c =================================================================== --- NetworkManager-0.7.1.orig/src/nm-manager.c +++ NetworkManager-0.7.1/src/nm-manager.c @@ -29,11 +29,11 @@ #include "nm-utils.h" #include "nm-dbus-manager.h" #include "nm-vpn-manager.h" +#include "nm-modem-manager.h" #include "nm-device-interface.h" #include "nm-device-private.h" #include "nm-device-ethernet.h" #include "nm-device-wifi.h" -#include "nm-serial-device.h" #include "NetworkManagerSystem.h" #include "nm-properties-changed-signal.h" #include "nm-setting-connection.h" @@ -79,8 +79,7 @@ static void connection_added_default_han static void hal_manager_udi_added_cb (NMHalManager *hal_mgr, const char *udi, - const char *originating_device, - gpointer general_type_ptr, + const char *type_name, NMDeviceCreatorFn creator_fn, gpointer user_data); @@ -99,8 +98,10 @@ static void system_settings_properties_c GHashTable *properties, gpointer user_data); +static void add_device (NMManager *self, NMDevice *device, const char *type_name); +static void remove_one_device (NMManager *manager, NMDevice *device); + #define SSD_POKE_INTERVAL 120 -#define ORIGDEV_TAG "originating-device" typedef struct { DBusGMethodInvocation *context; @@ -138,6 +139,10 @@ typedef struct { NMVPNManager *vpn_manager; guint vpn_manager_id; + NMModemManager *modem_manager; + guint modem_added_id; + guint modem_removed_id; + DBusGProxy *aipd_proxy; gboolean disposed; @@ -246,6 +251,36 @@ vpn_manager_connection_deactivated_cb (N } static void +modem_added (NMModemManager *modem_manager, + NMDevice *modem, + gpointer user_data) +{ + NMDeviceType type; + const char *type_name; + + type = nm_device_get_device_type (NM_DEVICE (modem)); + if (type == NM_DEVICE_TYPE_GSM) + type_name = "GSM modem"; + else if (type == NM_DEVICE_TYPE_CDMA) + type_name = "CDMA modem"; + else + type_name = "Unknown modem"; + + add_device (NM_MANAGER (user_data), NM_DEVICE (g_object_ref (modem)), type_name); +} + +static void +modem_removed (NMModemManager *modem_manager, + NMDevice *modem, + gpointer user_data) +{ + NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (user_data); + + remove_one_device (NM_MANAGER (user_data), modem); + priv->devices = g_slist_remove (priv->devices, modem); +} + +static void aipd_handle_event (DBusGProxy *proxy, const char *event, const char *iface, @@ -308,6 +343,12 @@ nm_manager_init (NMManager *manager) g_free, g_object_unref); + priv->modem_manager = nm_modem_manager_get (); + priv->modem_added_id = g_signal_connect (priv->modem_manager, "device-added", + G_CALLBACK (modem_added), manager); + priv->modem_removed_id = g_signal_connect (priv->modem_manager, "device-removed", + G_CALLBACK (modem_removed), manager); + priv->vpn_manager = nm_vpn_manager_get (); id = g_signal_connect (G_OBJECT (priv->vpn_manager), "connection-deactivated", G_CALLBACK (vpn_manager_connection_deactivated_cb), manager); @@ -507,6 +548,16 @@ dispose (GObject *object) } g_object_unref (priv->vpn_manager); + if (priv->modem_added_id) { + g_source_remove (priv->modem_added_id); + priv->modem_added_id = 0; + } + if (priv->modem_removed_id) { + g_source_remove (priv->modem_removed_id); + priv->modem_removed_id = 0; + } + g_object_unref (priv->modem_manager); + g_object_unref (priv->dbus_mgr); g_object_unref (priv->hal_mgr); @@ -1160,37 +1211,6 @@ nm_manager_get_device_by_udi (NMManager return NULL; } -static GSList * -nm_manager_get_devices_by_originating_device (NMManager *manager, const char *od) -{ - GSList *iter, *devs = NULL; - - for (iter = NM_MANAGER_GET_PRIVATE (manager)->devices; iter; iter = iter->next) { - const char *candidate_od = g_object_get_data (G_OBJECT (iter->data), ORIGDEV_TAG); - - if (candidate_od && !strcmp (candidate_od, od)) - devs = g_slist_append (devs, G_OBJECT (iter->data)); - } - return devs; -} - -static const char * -nm_manager_get_originating_device (NMDevice *device) -{ - g_return_val_if_fail (device != NULL, NULL); - - return (const char *) g_object_get_data (G_OBJECT (device), ORIGDEV_TAG); -} - -static void -nm_manager_set_originating_device (NMDevice *device, const char *originating_device) -{ - g_return_if_fail (device != NULL); - g_return_if_fail (originating_device != NULL); - - g_object_set_data_full (G_OBJECT (device), ORIGDEV_TAG, g_strdup (originating_device), g_free); -} - static gboolean nm_manager_udi_is_managed (NMManager *self, const char *udi) { @@ -1682,47 +1702,11 @@ next: } static void -hal_manager_udi_added_cb (NMHalManager *hal_mgr, - const char *udi, - const char *originating_device, - gpointer general_type_ptr, - NMDeviceCreatorFn creator_fn, - gpointer user_data) +add_device (NMManager *self, NMDevice *device, const char *type_name) { - NMManager *self = NM_MANAGER (user_data); NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self); - GObject *device; - const char *iface, *driver; - GType general_type = GPOINTER_TO_SIZE (general_type_ptr); - - if (priv->sleeping) - return; - - /* Make sure the device is not already in the device list */ - if (nm_manager_get_device_by_udi (self, udi)) - return; - - /* Ignore multiple ports for serial devices */ - if (general_type == NM_TYPE_SERIAL_DEVICE) { - GSList *devices, *iter; - - devices = nm_manager_get_devices_by_originating_device (self, originating_device); - for (iter = devices; iter; iter = g_slist_next (iter)) { - NMDevice *candidate = NM_DEVICE (iter->data); - - if (candidate && NM_IS_SERIAL_DEVICE (candidate)) { - g_slist_free (devices); - return; - } - } - g_slist_free (devices); - } - - device = creator_fn (hal_mgr, udi, originating_device, nm_manager_udi_is_managed (self, udi)); - if (!device) - return; - - nm_manager_set_originating_device (NM_DEVICE (device), originating_device); + const char *iface; + const char *driver; priv->devices = g_slist_append (priv->devices, device); @@ -1744,62 +1728,62 @@ hal_manager_udi_added_cb (NMHalManager * iface = nm_device_get_iface (NM_DEVICE (device)); driver = nm_device_get_driver (NM_DEVICE (device)); - if (!driver) - driver = "unknown"; - - if (general_type == NM_TYPE_DEVICE_ETHERNET) - nm_info ("(%s): new Ethernet device (driver: '%s')", iface, driver); - else if (general_type == NM_TYPE_DEVICE_WIFI) - nm_info ("(%s): new 802.11 WiFi device (driver: '%s')", iface, driver); - else if (general_type == NM_TYPE_SERIAL_DEVICE) - nm_info ("(%s): new Modem device (driver: '%s')", iface, driver); - else - g_assert_not_reached (); + nm_info ("Found new %s device '%s' (driver: '%s').", + type_name, iface, driver ? driver : "unknown"); dbus_g_connection_register_g_object (nm_dbus_manager_get_connection (priv->dbus_mgr), nm_device_get_udi (NM_DEVICE (device)), - device); - nm_info ("(%s): exported as %s", iface, udi); + G_OBJECT (device)); + nm_info ("(%s): exported as %s", iface, nm_device_get_udi (device)); g_signal_emit (self, signals[DEVICE_ADDED], 0, device); } static void +hal_manager_udi_added_cb (NMHalManager *hal_mgr, + const char *udi, + const char *type_name, + NMDeviceCreatorFn creator_fn, + gpointer user_data) +{ + NMManager *self = NM_MANAGER (user_data); + NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self); + GObject *device; + + if (priv->sleeping) + return; + + /* Make sure the device is not already in the device list */ + if (nm_manager_get_device_by_udi (self, udi)) + return; + + device = creator_fn (hal_mgr, udi, nm_manager_udi_is_managed (self, udi)); + if (!device) + return; + + add_device (self, NM_DEVICE (device), type_name); +} + +static void hal_manager_udi_removed_cb (NMHalManager *manager, const char *udi, gpointer user_data) { NMManager *self = NM_MANAGER (user_data); NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self); - GSList *keep = NULL, *gone = NULL, *iter; + GSList *iter; g_return_if_fail (udi != NULL); - /* Unfortunately, udev >= 139 sometimes sends remove events that don't - * match up with the add event for a device, which means HAL doesn't - * emit the remove event for the same device (fdo #20703). But it's a - * good bet that if an NMDevice's originating device got removed, then - * the NMDevice itself got removed as well. - */ for (iter = priv->devices; iter; iter = iter->next) { NMDevice *device = NM_DEVICE (iter->data); - const char *origdev = nm_manager_get_originating_device (device); - if ( !strcmp (nm_device_get_udi (device), udi) - || (origdev && !strcmp (udi, origdev))) - gone = g_slist_prepend (gone, device); - else - keep = g_slist_append (keep, device); + if (!strcmp (nm_device_get_udi (device), udi)) { + priv->devices = g_slist_delete_link (priv->devices, iter); + remove_one_device (self, device); + break; + } } - g_slist_free (priv->devices); - priv->devices = keep; - - /* Kill devices to be removed; have to call remove_one_device() *after* - * the device is no longer a member of the device list. - */ - for (iter = gone; iter; iter = g_slist_next (iter)) - remove_one_device (self, NM_DEVICE (iter->data)); - g_slist_free (gone); } static void Index: NetworkManager-0.7.1/src/nm-serial-device.h =================================================================== --- NetworkManager-0.7.1.orig/src/nm-serial-device.h +++ /dev/null @@ -1,110 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* NetworkManager -- Network link manager - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Copyright (C) 2007 - 2008 Novell, Inc. - * Copyright (C) 2007 - 2008 Red Hat, Inc. - */ - -#ifndef NM_SERIAL_DEVICE_H -#define NM_SERIAL_DEVICE_H - -#include <nm-device.h> -#include <nm-setting-serial.h> -#include "ppp-manager/nm-ppp-manager.h" - -G_BEGIN_DECLS - -#define NM_TYPE_SERIAL_DEVICE (nm_serial_device_get_type ()) -#define NM_SERIAL_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_SERIAL_DEVICE, NMSerialDevice)) -#define NM_SERIAL_DEVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_SERIAL_DEVICE, NMSerialDeviceClass)) -#define NM_IS_SERIAL_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_SERIAL_DEVICE)) -#define NM_IS_SERIAL_DEVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_SERIAL_DEVICE)) -#define NM_SERIAL_DEVICE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_SERIAL_DEVICE, NMSerialDeviceClass)) - -typedef struct { - NMDevice parent; -} NMSerialDevice; - -typedef struct { - NMDeviceClass parent; - - const char * (*get_ppp_name) (NMSerialDevice *device, NMActRequest *req); - - /* Signals */ - void (*ppp_stats) (NMSerialDevice *device, guint32 in_bytes, guint32 out_bytes); -} NMSerialDeviceClass; - -GType nm_serial_device_get_type (void); - -typedef void (*NMSerialGetReplyFn) (NMSerialDevice *device, - const char *reply, - gpointer user_data); - -typedef void (*NMSerialWaitForReplyFn) (NMSerialDevice *device, - int reply_index, - const char *reply, - gpointer user_data); - -typedef void (*NMSerialWaitQuietFn) (NMSerialDevice *device, - gboolean timed_out, - gpointer user_data); - -typedef void (*NMSerialFlashFn) (NMSerialDevice *device, - gpointer user_data); - - - -gboolean nm_serial_device_open (NMSerialDevice *device, - NMSettingSerial *setting); - -void nm_serial_device_close (NMSerialDevice *device); -gboolean nm_serial_device_send_command (NMSerialDevice *device, - GByteArray *command); - -gboolean nm_serial_device_send_command_string (NMSerialDevice *device, - const char *str); - -int nm_serial_device_wait_reply_blocking (NMSerialDevice *device, - guint32 timeout_secs, - const char **needles, - const char **terminators); - -guint nm_serial_device_wait_for_reply (NMSerialDevice *device, - guint timeout, - const char **responses, - const char **terminators, - NMSerialWaitForReplyFn callback, - gpointer user_data); - -void nm_serial_device_wait_quiet (NMSerialDevice *device, - guint timeout, - guint quiet_time, - NMSerialWaitQuietFn callback, - gpointer user_data); - -guint nm_serial_device_flash (NMSerialDevice *device, - guint32 flash_time, - NMSerialFlashFn callback, - gpointer user_data); - -GIOChannel *nm_serial_device_get_io_channel (NMSerialDevice *device); - -NMPPPManager *nm_serial_device_get_ppp_manager (NMSerialDevice *device); - -G_END_DECLS - -#endif /* NM_SERIAL_DEVICE_H */
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor