summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOlivier Blin <oblin@mandriva.com>2008-11-17 20:25:37 +0000
committerOlivier Blin <oblin@mandriva.com>2008-11-17 20:25:37 +0000
commitb4da1e191c45c83b1ba22a9b9266acb531faacf1 (patch)
tree954967e60e27789857b21b7cc248423ff175f807
parent520776ebb3dc137ea3a011a6996144520905f73f (diff)
downloaddrakx-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-xbin/draknetcenter2
-rwxr-xr-xbin/drakroam2
-rwxr-xr-xbin/net_applet9
-rw-r--r--lib/network/connection/wireless.pm45
-rw-r--r--lib/network/monitor.pm1
-rwxr-xr-xlib/network/netcenter.pm2
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') {