1. 22 Jan, 2015 3 commits
    • Aleksander Morgado's avatar
      wwan: wait for pppd to exit before relaying the port to ModemManager · fe090c34
      Aleksander Morgado authored
      ModemManager needs to have CLOCAL set in the TTY termios configuration, in order
      to notify the kernel that modem control lines are not in effect (e.g. so that a
      transition to LOW in the DCD input control line doesn't trigger a hangup in the
      TTY).
      
      pppd in the other hand, needs CLOCAL unset in order to have proper modem control
      lines in effect during the PPP session. So, when pppd starts it will store the
      original termios settings, and before exiting it will restore the original
      settings in the TTY. In other words, if CLOCAL was set before launching pppd,
      CLOCAL will be also set after pppd exits.
      
      Now, in order for this sequence to work correctly, NetworkManager also needs to
      make sure that ModemManager is notified about the disconnection only after pppd
      has really finished re-configuring the TTY.
      
      https://bugzilla.gnome.org/show_bug.cgi?id=734347
      
      ----------------------
      
      Once the patch is applied, we will be making sure that ModemManager is only
      notified about the disconnection AFTER pppd has fully exited:
          NetworkManager[27589]: <info>  (ttyUSB2): device state change: activated -> deactivating (reason 'user-requested') [100 110 39]
          Terminating on signal 15
          nm-pppd-plugin-Message: nm-ppp-plugin: (nm_phasechange): status 10 / phase 'terminate'
          nm-pppd-plugin-Message: nm-ppp-plugin: (nm_phasechange): status 8 / phase 'network'
          Connect time 0.3 minutes.
          Sent 56 bytes, received 0 bytes.
          nm-pppd-plugin-Message: nm-ppp-plugin: (nm_phasechange): status 5 / phase 'establish'
          nm-pppd-plugin-Message: nm-ppp-plugin: (nm_phasechange): status 11 / phase 'disconnect'
          Connection terminated.
          nm-pppd-plugin-Message: nm-ppp-plugin: (nm_phasechange): status 1 / phase 'dead'
          nm-pppd-plugin-Message: nm-ppp-plugin: (nm_exit_notify): cleaning up
          NetworkManager[27589]: <warn>  pppd pid 27617 exited with error: pppd received a signal
          NetworkManager[27589]: <info>  (ttyUSB2): modem state changed, 'connected' --> 'disconnecting' (reason: user-requested)
          NetworkManager[27589]: <info>  (ttyUSB2): modem state changed, 'disconnecting' --> 'registered' (reason: user-requested)
          NetworkManager[27589]: <info>  (ttyUSB2) modem deactivation finished
          NetworkManager[27589]: <info>  (ttyUSB2): device state change: deactivating -> disconnected (reason 'user-requested') [110 30 39]
          NetworkManager[27589]: <info>  (ttyUSB2): deactivating device (reason 'user-requested') [39]
      fe090c34
    • Aleksander Morgado's avatar
      ec61601a
    • Aleksander Morgado's avatar
      ppp-manager: new async stop() method to request stop and wait for it to complete · 14f732e8
      Aleksander Morgado authored
      This method doesn't prevent the original logic in which the child process was
      stopped when the last reference of the PPP manager was unref-ed.
      14f732e8
  2. 21 Jan, 2015 10 commits
  3. 20 Jan, 2015 2 commits
  4. 19 Jan, 2015 13 commits
  5. 16 Jan, 2015 2 commits
  6. 15 Jan, 2015 10 commits
    • Dan Winship's avatar
    • Dan Winship's avatar
      libnm-core: validate property types from D-Bus (rh #1182567) · 76d9fc91
      Dan Winship authored
      In _nm_setting_new_from_dbus(), verify that the properties have the
      right types, and return an error if not. (In particular, don't crash
      if someone tries to assign a GBytes-valued property a non-'ay' value.)
      76d9fc91
    • Dan Winship's avatar
      libnm-core: simplify _nm_setting_new_from_dbus() · d80e1001
      Dan Winship authored
      libnm-util's nm_setting_new_from_hash() needed to call
      g_type_class_ref(setting_type) to ensure that the class had been
      initialized by the time we fetched its properties. But in libnm-core's
      version, we create the setting object before fetching the list of
      properties, so we know the class will already have been initialized by
      that point.
      d80e1001
    • Dan Winship's avatar
      bbbbca27
    • Aleksander Morgado's avatar
      platform: avoid storing unknown netlink object types (bgo #742928) · bf7865e8
      Aleksander Morgado authored
      Testing WWAN connections through a Nokia Series 40 phone, addresses of family
      AF_PHONET end up triggering an assert() in object_has_ifindex(), just because
      object_type_from_nl_object() only handles AF_INET and AF_INET6 address.
      
      In order to avoid this kind of problems, we'll try to make sure that the object
      caches kept by NM only store known object types.
      
      (fixup by dcbw to use cached passed to cache_remove_unknown())
      
      https://bugzilla.gnome.org/show_bug.cgi?id=742928
      
          Connect: ppp0 <--> /dev/ttyACM0
          nm-pppd-plugin-Message: nm-ppp-plugin: (nm_phasechange): status 5 / phase 'establish'
          NetworkManager[27434]: <info>  (ppp0): new Generic device (driver: 'unknown' ifindex: 12)
          NetworkManager[27434]: <info>  (ppp0): exported as /org/freedesktop/NetworkManager/Devices/4
          [Thread 0x7ffff1ecf700 (LWP 27439) exited]
          NetworkManager[27434]: <info>  (ttyACM0): device state change: ip-config -> deactivating (reason 'user-requested') [70 110 39]
          Terminating on signal 15
          nm-pppd-plugin-Message: nm-ppp-plugin: (nm_phasechange): status 10 / phase 'terminate'
          **
          NetworkManager:ERROR:platform/nm-linux-platform.c:1534:object_has_ifindex: code should not be reached
      
          Program received signal SIGABRT, Aborted.
          0x00007ffff4692a97 in raise () from /usr/lib/libc.so.6
          (gdb) bt
          #0  0x00007ffff4692a97 in raise () from /usr/lib/libc.so.6
          #1  0x00007ffff4693e6a in abort () from /usr/lib/libc.so.6
          #2  0x00007ffff4c8d7f5 in g_assertion_message () from /usr/lib/libglib-2.0.so.0
          #3  0x00007ffff4c8d88a in g_assertion_message_expr () from /usr/lib/libglib-2.0.so.0
          #4  0x0000000000472b91 in object_has_ifindex (object=0x8a8320, ifindex=12) at platform/nm-linux-platform.c:1534
          #5  0x0000000000472bec in check_cache_items (platform=0x7fe8a0, cache=0x7fda30, ifindex=12) at platform/nm-linux-platform.c:1549
          #6  0x0000000000472de3 in announce_object (platform=0x7fe8a0, object=0x8a8c30, change_type=NM_PLATFORM_SIGNAL_REMOVED, reason=NM_PLATFORM_REASON_EXTERNAL) at platform/nm-linux-platform.c:1617
          #7  0x0000000000473dd2 in event_notification (msg=0x8a7970, user_data=0x7fe8a0) at platform/nm-linux-platform.c:1992
          #8  0x00007ffff5ee14de in nl_recvmsgs_report () from /usr/lib/libnl-3.so.200
          #9  0x00007ffff5ee1849 in nl_recvmsgs () from /usr/lib/libnl-3.so.200
          #10 0x00000000004794df in event_handler (channel=0x7fc930, io_condition=G_IO_IN, user_data=0x7fe8a0) at platform/nm-linux-platform.c:4152
          #11 0x00007ffff4c6791d in g_main_context_dispatch () from /usr/lib/libglib-2.0.so.0
          #12 0x00007ffff4c67cf8 in ?? () from /usr/lib/libglib-2.0.so.0
          #13 0x00007ffff4c68022 in g_main_loop_run () from /usr/lib/libglib-2.0.so.0
          #14 0x00000000004477ee in main (argc=1, argv=0x7fffffffeaa8) at main.c:447
          (gdb) fr 4
          #4  0x0000000000472b91 in object_has_ifindex (object=0x8a8320, ifindex=12) at platform/nm-linux-platform.c:1534
          1534                    g_assert_not_reached ();
      bf7865e8
    • Dan Williams's avatar
      Revert "platform: avoid storing unknown netlink object types (bgo #742928)" · dd20407c
      Dan Williams authored
      This reverts commit 6c1a6d2d.
      
      Mistaken push; it'll get committed, just needs a slight fixup.
      dd20407c
    • Dan Williams's avatar
      platform: don't read past end of address array (bgo #742937) · d2871089
      Dan Williams authored
      The address might be zero-size, and therefore nl_addr_get_binary_addr()
      returns a pointer to a zero-size array.  We don't want to read past the
      end of that array.  Since zero-size addresses really mean an address
      of all zeros, just make that happen.
      
      As an additional optimization, if the prefix length is zero, the whole
      address is host bits and should be cleared.
      
      ==30286== Invalid read of size 4
      ==30286==    at 0x478090: clear_host_address (nm-linux-platform.c:3786)
      ==30286==    by 0x4784D4: route_search_cache (nm-linux-platform.c:3883)
      ==30286==    by 0x4785A1: refresh_route (nm-linux-platform.c:3901)
      ==30286==    by 0x4787B6: ip4_route_delete (nm-linux-platform.c:3978)
      ==30286==    by 0x47F674: nm_platform_ip4_route_delete (nm-platform.c:1980)
      ==30286==    by 0x4B279D: _v4_platform_route_delete_default (nm-default-route-manager.c:1122)
      ==30286==    by 0x4AEF03: _platform_route_sync_flush (nm-default-route-manager.c:320)
      ==30286==    by 0x4B043E: _resync_all (nm-default-route-manager.c:574)
      ==30286==    by 0x4B0CA7: _entry_at_idx_remove (nm-default-route-manager.c:631)
      ==30286==    by 0x4B1A66: _ipx_update_default_route (nm-default-route-manager.c:806)
      ==30286==    by 0x4B1A9C: nm_default_route_manager_ip4_update_default_route (nm-default-route-manager.c:813)
      ==30286==    by 0x45C3BC: _cleanup_generic_post (nm-device.c:7143)
      ==30286==  Address 0xee33514 is 0 bytes after a block of size 20 alloc'd
      ==30286==    at 0x4C2C080: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
      ==30286==    by 0x6B2B0B1: nl_addr_alloc (in /usr/lib/libnl-3.so.200.20.0)
      ==30286==    by 0x6B2B0E3: nl_addr_build (in /usr/lib/libnl-3.so.200.20.0)
      ==30286==    by 0x6B2B181: nl_addr_clone (in /usr/lib/libnl-3.so.200.20.0)
      ==30286==    by 0x66DB0D7: ??? (in /usr/lib/libnl-route-3.so.200.20.0)
      ==30286==    by 0x6B33CE6: nl_object_clone (in /usr/lib/libnl-3.so.200.20.0)
      ==30286==    by 0x6B2D303: nl_cache_add (in /usr/lib/libnl-3.so.200.20.0)
      ==30286==    by 0x472E55: refresh_object (nm-linux-platform.c:1735)
      ==30286==    by 0x473137: add_object (nm-linux-platform.c:1795)
      ==30286==    by 0x478373: ip4_route_add (nm-linux-platform.c:3846)
      ==30286==    by 0x47F375: nm_platform_ip4_route_add (nm-platform.c:1939)
      ==30286==    by 0x4AEC06: _platform_route_sync_add (nm-default-route-manager.c:254)
      
      https://bugzilla.gnome.org/show_bug.cgi?id=742937
      d2871089
    • Aleksander Morgado's avatar
      platform: avoid storing unknown netlink object types (bgo #742928) · 6c1a6d2d
      Aleksander Morgado authored
      Testing WWAN connections through a Nokia Series 40 phone, addresses of family
      AF_PHONET end up triggering an assert() in object_has_ifindex(), just because
      object_type_from_nl_object() only handles AF_INET and AF_INET6 address.
      
      In order to avoid this kind of problems, we'll try to make sure that the object
      caches kept by NM only store known object types.
      
      https://bugzilla.gnome.org/show_bug.cgi?id=742928
      
          Connect: ppp0 <--> /dev/ttyACM0
          nm-pppd-plugin-Message: nm-ppp-plugin: (nm_phasechange): status 5 / phase 'establish'
          NetworkManager[27434]: <info>  (ppp0): new Generic device (driver: 'unknown' ifindex: 12)
          NetworkManager[27434]: <info>  (ppp0): exported as /org/freedesktop/NetworkManager/Devices/4
          [Thread 0x7ffff1ecf700 (LWP 27439) exited]
          NetworkManager[27434]: <info>  (ttyACM0): device state change: ip-config -> deactivating (reason 'user-requested') [70 110 39]
          Terminating on signal 15
          nm-pppd-plugin-Message: nm-ppp-plugin: (nm_phasechange): status 10 / phase 'terminate'
          **
          NetworkManager:ERROR:platform/nm-linux-platform.c:1534:object_has_ifindex: code should not be reached
      
          Program received signal SIGABRT, Aborted.
          0x00007ffff4692a97 in raise () from /usr/lib/libc.so.6
          (gdb) bt
          #0  0x00007ffff4692a97 in raise () from /usr/lib/libc.so.6
          #1  0x00007ffff4693e6a in abort () from /usr/lib/libc.so.6
          #2  0x00007ffff4c8d7f5 in g_assertion_message () from /usr/lib/libglib-2.0.so.0
          #3  0x00007ffff4c8d88a in g_assertion_message_expr () from /usr/lib/libglib-2.0.so.0
          #4  0x0000000000472b91 in object_has_ifindex (object=0x8a8320, ifindex=12) at platform/nm-linux-platform.c:1534
          #5  0x0000000000472bec in check_cache_items (platform=0x7fe8a0, cache=0x7fda30, ifindex=12) at platform/nm-linux-platform.c:1549
          #6  0x0000000000472de3 in announce_object (platform=0x7fe8a0, object=0x8a8c30, change_type=NM_PLATFORM_SIGNAL_REMOVED, reason=NM_PLATFORM_REASON_EXTERNAL) at platform/nm-linux-platform.c:1617
          #7  0x0000000000473dd2 in event_notification (msg=0x8a7970, user_data=0x7fe8a0) at platform/nm-linux-platform.c:1992
          #8  0x00007ffff5ee14de in nl_recvmsgs_report () from /usr/lib/libnl-3.so.200
          #9  0x00007ffff5ee1849 in nl_recvmsgs () from /usr/lib/libnl-3.so.200
          #10 0x00000000004794df in event_handler (channel=0x7fc930, io_condition=G_IO_IN, user_data=0x7fe8a0) at platform/nm-linux-platform.c:4152
          #11 0x00007ffff4c6791d in g_main_context_dispatch () from /usr/lib/libglib-2.0.so.0
          #12 0x00007ffff4c67cf8 in ?? () from /usr/lib/libglib-2.0.so.0
          #13 0x00007ffff4c68022 in g_main_loop_run () from /usr/lib/libglib-2.0.so.0
          #14 0x00000000004477ee in main (argc=1, argv=0x7fffffffeaa8) at main.c:447
          (gdb) fr 4
          #4  0x0000000000472b91 in object_has_ifindex (object=0x8a8320, ifindex=12) at platform/nm-linux-platform.c:1534
          1534                    g_assert_not_reached ();
      6c1a6d2d
    • Dan Winship's avatar
    • Dan Winship's avatar
      connectivity: avoid redundant connectivity checks · 66b8f2b7
      Dan Winship authored
      Don't start an automatic connectivity check right when NMManager tells
      us we're online; only do it if the manager doesn't request an explicit
      connectivity check immediately afterward.
      66b8f2b7