diff options
author | Olivier Blin <oblin@mandriva.com> | 2008-11-17 20:25:37 +0000 |
---|---|---|
committer | Olivier Blin <oblin@mandriva.com> | 2008-11-17 20:25:37 +0000 |
commit | b4da1e191c45c83b1ba22a9b9266acb531faacf1 (patch) | |
tree | 954967e60e27789857b21b7cc248423ff175f807 | |
parent | 520776ebb3dc137ea3a011a6996144520905f73f (diff) | |
download | drakx-net-b4da1e191c45c83b1ba22a9b9266acb531faacf1.tar drakx-net-b4da1e191c45c83b1ba22a9b9266acb531faacf1.tar.gz drakx-net-b4da1e191c45c83b1ba22a9b9266acb531faacf1.tar.bz2 drakx-net-b4da1e191c45c83b1ba22a9b9266acb531faacf1.tar.xz drakx-net-b4da1e191c45c83b1ba22a9b9266acb531faacf1.zip |
- wireless backend (backport from 0.52):
o correctly initialize monitor object in
draknetcenter/drakroam/net_applet so that it can be reused later
(and thus pre-select correct network in wpa_supplicant)
o run wpa_cli select_network as fallback when network monitor (mandi)
is not available
o refresh wpa_supplicant network ids after wpa_supplicant is restarted too
o keep track of hidden networks
o write bssid in wpa_supplicant.conf for hidden networks
(helps getting network ids of hidden networks)
o set scan_ssid to 1 only for hidden or non-broadcasted SSIDs
(based on an idea from Pascal Terjan)
o set higher priority (1) for encrypted wpa_supplicant networks
(based on an idea from Patrick Sinz)
-rwxr-xr-x | bin/draknetcenter | 2 | ||||
-rwxr-xr-x | bin/drakroam | 2 | ||||
-rwxr-xr-x | bin/net_applet | 9 | ||||
-rw-r--r-- | lib/network/connection/wireless.pm | 45 | ||||
-rw-r--r-- | lib/network/monitor.pm | 1 | ||||
-rwxr-xr-x | lib/network/netcenter.pm | 2 |
6 files changed, 33 insertions, 28 deletions
diff --git a/bin/draknetcenter b/bin/draknetcenter index b822550..b2f8d14 100755 --- a/bin/draknetcenter +++ b/bin/draknetcenter @@ -11,6 +11,7 @@ BEGIN { unshift @::textdomains, 'drakx-net' } use standalone; use network::network; +use network::monitor; use network::netcenter; use dbus_object; @@ -19,5 +20,6 @@ my $net = {}; network::network::read_net_conf($net); my $dbus; eval { $dbus = dbus_object::system_bus() }; +eval { $net->{monitor} = network::monitor->new($dbus) } if $dbus; network::netcenter::main($in, $net, $dbus); diff --git a/bin/drakroam b/bin/drakroam index 6f56c82..0c6c400 100755 --- a/bin/drakroam +++ b/bin/drakroam @@ -14,6 +14,7 @@ BEGIN { unshift @::textdomains, 'drakx-net' } use standalone; use common; use network::drakroam; +use network::monitor; my %args = map { if_(/^--(\w+)=(.*)$/ && member($1, qw(ap interface)), $1 => $2) } @ARGV; @@ -22,5 +23,6 @@ my $net = {}; network::network::read_net_conf($net); my $dbus; eval { $dbus = dbus_object::system_bus() }; +eval { $net->{monitor} = network::monitor->new($dbus) } if $dbus; network::drakroam::main($in, $net, $dbus, $args{interface}, $args{ap}); diff --git a/bin/net_applet b/bin/net_applet index 4c91f32..d20f5ed 100755 --- a/bin/net_applet +++ b/bin/net_applet @@ -173,9 +173,8 @@ my %actions = ( $icon = Gtk2::StatusIcon->new; -my ($monitor); eval { $dbus = dbus_object::system_bus() } if !defined($global_settings{NET_APPLET_DBUS}) || text2bool($global_settings{NET_APPLET_DBUS}); -eval { $monitor = network::monitor->new($dbus) } if $dbus; +eval { $net->{monitor} = network::monitor->new($dbus) } if $dbus; eval { require network::net_applet::ifw; network::net_applet::ifw::create(); @@ -256,8 +255,8 @@ sub generate_wireless_menuitem { 0, $menuitem->{security} = Gtk2::Image->new, )); $menuitem->{activate} = $menuitem->{widget}->signal_connect('activate' => sub { - if ($monitor && exists $wnet->{id}) { - eval { $monitor->select_network($wnet->{id}) }; + if ($net->{monitor} && exists $wnet->{id}) { + eval { $net->{monitor}->select_network($wnet->{id}) }; $@ and err_dialog(N("Interactive Firewall"), N("Unable to contact daemon")); } else { run_drakroam($wnet->{ap}); @@ -280,7 +279,7 @@ sub update_wireless_item { } sub checkWireless() { $wireless_device or return; - my ($networks) = network::monitor::list_wireless($monitor); + my ($networks) = network::monitor::list_wireless($net->{monitor}); my $force_applet_update; foreach (keys %$networks) { exists $wireless_networks{$_} or $force_applet_update = 1; diff --git a/lib/network/connection/wireless.pm b/lib/network/connection/wireless.pm index 203dbef..76fb00f 100644 --- a/lib/network/connection/wireless.pm +++ b/lib/network/connection/wireless.pm @@ -4,6 +4,7 @@ use base qw(network::connection::ethernet); use strict; use common; +use log; #- class attributes: #- network: ID of the selected network @@ -321,10 +322,9 @@ sub get_networks { sub refresh_roaming_ids { my ($self) = @_; #- needed when switching from non-roaming to roaming - #- to get wpa_supplicant network IDs - get_networks($self) if - $self->{control}{roaming} && - !any { defined $_->{id} } values %{$self->{networks}}; + #- or after restarting wpa_supplicant + #- to get fresh wpa_supplicant network IDs + get_networks($self) if $self->{control}{roaming}; } sub guess_network { @@ -349,6 +349,7 @@ sub guess_network_access_settings { $self->{ifcfg}; $ifcfg ||= {}; + $self->{access}{network}{bssid} = $network && $network->{hidden} && $network->{ap}; $self->{access}{network}{essid} = $network && $network->{essid} || $ifcfg->{WIRELESS_ESSID} || !$network && "any"; ($self->{access}{network}{key}, my $restricted, $self->{access}{network}{force_ascii_key}) = get_wep_key_from_iwconfig($ifcfg->{WIRELESS_ENC_KEY}); @@ -619,7 +620,7 @@ sub add_nework_to_wpa_supplicant { if ($self->{access}{network}{encryption} eq 'wpa-eap') { wpa_supplicant_add_eap_network($self->{access}{network}); } else { - wpa_supplicant_add_network($self->{access}{network}{essid}, $self->{access}{network}{encryption}, $self->{access}{network}{key}, $self->{access}{network}{force_ascii_key}, $self->{access}{network}{mode}); + wpa_supplicant_add_network($self->{access}{network}{essid}, $self->{access}{network}{bssid}, $self->{access}{network}{encryption}, $self->{access}{network}{key}, $self->{access}{network}{force_ascii_key}, $self->{access}{network}{mode}); } } @@ -656,26 +657,26 @@ sub network_is_configured { } } -sub prepare_connection { - my ($self) = @_; - if ($self->{control}{roaming}) { - #- this should be handled by the monitoring daemon instead - run_program::run('/usr/sbin/wpa_cli', 'reconfigure'); - sleep 2; - } -} - sub connect { my ($self, $_in, $net) = @_; $self->SUPER::connect; if ($self->{control}{roaming}) { - refresh_roaming_ids($self); - my $network = $self->get_selected_network; - if ($network && defined $network->{id}) { - eval { $net->{monitor}->select_network($network->{id}) }; - return !$@; + my $network_id; + foreach (0 .. 1) { + refresh_roaming_ids($self) if $_; + my $network = $self->get_selected_network; + $network_id = $network->{id} if $network && defined $network->{id}; + } + if (defined $network_id) { + if ($net->{monitor}) { + log::explanations("selecting wpa_supplicant network $network_id through network monitor"); + eval { $net->{monitor}->select_network($network_id) }; + return !$@; + } else { + run_program::run('/usr/sbin/wpa_cli', 'select_network', $network_id); + } } } } @@ -818,11 +819,13 @@ sub wpa_supplicant_get_driver { } sub wpa_supplicant_add_network { - my ($essid, $enc_mode, $key, $force_ascii, $mode) = @_; + my ($essid, $bssid, $enc_mode, $key, $force_ascii, $mode) = @_; my $conf = wpa_supplicant_read_conf(); my $network = { ssid => qq("$essid"), - scan_ssid => 1, + scan_ssid => to_bool($bssid), #- hidden or non-broadcasted SSIDs + if_($bssid, bssid => $bssid), + if_($enc_mode ne 'none', priority => 1), }; if ($enc_mode eq 'wpa-psk') { diff --git a/lib/network/monitor.pm b/lib/network/monitor.pm index abe5680..7e644b6 100644 --- a/lib/network/monitor.pm +++ b/lib/network/monitor.pm @@ -111,6 +111,7 @@ sub list_wireless { } foreach (values %networks) { + $_->{hidden} = member($_->{essid}, '', '<hidden>'); $_->{essid} eq '<hidden>' and undef $_->{essid}; $_->{name} = $_->{essid} || "[$_->{ap}]"; } diff --git a/lib/network/netcenter.pm b/lib/network/netcenter.pm index d8e0cea..19b4207 100755 --- a/lib/network/netcenter.pm +++ b/lib/network/netcenter.pm @@ -148,8 +148,6 @@ sub main { ); if ($dbus) { - my $monitor; - eval { $monitor = network::monitor->new($dbus) }; $dbus->{connection}->add_filter(sub { my ($_con, $msg) = @_; if ($msg->get_member eq 'status') { |