2005-04-06 Dan Williams <dcbw@redhat.com>
Add debug code for socket/file descriptor leaks. We register every socket that we open (except for stuff in dhcpcd/) for tracking, and print out the list of sockets that we forgot to close on shutdown. This also consolidates about 4 places where we opened sockets into 1 function in NetworkManagerUtils.c git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@559 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
This commit is contained in:
@@ -1,3 +1,10 @@
|
|||||||
|
2005-04-06 Dan Williams <dcbw@redhat.com>
|
||||||
|
|
||||||
|
Add debug code for socket/file descriptor leaks. We register every socket
|
||||||
|
that we open (except for stuff in dhcpcd/) for tracking, and print out the
|
||||||
|
list of sockets that we forgot to close on shutdown. This also consolidates
|
||||||
|
about 4 places where we opened sockets into 1 function in NetworkManagerUtils.c
|
||||||
|
|
||||||
2005-04-06 Dan Williams <dcbw@redhat.com>
|
2005-04-06 Dan Williams <dcbw@redhat.com>
|
||||||
|
|
||||||
* dhcpcd/dhcpcd.c
|
* dhcpcd/dhcpcd.c
|
||||||
|
@@ -925,6 +925,8 @@ int main( int argc, char *argv[] )
|
|||||||
/* Wheeee!!! */
|
/* Wheeee!!! */
|
||||||
g_main_loop_run (nm_data->main_loop);
|
g_main_loop_run (nm_data->main_loop);
|
||||||
|
|
||||||
|
nm_print_open_socks ();
|
||||||
|
|
||||||
/* Cleanup */
|
/* Cleanup */
|
||||||
libhal_ctx_shutdown (nm_data->hal_ctx, &dbus_error);
|
libhal_ctx_shutdown (nm_data->hal_ctx, &dbus_error);
|
||||||
|
|
||||||
|
@@ -76,10 +76,10 @@ typedef struct
|
|||||||
*/
|
*/
|
||||||
static gboolean nm_device_test_wireless_extensions (NMDevice *dev)
|
static gboolean nm_device_test_wireless_extensions (NMDevice *dev)
|
||||||
{
|
{
|
||||||
int sk;
|
int err = -1;
|
||||||
int err;
|
char ioctl_buf[64];
|
||||||
char ioctl_buf[64];
|
NMSock *sk;
|
||||||
|
|
||||||
g_return_val_if_fail (dev != NULL, FALSE);
|
g_return_val_if_fail (dev != NULL, FALSE);
|
||||||
|
|
||||||
/* We obviously cannot probe test devices (since they don't
|
/* We obviously cannot probe test devices (since they don't
|
||||||
@@ -89,11 +89,13 @@ static gboolean nm_device_test_wireless_extensions (NMDevice *dev)
|
|||||||
return (FALSE);
|
return (FALSE);
|
||||||
|
|
||||||
ioctl_buf[63] = 0;
|
ioctl_buf[63] = 0;
|
||||||
strncpy(ioctl_buf, nm_device_get_iface(dev), 63);
|
strncpy (ioctl_buf, nm_device_get_iface(dev), 63);
|
||||||
|
|
||||||
sk = iw_sockets_open ();
|
if ((sk = nm_dev_sock_open (dev, DEV_WIRELESS, __FUNCTION__, NULL)))
|
||||||
err = ioctl(sk, SIOCGIWNAME, ioctl_buf);
|
{
|
||||||
close (sk);
|
err = ioctl (nm_dev_sock_get_fd (sk), SIOCGIWNAME, ioctl_buf);
|
||||||
|
nm_dev_sock_close (sk);
|
||||||
|
}
|
||||||
return (err == 0);
|
return (err == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -106,10 +108,10 @@ static gboolean nm_device_test_wireless_extensions (NMDevice *dev)
|
|||||||
*/
|
*/
|
||||||
static gboolean nm_device_supports_wireless_scan (NMDevice *dev)
|
static gboolean nm_device_supports_wireless_scan (NMDevice *dev)
|
||||||
{
|
{
|
||||||
int sk;
|
NMSock *sk;
|
||||||
int err;
|
int err;
|
||||||
gboolean can_scan = TRUE;
|
gboolean can_scan = TRUE;
|
||||||
wireless_scan_head scan_data;
|
wireless_scan_head scan_data;
|
||||||
|
|
||||||
g_return_val_if_fail (dev != NULL, FALSE);
|
g_return_val_if_fail (dev != NULL, FALSE);
|
||||||
g_return_val_if_fail (dev->type == DEVICE_TYPE_WIRELESS_ETHERNET, FALSE);
|
g_return_val_if_fail (dev->type == DEVICE_TYPE_WIRELESS_ETHERNET, FALSE);
|
||||||
@@ -117,13 +119,15 @@ static gboolean nm_device_supports_wireless_scan (NMDevice *dev)
|
|||||||
/* A test wireless device can always scan (we generate fake scan data for it) */
|
/* A test wireless device can always scan (we generate fake scan data for it) */
|
||||||
if (dev->test_device)
|
if (dev->test_device)
|
||||||
return (TRUE);
|
return (TRUE);
|
||||||
|
|
||||||
sk = iw_sockets_open ();
|
if ((sk = nm_dev_sock_open (dev, DEV_WIRELESS, __FUNCTION__, NULL)))
|
||||||
err = iw_scan (sk, (char *)nm_device_get_iface (dev), WIRELESS_EXT, &scan_data);
|
{
|
||||||
nm_dispose_scan_results (scan_data.result);
|
err = iw_scan (nm_dev_sock_get_fd (sk), (char *)nm_device_get_iface (dev), WIRELESS_EXT, &scan_data);
|
||||||
if ((err == -1) && (errno == EOPNOTSUPP))
|
nm_dispose_scan_results (scan_data.result);
|
||||||
can_scan = FALSE;
|
if ((err == -1) && (errno == EOPNOTSUPP))
|
||||||
close (sk);
|
can_scan = FALSE;
|
||||||
|
nm_dev_sock_close (sk);
|
||||||
|
}
|
||||||
return (can_scan);
|
return (can_scan);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -308,7 +312,7 @@ NMDevice *nm_device_new (const char *iface, const char *udi, gboolean test_dev,
|
|||||||
/* Initialize wireless-specific options */
|
/* Initialize wireless-specific options */
|
||||||
if (nm_device_is_wireless (dev))
|
if (nm_device_is_wireless (dev))
|
||||||
{
|
{
|
||||||
int sk;
|
NMSock *sk;
|
||||||
NMDeviceWirelessOptions *opts = &(dev->options.wireless);
|
NMDeviceWirelessOptions *opts = &(dev->options.wireless);
|
||||||
|
|
||||||
nm_device_set_mode (dev, NETWORK_MODE_INFRA);
|
nm_device_set_mode (dev, NETWORK_MODE_INFRA);
|
||||||
@@ -332,10 +336,10 @@ NMDevice *nm_device_new (const char *iface, const char *udi, gboolean test_dev,
|
|||||||
if (opts->supports_wireless_scan == FALSE)
|
if (opts->supports_wireless_scan == FALSE)
|
||||||
nm_device_copy_allowed_to_dev_list (dev, app_data->allowed_ap_list);
|
nm_device_copy_allowed_to_dev_list (dev, app_data->allowed_ap_list);
|
||||||
|
|
||||||
if ((sk = iw_sockets_open ()) >= 0)
|
if ((sk = nm_dev_sock_open (dev, DEV_WIRELESS, __FUNCTION__, NULL)))
|
||||||
{
|
{
|
||||||
iwrange range;
|
iwrange range;
|
||||||
if (iw_get_range_info (sk, nm_device_get_iface (dev), &range) >= 0)
|
if (iw_get_range_info (nm_dev_sock_get_fd (sk), nm_device_get_iface (dev), &range) >= 0)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@@ -353,7 +357,7 @@ NMDevice *nm_device_new (const char *iface, const char *udi, gboolean test_dev,
|
|||||||
for (i = 0; i < opts->num_freqs; i++)
|
for (i = 0; i < opts->num_freqs; i++)
|
||||||
opts->freqs[i] = iw_freq2float (&(range.freq[i]));
|
opts->freqs[i] = iw_freq2float (&(range.freq[i]));
|
||||||
}
|
}
|
||||||
close (sk);
|
nm_dev_sock_close (sk);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (nm_device_is_wired (dev))
|
else if (nm_device_is_wired (dev))
|
||||||
@@ -557,32 +561,6 @@ void nm_device_set_removed (NMDevice *dev, const gboolean removed)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* nm_device_open_sock
|
|
||||||
*
|
|
||||||
* Get a control socket for network operations.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
int nm_device_open_sock (void)
|
|
||||||
{
|
|
||||||
int fd;
|
|
||||||
|
|
||||||
/* Try to grab a control socket */
|
|
||||||
fd = socket(PF_INET, SOCK_DGRAM, 0);
|
|
||||||
if (fd >= 0)
|
|
||||||
return (fd);
|
|
||||||
fd = socket(PF_PACKET, SOCK_DGRAM, 0);
|
|
||||||
if (fd >= 0)
|
|
||||||
return (fd);
|
|
||||||
fd = socket(PF_INET6, SOCK_DGRAM, 0);
|
|
||||||
if (fd >= 0)
|
|
||||||
return (fd);
|
|
||||||
|
|
||||||
nm_warning ("could not get network control socket.");
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return the amount of time we should wait for the device
|
* Return the amount of time we should wait for the device
|
||||||
* to get a link, based on the # of frequencies it has to
|
* to get a link, based on the # of frequencies it has to
|
||||||
@@ -757,9 +735,9 @@ gboolean nm_device_get_supports_carrier_detect (NMDevice *dev)
|
|||||||
*/
|
*/
|
||||||
static gboolean nm_device_wireless_is_associated (NMDevice *dev)
|
static gboolean nm_device_wireless_is_associated (NMDevice *dev)
|
||||||
{
|
{
|
||||||
struct iwreq wrq;
|
struct iwreq wrq;
|
||||||
int sk;
|
NMSock *sk;
|
||||||
gboolean associated = FALSE;
|
gboolean associated = FALSE;
|
||||||
|
|
||||||
g_return_val_if_fail (dev != NULL, FALSE);
|
g_return_val_if_fail (dev != NULL, FALSE);
|
||||||
g_return_val_if_fail (dev->app_data != NULL, FALSE);
|
g_return_val_if_fail (dev->app_data != NULL, FALSE);
|
||||||
@@ -768,13 +746,13 @@ static gboolean nm_device_wireless_is_associated (NMDevice *dev)
|
|||||||
if (dev->test_device)
|
if (dev->test_device)
|
||||||
return (nm_device_has_active_link (dev));
|
return (nm_device_has_active_link (dev));
|
||||||
|
|
||||||
if ((sk = iw_sockets_open ()) < 0)
|
if ((sk = nm_dev_sock_open (dev, DEV_WIRELESS, __FUNCTION__, NULL)) == NULL)
|
||||||
return (FALSE);
|
return (FALSE);
|
||||||
|
|
||||||
/* Some cards, for example ipw2x00 cards, can short-circuit the MAC
|
/* Some cards, for example ipw2x00 cards, can short-circuit the MAC
|
||||||
* address check using this check on IWNAME. Its faster.
|
* address check using this check on IWNAME. Its faster.
|
||||||
*/
|
*/
|
||||||
if (iw_get_ext (sk, nm_device_get_iface (dev), SIOCGIWNAME, &wrq) >= 0)
|
if (iw_get_ext (nm_dev_sock_get_fd (sk), nm_device_get_iface (dev), SIOCGIWNAME, &wrq) >= 0)
|
||||||
{
|
{
|
||||||
if (!strcmp(wrq.u.name, "unassociated"))
|
if (!strcmp(wrq.u.name, "unassociated"))
|
||||||
{
|
{
|
||||||
@@ -791,13 +769,13 @@ static gboolean nm_device_wireless_is_associated (NMDevice *dev)
|
|||||||
* Is there a better way? Some cards don't work too well with this check, ie
|
* Is there a better way? Some cards don't work too well with this check, ie
|
||||||
* Lucent WaveLAN.
|
* Lucent WaveLAN.
|
||||||
*/
|
*/
|
||||||
if (iw_get_ext (sk, nm_device_get_iface (dev), SIOCGIWAP, &wrq) >= 0)
|
if (iw_get_ext (nm_dev_sock_get_fd (sk), nm_device_get_iface (dev), SIOCGIWAP, &wrq) >= 0)
|
||||||
if (nm_ethernet_address_is_valid ((struct ether_addr *)(&(wrq.u.ap_addr.sa_data))))
|
if (nm_ethernet_address_is_valid ((struct ether_addr *)(&(wrq.u.ap_addr.sa_data))))
|
||||||
associated = TRUE;
|
associated = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
close (sk);
|
nm_dev_sock_close (sk);
|
||||||
|
|
||||||
return (associated);
|
return (associated);
|
||||||
}
|
}
|
||||||
@@ -917,8 +895,8 @@ void nm_device_update_link_state (NMDevice *dev)
|
|||||||
*/
|
*/
|
||||||
char * nm_device_get_essid (NMDevice *dev)
|
char * nm_device_get_essid (NMDevice *dev)
|
||||||
{
|
{
|
||||||
int sk;
|
NMSock *sk;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
g_return_val_if_fail (dev != NULL, NULL);
|
g_return_val_if_fail (dev != NULL, NULL);
|
||||||
g_return_val_if_fail (nm_device_is_wireless (dev), NULL);
|
g_return_val_if_fail (nm_device_is_wireless (dev), NULL);
|
||||||
@@ -940,12 +918,11 @@ char * nm_device_get_essid (NMDevice *dev)
|
|||||||
return (essid);
|
return (essid);
|
||||||
}
|
}
|
||||||
|
|
||||||
sk = iw_sockets_open ();
|
if ((sk = nm_dev_sock_open (dev, DEV_WIRELESS, __FUNCTION__, NULL)))
|
||||||
if (sk >= 0)
|
|
||||||
{
|
{
|
||||||
wireless_config info;
|
wireless_config info;
|
||||||
|
|
||||||
err = iw_get_basic_config(sk, nm_device_get_iface (dev), &info);
|
err = iw_get_basic_config (nm_dev_sock_get_fd (sk), nm_device_get_iface (dev), &info);
|
||||||
if (err >= 0)
|
if (err >= 0)
|
||||||
{
|
{
|
||||||
if (dev->options.wireless.cur_essid)
|
if (dev->options.wireless.cur_essid)
|
||||||
@@ -955,7 +932,7 @@ char * nm_device_get_essid (NMDevice *dev)
|
|||||||
else
|
else
|
||||||
nm_warning ("nm_device_get_essid(): error getting ESSID for device %s. errno = %d", nm_device_get_iface (dev), errno);
|
nm_warning ("nm_device_get_essid(): error getting ESSID for device %s. errno = %d", nm_device_get_iface (dev), errno);
|
||||||
|
|
||||||
close (sk);
|
nm_dev_sock_close (sk);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (dev->options.wireless.cur_essid);
|
return (dev->options.wireless.cur_essid);
|
||||||
@@ -969,10 +946,10 @@ char * nm_device_get_essid (NMDevice *dev)
|
|||||||
*/
|
*/
|
||||||
void nm_device_set_essid (NMDevice *dev, const char *essid)
|
void nm_device_set_essid (NMDevice *dev, const char *essid)
|
||||||
{
|
{
|
||||||
int sk;
|
NMSock *sk;
|
||||||
int err;
|
int err;
|
||||||
struct iwreq wreq;
|
struct iwreq wreq;
|
||||||
unsigned char safe_essid[IW_ESSID_MAX_SIZE + 1] = "\0";
|
unsigned char safe_essid[IW_ESSID_MAX_SIZE + 1] = "\0";
|
||||||
|
|
||||||
g_return_if_fail (dev != NULL);
|
g_return_if_fail (dev != NULL);
|
||||||
g_return_if_fail (nm_device_is_wireless (dev));
|
g_return_if_fail (nm_device_is_wireless (dev));
|
||||||
@@ -995,18 +972,17 @@ void nm_device_set_essid (NMDevice *dev, const char *essid)
|
|||||||
safe_essid[IW_ESSID_MAX_SIZE] = '\0';
|
safe_essid[IW_ESSID_MAX_SIZE] = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
sk = iw_sockets_open ();
|
if ((sk = nm_dev_sock_open (dev, DEV_WIRELESS, __FUNCTION__, NULL)))
|
||||||
if (sk >= 0)
|
|
||||||
{
|
{
|
||||||
wreq.u.essid.pointer = (caddr_t) safe_essid;
|
wreq.u.essid.pointer = (caddr_t) safe_essid;
|
||||||
wreq.u.essid.length = strlen (safe_essid) + 1;
|
wreq.u.essid.length = strlen (safe_essid) + 1;
|
||||||
wreq.u.essid.flags = 1; /* Enable essid on card */
|
wreq.u.essid.flags = 1; /* Enable essid on card */
|
||||||
|
|
||||||
err = iw_set_ext (sk, nm_device_get_iface (dev), SIOCSIWESSID, &wreq);
|
err = iw_set_ext (nm_dev_sock_get_fd (sk), nm_device_get_iface (dev), SIOCSIWESSID, &wreq);
|
||||||
if (err == -1)
|
if (err == -1)
|
||||||
nm_warning ("nm_device_set_essid(): error setting ESSID '%s' for device %s. errno = %d", safe_essid, nm_device_get_iface (dev), errno);
|
nm_warning ("nm_device_set_essid(): error setting ESSID '%s' for device %s. errno = %d", safe_essid, nm_device_get_iface (dev), errno);
|
||||||
|
|
||||||
close (sk);
|
nm_dev_sock_close (sk);
|
||||||
|
|
||||||
/* Orinoco cards seem to need extra time here to not screw
|
/* Orinoco cards seem to need extra time here to not screw
|
||||||
* up the firmware, which reboots when you set the ESSID.
|
* up the firmware, which reboots when you set the ESSID.
|
||||||
@@ -1026,9 +1002,9 @@ void nm_device_set_essid (NMDevice *dev, const char *essid)
|
|||||||
*/
|
*/
|
||||||
double nm_device_get_frequency (NMDevice *dev)
|
double nm_device_get_frequency (NMDevice *dev)
|
||||||
{
|
{
|
||||||
int sk;
|
NMSock *sk;
|
||||||
int err;
|
int err;
|
||||||
double freq = 0;
|
double freq = 0;
|
||||||
|
|
||||||
g_return_val_if_fail (dev != NULL, 0);
|
g_return_val_if_fail (dev != NULL, 0);
|
||||||
g_return_val_if_fail (nm_device_is_wireless (dev), 0);
|
g_return_val_if_fail (nm_device_is_wireless (dev), 0);
|
||||||
@@ -1037,18 +1013,17 @@ double nm_device_get_frequency (NMDevice *dev)
|
|||||||
if (dev->test_device)
|
if (dev->test_device)
|
||||||
return 703000000;
|
return 703000000;
|
||||||
|
|
||||||
sk = iw_sockets_open ();
|
if ((sk = nm_dev_sock_open (dev, DEV_WIRELESS, __FUNCTION__, NULL)))
|
||||||
if (sk >= 0)
|
|
||||||
{
|
{
|
||||||
struct iwreq wrq;
|
struct iwreq wrq;
|
||||||
|
|
||||||
err = iw_get_ext (sk, nm_device_get_iface (dev), SIOCGIWFREQ, &wrq);
|
err = iw_get_ext (nm_dev_sock_get_fd (sk), nm_device_get_iface (dev), SIOCGIWFREQ, &wrq);
|
||||||
if (err >= 0)
|
if (err >= 0)
|
||||||
freq = iw_freq2float (&wrq.u.freq);
|
freq = iw_freq2float (&wrq.u.freq);
|
||||||
if (err == -1)
|
if (err == -1)
|
||||||
nm_warning ("nm_device_get_frequency(): error getting frequency for device %s. errno = %d", nm_device_get_iface (dev), errno);
|
nm_warning ("nm_device_get_frequency(): error getting frequency for device %s. errno = %d", nm_device_get_iface (dev), errno);
|
||||||
|
|
||||||
close (sk);
|
nm_dev_sock_close (sk);
|
||||||
}
|
}
|
||||||
return (freq);
|
return (freq);
|
||||||
}
|
}
|
||||||
@@ -1063,8 +1038,8 @@ double nm_device_get_frequency (NMDevice *dev)
|
|||||||
*/
|
*/
|
||||||
void nm_device_set_frequency (NMDevice *dev, const double freq)
|
void nm_device_set_frequency (NMDevice *dev, const double freq)
|
||||||
{
|
{
|
||||||
int sk;
|
NMSock *sk;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
/* HACK FOR NOW */
|
/* HACK FOR NOW */
|
||||||
if (freq <= 0)
|
if (freq <= 0)
|
||||||
@@ -1080,8 +1055,7 @@ void nm_device_set_frequency (NMDevice *dev, const double freq)
|
|||||||
if (nm_device_get_frequency (dev) == freq)
|
if (nm_device_get_frequency (dev) == freq)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
sk = iw_sockets_open ();
|
if ((sk = nm_dev_sock_open (dev, DEV_WIRELESS, __FUNCTION__, NULL)))
|
||||||
if (sk >= 0)
|
|
||||||
{
|
{
|
||||||
struct iwreq wrq;
|
struct iwreq wrq;
|
||||||
|
|
||||||
@@ -1111,7 +1085,7 @@ void nm_device_set_frequency (NMDevice *dev, const double freq)
|
|||||||
wrq.u.freq.flags = IW_FREQ_FIXED;
|
wrq.u.freq.flags = IW_FREQ_FIXED;
|
||||||
iw_float2freq (freq, &wrq.u.freq);
|
iw_float2freq (freq, &wrq.u.freq);
|
||||||
}
|
}
|
||||||
err = iw_set_ext (sk, nm_device_get_iface (dev), SIOCSIWFREQ, &wrq);
|
err = iw_set_ext (nm_dev_sock_get_fd (sk), nm_device_get_iface (dev), SIOCSIWFREQ, &wrq);
|
||||||
if (err == -1)
|
if (err == -1)
|
||||||
{
|
{
|
||||||
gboolean success = FALSE;
|
gboolean success = FALSE;
|
||||||
@@ -1121,12 +1095,12 @@ void nm_device_set_frequency (NMDevice *dev, const double freq)
|
|||||||
wrq.u.freq.m = -1;
|
wrq.u.freq.m = -1;
|
||||||
wrq.u.freq.e = 0;
|
wrq.u.freq.e = 0;
|
||||||
wrq.u.freq.flags = 0;
|
wrq.u.freq.flags = 0;
|
||||||
if (iw_set_ext (sk, nm_device_get_iface (dev), SIOCSIWFREQ, &wrq) != -1)
|
if (iw_set_ext (nm_dev_sock_get_fd (sk), nm_device_get_iface (dev), SIOCSIWFREQ, &wrq) != -1)
|
||||||
success = TRUE;
|
success = TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
close (sk);
|
nm_dev_sock_close (sk);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1140,9 +1114,9 @@ void nm_device_set_frequency (NMDevice *dev, const double freq)
|
|||||||
*/
|
*/
|
||||||
int nm_device_get_bitrate (NMDevice *dev)
|
int nm_device_get_bitrate (NMDevice *dev)
|
||||||
{
|
{
|
||||||
int sk;
|
NMSock *sk;
|
||||||
int err = -1;
|
int err = -1;
|
||||||
struct iwreq wrq;
|
struct iwreq wrq;
|
||||||
|
|
||||||
g_return_val_if_fail (dev != NULL, 0);
|
g_return_val_if_fail (dev != NULL, 0);
|
||||||
g_return_val_if_fail (nm_device_is_wireless (dev), 0);
|
g_return_val_if_fail (nm_device_is_wireless (dev), 0);
|
||||||
@@ -1151,11 +1125,10 @@ int nm_device_get_bitrate (NMDevice *dev)
|
|||||||
if (dev->test_device)
|
if (dev->test_device)
|
||||||
return 11;
|
return 11;
|
||||||
|
|
||||||
sk = iw_sockets_open ();
|
if ((sk = nm_dev_sock_open (dev, DEV_WIRELESS, __FUNCTION__, NULL)))
|
||||||
if (sk >= 0)
|
|
||||||
{
|
{
|
||||||
err = iw_get_ext (sk, nm_device_get_iface (dev), SIOCGIWRATE, &wrq);
|
err = iw_get_ext (nm_dev_sock_get_fd (sk), nm_device_get_iface (dev), SIOCGIWRATE, &wrq);
|
||||||
close (sk);
|
nm_dev_sock_close (sk);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ((err >= 0) ? wrq.u.bitrate.value / 1000 : 0);
|
return ((err >= 0) ? wrq.u.bitrate.value / 1000 : 0);
|
||||||
@@ -1171,7 +1144,7 @@ int nm_device_get_bitrate (NMDevice *dev)
|
|||||||
*/
|
*/
|
||||||
void nm_device_set_bitrate (NMDevice *dev, const int Mbps)
|
void nm_device_set_bitrate (NMDevice *dev, const int Mbps)
|
||||||
{
|
{
|
||||||
int sk;
|
NMSock *sk;
|
||||||
|
|
||||||
g_return_if_fail (dev != NULL);
|
g_return_if_fail (dev != NULL);
|
||||||
g_return_if_fail (nm_device_is_wireless (dev));
|
g_return_if_fail (nm_device_is_wireless (dev));
|
||||||
@@ -1183,8 +1156,7 @@ void nm_device_set_bitrate (NMDevice *dev, const int Mbps)
|
|||||||
if (nm_device_get_bitrate (dev) == Mbps)
|
if (nm_device_get_bitrate (dev) == Mbps)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
sk = iw_sockets_open ();
|
if ((sk = nm_dev_sock_open (dev, DEV_WIRELESS, __FUNCTION__, NULL)))
|
||||||
if (sk >= 0)
|
|
||||||
{
|
{
|
||||||
struct iwreq wrq;
|
struct iwreq wrq;
|
||||||
|
|
||||||
@@ -1200,9 +1172,9 @@ void nm_device_set_bitrate (NMDevice *dev, const int Mbps)
|
|||||||
wrq.u.bitrate.fixed = 0;
|
wrq.u.bitrate.fixed = 0;
|
||||||
}
|
}
|
||||||
/* Silently fail as not all drivers support setting bitrate yet (ipw2x00 for example) */
|
/* Silently fail as not all drivers support setting bitrate yet (ipw2x00 for example) */
|
||||||
iw_set_ext (sk, nm_device_get_iface (dev), SIOCSIWRATE, &wrq);
|
iw_set_ext (nm_dev_sock_get_fd (sk), nm_device_get_iface (dev), SIOCSIWRATE, &wrq);
|
||||||
|
|
||||||
close (sk);
|
nm_dev_sock_close (sk);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1215,8 +1187,8 @@ void nm_device_set_bitrate (NMDevice *dev, const int Mbps)
|
|||||||
*/
|
*/
|
||||||
void nm_device_get_ap_address (NMDevice *dev, struct ether_addr *addr)
|
void nm_device_get_ap_address (NMDevice *dev, struct ether_addr *addr)
|
||||||
{
|
{
|
||||||
int iwlib_socket;
|
NMSock *sk;
|
||||||
struct iwreq wrq;
|
struct iwreq wrq;
|
||||||
|
|
||||||
g_return_if_fail (dev != NULL);
|
g_return_if_fail (dev != NULL);
|
||||||
g_return_if_fail (addr != NULL);
|
g_return_if_fail (addr != NULL);
|
||||||
@@ -1235,12 +1207,14 @@ void nm_device_get_ap_address (NMDevice *dev, struct ether_addr *addr)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
iwlib_socket = iw_sockets_open ();
|
if ((sk = nm_dev_sock_open (dev, DEV_WIRELESS, __FUNCTION__, NULL)))
|
||||||
if (iw_get_ext (iwlib_socket, nm_device_get_iface (dev), SIOCGIWAP, &wrq) >= 0)
|
{
|
||||||
memcpy (addr, &(wrq.u.ap_addr.sa_data), sizeof (struct ether_addr));
|
if (iw_get_ext (nm_dev_sock_get_fd (sk), nm_device_get_iface (dev), SIOCGIWAP, &wrq) >= 0)
|
||||||
else
|
memcpy (addr, &(wrq.u.ap_addr.sa_data), sizeof (struct ether_addr));
|
||||||
memset (addr, 0, sizeof (struct ether_addr));
|
else
|
||||||
close (iwlib_socket);
|
memset (addr, 0, sizeof (struct ether_addr));
|
||||||
|
nm_dev_sock_close (sk);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1255,7 +1229,7 @@ void nm_device_get_ap_address (NMDevice *dev, struct ether_addr *addr)
|
|||||||
*/
|
*/
|
||||||
void nm_device_set_enc_key (NMDevice *dev, const char *key, NMDeviceAuthMethod auth_method)
|
void nm_device_set_enc_key (NMDevice *dev, const char *key, NMDeviceAuthMethod auth_method)
|
||||||
{
|
{
|
||||||
int sk;
|
NMSock *sk;
|
||||||
int err;
|
int err;
|
||||||
struct iwreq wreq;
|
struct iwreq wreq;
|
||||||
int keylen;
|
int keylen;
|
||||||
@@ -1278,8 +1252,7 @@ void nm_device_set_enc_key (NMDevice *dev, const char *key, NMDeviceAuthMethod a
|
|||||||
safe_key[IW_ENCODING_TOKEN_MAX] = '\0';
|
safe_key[IW_ENCODING_TOKEN_MAX] = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
sk = iw_sockets_open ();
|
if ((sk = nm_dev_sock_open (dev, DEV_WIRELESS, __FUNCTION__, NULL)))
|
||||||
if (sk >= 0)
|
|
||||||
{
|
{
|
||||||
wreq.u.data.pointer = (caddr_t) NULL;
|
wreq.u.data.pointer = (caddr_t) NULL;
|
||||||
wreq.u.data.length = 0;
|
wreq.u.data.length = 0;
|
||||||
@@ -1300,7 +1273,7 @@ void nm_device_set_enc_key (NMDevice *dev, const char *key, NMDeviceAuthMethod a
|
|||||||
{
|
{
|
||||||
unsigned char parsed_key[IW_ENCODING_TOKEN_MAX + 1];
|
unsigned char parsed_key[IW_ENCODING_TOKEN_MAX + 1];
|
||||||
|
|
||||||
keylen = iw_in_key_full (sk, nm_device_get_iface (dev), safe_key, &parsed_key[0], &wreq.u.data.flags);
|
keylen = iw_in_key_full (nm_dev_sock_get_fd (sk), nm_device_get_iface (dev), safe_key, &parsed_key[0], &wreq.u.data.flags);
|
||||||
if (keylen > 0)
|
if (keylen > 0)
|
||||||
{
|
{
|
||||||
switch (auth_method)
|
switch (auth_method)
|
||||||
@@ -1323,12 +1296,11 @@ void nm_device_set_enc_key (NMDevice *dev, const char *key, NMDeviceAuthMethod a
|
|||||||
|
|
||||||
if (set_key)
|
if (set_key)
|
||||||
{
|
{
|
||||||
err = iw_set_ext (sk, nm_device_get_iface (dev), SIOCSIWENCODE, &wreq);
|
if (iw_set_ext (nm_dev_sock_get_fd (sk), nm_device_get_iface (dev), SIOCSIWENCODE, &wreq) == -1)
|
||||||
if (err == -1)
|
|
||||||
nm_warning ("nm_device_set_enc_key(): error setting key for device %s. errno = %d", nm_device_get_iface (dev), errno);
|
nm_warning ("nm_device_set_enc_key(): error setting key for device %s. errno = %d", nm_device_get_iface (dev), errno);
|
||||||
}
|
}
|
||||||
|
|
||||||
close (sk);
|
nm_dev_sock_close (sk);
|
||||||
} else nm_warning ("nm_device_set_enc_key(): could not get wireless control socket.");
|
} else nm_warning ("nm_device_set_enc_key(): could not get wireless control socket.");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1362,8 +1334,8 @@ gint8 nm_device_get_signal_strength (NMDevice *dev)
|
|||||||
*/
|
*/
|
||||||
void nm_device_update_signal_strength (NMDevice *dev)
|
void nm_device_update_signal_strength (NMDevice *dev)
|
||||||
{
|
{
|
||||||
gboolean has_range;
|
gboolean has_range = FALSE;
|
||||||
int sk;
|
NMSock *sk;
|
||||||
iwrange range;
|
iwrange range;
|
||||||
iwstats stats;
|
iwstats stats;
|
||||||
int percent = -1;
|
int percent = -1;
|
||||||
@@ -1392,14 +1364,16 @@ void nm_device_update_signal_strength (NMDevice *dev)
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
sk = iw_sockets_open ();
|
if ((sk = nm_dev_sock_open (dev, DEV_WIRELESS, __FUNCTION__, NULL)))
|
||||||
has_range = (iw_get_range_info (sk, nm_device_get_iface (dev), &range) >= 0);
|
|
||||||
if (iw_get_stats (sk, nm_device_get_iface (dev), &stats, &range, has_range) == 0)
|
|
||||||
{
|
{
|
||||||
percent = nm_wireless_qual_to_percent (&stats.qual, (const iwqual *)(&dev->options.wireless.max_qual),
|
has_range = (iw_get_range_info (nm_dev_sock_get_fd (sk), nm_device_get_iface (dev), &range) >= 0);
|
||||||
(const iwqual *)(&dev->options.wireless.avg_qual));
|
if (iw_get_stats (nm_dev_sock_get_fd (sk), nm_device_get_iface (dev), &stats, &range, has_range) == 0)
|
||||||
|
{
|
||||||
|
percent = nm_wireless_qual_to_percent (&stats.qual, (const iwqual *)(&dev->options.wireless.max_qual),
|
||||||
|
(const iwqual *)(&dev->options.wireless.avg_qual));
|
||||||
|
}
|
||||||
|
nm_dev_sock_close (sk);
|
||||||
}
|
}
|
||||||
close (sk);
|
|
||||||
|
|
||||||
/* Try to smooth out the strength. Atmel cards, for example, will give no strength
|
/* Try to smooth out the strength. Atmel cards, for example, will give no strength
|
||||||
* one second and normal strength the next.
|
* one second and normal strength the next.
|
||||||
@@ -1433,7 +1407,7 @@ void nm_device_update_ip4_address (NMDevice *dev)
|
|||||||
{
|
{
|
||||||
guint32 new_address;
|
guint32 new_address;
|
||||||
struct ifreq req;
|
struct ifreq req;
|
||||||
int sk;
|
NMSock *sk;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
g_return_if_fail (dev != NULL);
|
g_return_if_fail (dev != NULL);
|
||||||
@@ -1447,13 +1421,13 @@ void nm_device_update_ip4_address (NMDevice *dev)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((sk = nm_device_open_sock ()) < 0)
|
if ((sk = nm_dev_sock_open (dev, DEV_GENERAL, __FUNCTION__, NULL)) == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
memset (&req, 0, sizeof (struct ifreq));
|
memset (&req, 0, sizeof (struct ifreq));
|
||||||
strncpy ((char *)(&req.ifr_name), nm_device_get_iface (dev), strlen (nm_device_get_iface (dev)));
|
strncpy ((char *)(&req.ifr_name), nm_device_get_iface (dev), strlen (nm_device_get_iface (dev)));
|
||||||
err = ioctl (sk, SIOCGIFADDR, &req);
|
err = ioctl (nm_dev_sock_get_fd (sk), SIOCGIFADDR, &req);
|
||||||
close (sk);
|
nm_dev_sock_close (sk);
|
||||||
if (err != 0)
|
if (err != 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -1499,7 +1473,7 @@ void nm_device_get_hw_address(NMDevice *dev, unsigned char *eth_addr)
|
|||||||
void nm_device_update_hw_address (NMDevice *dev)
|
void nm_device_update_hw_address (NMDevice *dev)
|
||||||
{
|
{
|
||||||
struct ifreq req;
|
struct ifreq req;
|
||||||
int sk;
|
NMSock *sk;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
g_return_if_fail (dev != NULL);
|
g_return_if_fail (dev != NULL);
|
||||||
@@ -1513,13 +1487,13 @@ void nm_device_update_hw_address (NMDevice *dev)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((sk = nm_device_open_sock ()) < 0)
|
if ((sk = nm_dev_sock_open (dev, DEV_GENERAL, __FUNCTION__, NULL)) == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
memset (&req, 0, sizeof (struct ifreq));
|
memset (&req, 0, sizeof (struct ifreq));
|
||||||
strncpy ((char *)(&req.ifr_name), nm_device_get_iface (dev), strlen (nm_device_get_iface (dev)));
|
strncpy ((char *)(&req.ifr_name), nm_device_get_iface (dev), strlen (nm_device_get_iface (dev)));
|
||||||
err = ioctl (sk, SIOCGIFHWADDR, &req);
|
err = ioctl (nm_dev_sock_get_fd (sk), SIOCGIFHWADDR, &req);
|
||||||
close (sk);
|
nm_dev_sock_close (sk);
|
||||||
if (err != 0)
|
if (err != 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -1536,7 +1510,7 @@ void nm_device_update_hw_address (NMDevice *dev)
|
|||||||
static void nm_device_set_up_down (NMDevice *dev, gboolean up)
|
static void nm_device_set_up_down (NMDevice *dev, gboolean up)
|
||||||
{
|
{
|
||||||
struct ifreq ifr;
|
struct ifreq ifr;
|
||||||
int sk;
|
NMSock *sk;
|
||||||
int err;
|
int err;
|
||||||
guint32 flags = up ? IFF_UP : ~IFF_UP;
|
guint32 flags = up ? IFF_UP : ~IFF_UP;
|
||||||
|
|
||||||
@@ -1549,13 +1523,12 @@ static void nm_device_set_up_down (NMDevice *dev, gboolean up)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
sk = nm_device_open_sock ();
|
if ((sk = nm_dev_sock_open (dev, DEV_GENERAL, __FUNCTION__, NULL)) == NULL)
|
||||||
if (sk < 0)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* Get flags already there */
|
/* Get flags already there */
|
||||||
strcpy (ifr.ifr_name, nm_device_get_iface (dev));
|
strcpy (ifr.ifr_name, nm_device_get_iface (dev));
|
||||||
err = ioctl (sk, SIOCGIFFLAGS, &ifr);
|
err = ioctl (nm_dev_sock_get_fd (sk), SIOCGIFFLAGS, &ifr);
|
||||||
if (!err)
|
if (!err)
|
||||||
{
|
{
|
||||||
/* If the interface doesn't have those flags already,
|
/* If the interface doesn't have those flags already,
|
||||||
@@ -1565,7 +1538,7 @@ static void nm_device_set_up_down (NMDevice *dev, gboolean up)
|
|||||||
{
|
{
|
||||||
ifr.ifr_flags &= ~IFF_UP;
|
ifr.ifr_flags &= ~IFF_UP;
|
||||||
ifr.ifr_flags |= IFF_UP & flags;
|
ifr.ifr_flags |= IFF_UP & flags;
|
||||||
if ((err = ioctl (sk, SIOCSIFFLAGS, &ifr)))
|
if ((err = ioctl (nm_dev_sock_get_fd (sk), SIOCSIFFLAGS, &ifr)))
|
||||||
nm_warning ("nm_device_set_up_down() could not bring device %s %s. errno = %d", nm_device_get_iface (dev), (up ? "up" : "down"), errno );
|
nm_warning ("nm_device_set_up_down() could not bring device %s %s. errno = %d", nm_device_get_iface (dev), (up ? "up" : "down"), errno );
|
||||||
}
|
}
|
||||||
/* Make sure we have a valid MAC address, some cards reload firmware when they
|
/* Make sure we have a valid MAC address, some cards reload firmware when they
|
||||||
@@ -1577,7 +1550,7 @@ static void nm_device_set_up_down (NMDevice *dev, gboolean up)
|
|||||||
else
|
else
|
||||||
nm_warning ("nm_device_set_up_down() could not get flags for device %s. errno = %d", nm_device_get_iface (dev), errno );
|
nm_warning ("nm_device_set_up_down() could not get flags for device %s. errno = %d", nm_device_get_iface (dev), errno );
|
||||||
|
|
||||||
close (sk);
|
nm_dev_sock_close (sk);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1587,7 +1560,7 @@ static void nm_device_set_up_down (NMDevice *dev, gboolean up)
|
|||||||
*/
|
*/
|
||||||
gboolean nm_device_is_up (NMDevice *dev)
|
gboolean nm_device_is_up (NMDevice *dev)
|
||||||
{
|
{
|
||||||
int sk;
|
NMSock *sk;
|
||||||
struct ifreq ifr;
|
struct ifreq ifr;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
@@ -1596,14 +1569,13 @@ gboolean nm_device_is_up (NMDevice *dev)
|
|||||||
if (dev->test_device)
|
if (dev->test_device)
|
||||||
return (dev->test_device_up);
|
return (dev->test_device_up);
|
||||||
|
|
||||||
sk = nm_device_open_sock ();
|
if ((sk = nm_dev_sock_open (dev, DEV_GENERAL, __FUNCTION__, NULL)) == NULL)
|
||||||
if (sk < 0)
|
|
||||||
return (FALSE);
|
return (FALSE);
|
||||||
|
|
||||||
/* Get device's flags */
|
/* Get device's flags */
|
||||||
strcpy (ifr.ifr_name, nm_device_get_iface (dev));
|
strcpy (ifr.ifr_name, nm_device_get_iface (dev));
|
||||||
err = ioctl (sk, SIOCGIFFLAGS, &ifr);
|
err = ioctl (nm_dev_sock_get_fd (sk), SIOCGIFFLAGS, &ifr);
|
||||||
close (sk);
|
nm_dev_sock_close (sk);
|
||||||
if (!err)
|
if (!err)
|
||||||
return (!((ifr.ifr_flags^IFF_UP) & IFF_UP));
|
return (!((ifr.ifr_flags^IFF_UP) & IFF_UP));
|
||||||
|
|
||||||
@@ -1708,21 +1680,19 @@ gboolean nm_device_bring_down_wait (NMDevice *dev, gboolean cancelable)
|
|||||||
*/
|
*/
|
||||||
NMNetworkMode nm_device_get_mode (NMDevice *dev)
|
NMNetworkMode nm_device_get_mode (NMDevice *dev)
|
||||||
{
|
{
|
||||||
int sk;
|
NMSock *sk;
|
||||||
NMNetworkMode mode = NETWORK_MODE_UNKNOWN;
|
NMNetworkMode mode = NETWORK_MODE_UNKNOWN;
|
||||||
|
|
||||||
g_return_val_if_fail (dev != NULL, NETWORK_MODE_UNKNOWN);
|
g_return_val_if_fail (dev != NULL, NETWORK_MODE_UNKNOWN);
|
||||||
g_return_val_if_fail (nm_device_is_wireless (dev), NETWORK_MODE_UNKNOWN);
|
g_return_val_if_fail (nm_device_is_wireless (dev), NETWORK_MODE_UNKNOWN);
|
||||||
|
|
||||||
/* Force the card into Managed/Infrastructure mode */
|
/* Force the card into Managed/Infrastructure mode */
|
||||||
sk = iw_sockets_open ();
|
if ((sk = nm_dev_sock_open (dev, DEV_WIRELESS, __FUNCTION__, NULL)))
|
||||||
if (sk >= 0)
|
|
||||||
{
|
{
|
||||||
struct iwreq wrq;
|
struct iwreq wrq;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
err = iw_get_ext (sk, nm_device_get_iface (dev), SIOCGIWMODE, &wrq);
|
if (iw_get_ext (nm_dev_sock_get_fd (sk), nm_device_get_iface (dev), SIOCGIWMODE, &wrq) == 0)
|
||||||
if (err == 0)
|
|
||||||
{
|
{
|
||||||
switch (wrq.u.mode)
|
switch (wrq.u.mode)
|
||||||
{
|
{
|
||||||
@@ -1738,7 +1708,7 @@ NMNetworkMode nm_device_get_mode (NMDevice *dev)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
nm_warning ("nm_device_get_mode (%s): error getting card mode. errno = %d", nm_device_get_iface (dev), errno);
|
nm_warning ("nm_device_get_mode (%s): error getting card mode. errno = %d", nm_device_get_iface (dev), errno);
|
||||||
close (sk);
|
nm_dev_sock_close (sk);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (mode);
|
return (mode);
|
||||||
@@ -1753,8 +1723,8 @@ NMNetworkMode nm_device_get_mode (NMDevice *dev)
|
|||||||
*/
|
*/
|
||||||
gboolean nm_device_set_mode (NMDevice *dev, const NMNetworkMode mode)
|
gboolean nm_device_set_mode (NMDevice *dev, const NMNetworkMode mode)
|
||||||
{
|
{
|
||||||
int sk;
|
NMSock *sk;
|
||||||
gboolean success = FALSE;
|
gboolean success = FALSE;
|
||||||
|
|
||||||
g_return_val_if_fail (dev != NULL, FALSE);
|
g_return_val_if_fail (dev != NULL, FALSE);
|
||||||
g_return_val_if_fail (nm_device_is_wireless (dev), FALSE);
|
g_return_val_if_fail (nm_device_is_wireless (dev), FALSE);
|
||||||
@@ -1764,8 +1734,7 @@ gboolean nm_device_set_mode (NMDevice *dev, const NMNetworkMode mode)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
/* Force the card into Managed/Infrastructure mode */
|
/* Force the card into Managed/Infrastructure mode */
|
||||||
sk = iw_sockets_open ();
|
if ((sk = nm_dev_sock_open (dev, DEV_WIRELESS, __FUNCTION__, NULL)))
|
||||||
if (sk >= 0)
|
|
||||||
{
|
{
|
||||||
struct iwreq wreq;
|
struct iwreq wreq;
|
||||||
int err;
|
int err;
|
||||||
@@ -1787,8 +1756,7 @@ gboolean nm_device_set_mode (NMDevice *dev, const NMNetworkMode mode)
|
|||||||
}
|
}
|
||||||
if (mode_good)
|
if (mode_good)
|
||||||
{
|
{
|
||||||
err = iw_set_ext (sk, nm_device_get_iface (dev), SIOCSIWMODE, &wreq);
|
if (iw_set_ext (nm_dev_sock_get_fd (sk), nm_device_get_iface (dev), SIOCSIWMODE, &wreq) == 0)
|
||||||
if (err == 0)
|
|
||||||
success = TRUE;
|
success = TRUE;
|
||||||
else
|
else
|
||||||
nm_warning ("nm_device_set_mode (%s): error setting card to %s mode. errno = %d",
|
nm_warning ("nm_device_set_mode (%s): error setting card to %s mode. errno = %d",
|
||||||
@@ -1796,7 +1764,7 @@ gboolean nm_device_set_mode (NMDevice *dev, const NMNetworkMode mode)
|
|||||||
mode == NETWORK_MODE_INFRA ? "Infrastructure" : (mode == NETWORK_MODE_ADHOC ? "adhoc" : "unknown"),
|
mode == NETWORK_MODE_INFRA ? "Infrastructure" : (mode == NETWORK_MODE_ADHOC ? "adhoc" : "unknown"),
|
||||||
errno);
|
errno);
|
||||||
}
|
}
|
||||||
close (sk);
|
nm_dev_sock_close (sk);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (success);
|
return (success);
|
||||||
@@ -2114,7 +2082,8 @@ static gboolean nm_device_activate_wireless_adhoc (NMDevice *dev, NMAccessPoint
|
|||||||
int num_freqs = 0, i;
|
int num_freqs = 0, i;
|
||||||
double freq_to_use = 0;
|
double freq_to_use = 0;
|
||||||
iwrange range;
|
iwrange range;
|
||||||
int sk;
|
NMSock *sk;
|
||||||
|
int err;
|
||||||
|
|
||||||
g_return_val_if_fail (dev != NULL, FALSE);
|
g_return_val_if_fail (dev != NULL, FALSE);
|
||||||
g_return_val_if_fail (ap != NULL, FALSE);
|
g_return_val_if_fail (ap != NULL, FALSE);
|
||||||
@@ -2143,15 +2112,13 @@ static gboolean nm_device_activate_wireless_adhoc (NMDevice *dev, NMAccessPoint
|
|||||||
}
|
}
|
||||||
nm_ap_list_iter_free (iter);
|
nm_ap_list_iter_free (iter);
|
||||||
|
|
||||||
if ((sk = iw_sockets_open ()) < 0)
|
if ((sk = nm_dev_sock_open (dev, DEV_WIRELESS, __FUNCTION__, NULL)) == NULL)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
if (iw_get_range_info (sk, nm_device_get_iface (dev), &range) < 0)
|
err = iw_get_range_info (nm_dev_sock_get_fd (sk), nm_device_get_iface (dev), &range);
|
||||||
{
|
nm_dev_sock_close (sk);
|
||||||
close (sk);
|
if (err < 0)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
|
||||||
close (sk);
|
|
||||||
|
|
||||||
/* Ok, find the first non-zero freq in our table and use it.
|
/* Ok, find the first non-zero freq in our table and use it.
|
||||||
* For now we only try to use a channel in the 802.11b channel
|
* For now we only try to use a channel in the 802.11b channel
|
||||||
@@ -3686,7 +3653,7 @@ static gboolean nm_completion_scan_has_results (int tries, va_list args)
|
|||||||
{
|
{
|
||||||
NMDevice *dev = va_arg (args, NMDevice *);
|
NMDevice *dev = va_arg (args, NMDevice *);
|
||||||
gboolean *err = va_arg (args, gboolean *);
|
gboolean *err = va_arg (args, gboolean *);
|
||||||
int sk = va_arg (args, int);
|
NMSock *sk = va_arg (args, NMSock *);
|
||||||
NMWirelessScanResults *scan_results = va_arg (args, NMWirelessScanResults *);
|
NMWirelessScanResults *scan_results = va_arg (args, NMWirelessScanResults *);
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
@@ -3694,7 +3661,7 @@ static gboolean nm_completion_scan_has_results (int tries, va_list args)
|
|||||||
g_return_val_if_fail (err != NULL, TRUE);
|
g_return_val_if_fail (err != NULL, TRUE);
|
||||||
g_return_val_if_fail (scan_results != NULL, TRUE);
|
g_return_val_if_fail (scan_results != NULL, TRUE);
|
||||||
|
|
||||||
rc = iw_scan(sk, (char *)nm_device_get_iface (dev), WIRELESS_EXT, &(scan_results->scan_head));
|
rc = iw_scan (nm_dev_sock_get_fd (sk), (char *)nm_device_get_iface (dev), WIRELESS_EXT, &(scan_results->scan_head));
|
||||||
*err = FALSE;
|
*err = FALSE;
|
||||||
if (rc == -1 && errno == ETIME)
|
if (rc == -1 && errno == ETIME)
|
||||||
{
|
{
|
||||||
@@ -3742,7 +3709,6 @@ static gboolean nm_device_wireless_scan (gpointer user_data)
|
|||||||
{
|
{
|
||||||
NMWirelessScanCB *scan_cb = (NMWirelessScanCB *)(user_data);
|
NMWirelessScanCB *scan_cb = (NMWirelessScanCB *)(user_data);
|
||||||
NMDevice *dev = NULL;
|
NMDevice *dev = NULL;
|
||||||
int sk;
|
|
||||||
NMWirelessScanResults *scan_results = NULL;
|
NMWirelessScanResults *scan_results = NULL;
|
||||||
|
|
||||||
g_return_val_if_fail (scan_cb != NULL, FALSE);
|
g_return_val_if_fail (scan_cb != NULL, FALSE);
|
||||||
@@ -3774,7 +3740,8 @@ static gboolean nm_device_wireless_scan (gpointer user_data)
|
|||||||
/* Grab the scan mutex */
|
/* Grab the scan mutex */
|
||||||
if (nm_try_acquire_mutex (dev->options.wireless.scan_mutex, __FUNCTION__))
|
if (nm_try_acquire_mutex (dev->options.wireless.scan_mutex, __FUNCTION__))
|
||||||
{
|
{
|
||||||
gboolean devup_err;
|
NMSock *sk;
|
||||||
|
gboolean devup_err;
|
||||||
|
|
||||||
/* Device must be up before we can scan */
|
/* Device must be up before we can scan */
|
||||||
devup_err = nm_device_bring_up_wait(dev, 1);
|
devup_err = nm_device_bring_up_wait(dev, 1);
|
||||||
@@ -3784,7 +3751,7 @@ static gboolean nm_device_wireless_scan (gpointer user_data)
|
|||||||
goto reschedule;
|
goto reschedule;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((sk = iw_sockets_open ()) >= 0)
|
if ((sk = nm_dev_sock_open (dev, DEV_WIRELESS, __FUNCTION__, NULL)))
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
NMNetworkMode orig_mode = NETWORK_MODE_INFRA;
|
NMNetworkMode orig_mode = NETWORK_MODE_INFRA;
|
||||||
@@ -3818,7 +3785,7 @@ static gboolean nm_device_wireless_scan (gpointer user_data)
|
|||||||
nm_device_set_bitrate (dev, orig_rate);
|
nm_device_set_bitrate (dev, orig_rate);
|
||||||
}
|
}
|
||||||
|
|
||||||
close (sk);
|
nm_dev_sock_close (sk);
|
||||||
|
|
||||||
if (!scan_results->scan_head.result)
|
if (!scan_results->scan_head.result)
|
||||||
{
|
{
|
||||||
@@ -3945,14 +3912,14 @@ typedef u_int64_t u64;
|
|||||||
|
|
||||||
static gboolean supports_ethtool_carrier_detect (NMDevice *dev)
|
static gboolean supports_ethtool_carrier_detect (NMDevice *dev)
|
||||||
{
|
{
|
||||||
int sk;
|
NMSock *sk;
|
||||||
struct ifreq ifr;
|
struct ifreq ifr;
|
||||||
gboolean supports_ethtool = FALSE;
|
gboolean supports_ethtool = FALSE;
|
||||||
struct ethtool_cmd edata;
|
struct ethtool_cmd edata;
|
||||||
|
|
||||||
g_return_val_if_fail (dev != NULL, FALSE);
|
g_return_val_if_fail (dev != NULL, FALSE);
|
||||||
|
|
||||||
if ((sk = socket (AF_INET, SOCK_DGRAM, 0)) < 0)
|
if ((sk = nm_dev_sock_open (dev, DEV_GENERAL, __FUNCTION__, NULL)) == NULL)
|
||||||
{
|
{
|
||||||
nm_warning ("cannot open socket on interface %s for MII detect; errno=%d", nm_device_get_iface (dev), errno);
|
nm_warning ("cannot open socket on interface %s for MII detect; errno=%d", nm_device_get_iface (dev), errno);
|
||||||
return (FALSE);
|
return (FALSE);
|
||||||
@@ -3961,13 +3928,13 @@ static gboolean supports_ethtool_carrier_detect (NMDevice *dev)
|
|||||||
strncpy (ifr.ifr_name, nm_device_get_iface (dev), sizeof(ifr.ifr_name)-1);
|
strncpy (ifr.ifr_name, nm_device_get_iface (dev), sizeof(ifr.ifr_name)-1);
|
||||||
edata.cmd = ETHTOOL_GLINK;
|
edata.cmd = ETHTOOL_GLINK;
|
||||||
ifr.ifr_data = (char *) &edata;
|
ifr.ifr_data = (char *) &edata;
|
||||||
if (ioctl(sk, SIOCETHTOOL, &ifr) == -1)
|
if (ioctl (nm_dev_sock_get_fd (sk), SIOCETHTOOL, &ifr) == -1)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
supports_ethtool = TRUE;
|
supports_ethtool = TRUE;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
close (sk);
|
nm_dev_sock_close (sk);
|
||||||
return (supports_ethtool);
|
return (supports_ethtool);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3978,17 +3945,17 @@ out:
|
|||||||
/**************************************/
|
/**************************************/
|
||||||
#include <linux/mii.h>
|
#include <linux/mii.h>
|
||||||
|
|
||||||
static int mdio_read (int sk, struct ifreq *ifr, int location)
|
static int mdio_read (NMSock *sk, struct ifreq *ifr, int location)
|
||||||
{
|
{
|
||||||
struct mii_ioctl_data *mii;
|
struct mii_ioctl_data *mii;
|
||||||
|
|
||||||
g_return_val_if_fail (sk >= 0, -1);
|
g_return_val_if_fail (sk != NULL, -1);
|
||||||
g_return_val_if_fail (ifr != NULL, -1);
|
g_return_val_if_fail (ifr != NULL, -1);
|
||||||
|
|
||||||
mii = (struct mii_ioctl_data *) &(ifr->ifr_data);
|
mii = (struct mii_ioctl_data *) &(ifr->ifr_data);
|
||||||
mii->reg_num = location;
|
mii->reg_num = location;
|
||||||
|
|
||||||
if (ioctl (sk, SIOCGMIIREG, ifr) < 0)
|
if (ioctl (nm_dev_sock_get_fd (sk), SIOCGMIIREG, ifr) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
return (mii->val_out);
|
return (mii->val_out);
|
||||||
@@ -3996,29 +3963,29 @@ static int mdio_read (int sk, struct ifreq *ifr, int location)
|
|||||||
|
|
||||||
static gboolean supports_mii_carrier_detect (NMDevice *dev)
|
static gboolean supports_mii_carrier_detect (NMDevice *dev)
|
||||||
{
|
{
|
||||||
int sk;
|
NMSock *sk;
|
||||||
struct ifreq ifr;
|
struct ifreq ifr;
|
||||||
int bmsr;
|
int bmsr;
|
||||||
gboolean supports_mii = FALSE;
|
gboolean supports_mii = FALSE;
|
||||||
|
|
||||||
g_return_val_if_fail (dev != NULL, FALSE);
|
g_return_val_if_fail (dev != NULL, FALSE);
|
||||||
|
|
||||||
if ((sk = socket (AF_INET, SOCK_DGRAM, 0)) < 0)
|
if ((sk = nm_dev_sock_open (dev, DEV_GENERAL, __FUNCTION__, NULL)) == NULL)
|
||||||
{
|
{
|
||||||
nm_warning ("cannot open socket on interface %s for MII detect; errno=%d", nm_device_get_iface (dev), errno);
|
nm_warning ("cannot open socket on interface %s for MII detect; errno=%d", nm_device_get_iface (dev), errno);
|
||||||
return (FALSE);
|
return (FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
strncpy (ifr.ifr_name, nm_device_get_iface (dev), sizeof(ifr.ifr_name)-1);
|
strncpy (ifr.ifr_name, nm_device_get_iface (dev), sizeof(ifr.ifr_name)-1);
|
||||||
if (ioctl(sk, SIOCGMIIPHY, &ifr) < 0)
|
if (ioctl (nm_dev_sock_get_fd (sk), SIOCGMIIPHY, &ifr) < 0)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
/* If we can read the BMSR register, we assume that the card supports MII link detection */
|
/* If we can read the BMSR register, we assume that the card supports MII link detection */
|
||||||
bmsr = mdio_read(sk, &ifr, MII_BMSR);
|
bmsr = mdio_read (sk, &ifr, MII_BMSR);
|
||||||
supports_mii = (bmsr != -1) ? TRUE : FALSE;
|
supports_mii = (bmsr != -1) ? TRUE : FALSE;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
close (sk);
|
nm_dev_sock_close (sk);
|
||||||
return (supports_mii);
|
return (supports_mii);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -41,42 +41,29 @@
|
|||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
#include "NetworkManagerSystem.h"
|
#include "NetworkManagerSystem.h"
|
||||||
#include "NetworkManagerDevice.h"
|
#include "NetworkManagerDevice.h"
|
||||||
|
#include "NetworkManagerUtils.h"
|
||||||
#include "nm-utils.h"
|
#include "nm-utils.h"
|
||||||
|
|
||||||
static int nm_system_open_sock (void)
|
|
||||||
{
|
|
||||||
int fd;
|
|
||||||
|
|
||||||
/* Try to grab a control socket */
|
|
||||||
fd = socket (AF_PACKET, SOCK_PACKET, htons (ETH_P_ALL));
|
|
||||||
if (fd >= 0)
|
|
||||||
return (fd);
|
|
||||||
|
|
||||||
nm_warning ("nm_system_open_sock() could not get network control socket.");
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
gboolean nm_system_device_set_ip4_address (NMDevice *dev, int ip4_address)
|
gboolean nm_system_device_set_ip4_address (NMDevice *dev, int ip4_address)
|
||||||
{
|
{
|
||||||
struct ifreq ifr;
|
struct ifreq ifr;
|
||||||
const char *iface;
|
const char *iface;
|
||||||
int sk;
|
NMSock *sk;
|
||||||
gboolean success = FALSE;
|
gboolean success = FALSE;
|
||||||
struct sockaddr_in *p = (struct sockaddr_in *)&(ifr.ifr_addr);
|
struct sockaddr_in *p = (struct sockaddr_in *)&(ifr.ifr_addr);
|
||||||
|
|
||||||
g_return_val_if_fail (dev != NULL, FALSE);
|
g_return_val_if_fail (dev != NULL, FALSE);
|
||||||
|
|
||||||
iface = nm_device_get_iface (dev);
|
if ((sk = nm_dev_sock_open (dev, NETWORK_CONTROL, __FUNCTION__, NULL)) == NULL)
|
||||||
sk = nm_system_open_sock ();
|
|
||||||
if (sk < 0)
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
memset (&ifr, 0, sizeof(struct ifreq));
|
memset (&ifr, 0, sizeof(struct ifreq));
|
||||||
|
|
||||||
|
iface = nm_device_get_iface (dev);
|
||||||
memcpy (ifr.ifr_name, iface, strlen (iface));
|
memcpy (ifr.ifr_name, iface, strlen (iface));
|
||||||
p->sin_family = AF_INET;
|
p->sin_family = AF_INET;
|
||||||
p->sin_addr.s_addr = ip4_address;
|
p->sin_addr.s_addr = ip4_address;
|
||||||
if (ioctl (sk, SIOCSIFADDR, &ifr) == -1)
|
if (ioctl (nm_dev_sock_get_fd (sk), SIOCSIFADDR, &ifr) == -1)
|
||||||
nm_warning ("nm_system_device_set_ip4_address (%s): failed to set IPv4 address!", iface);
|
nm_warning ("nm_system_device_set_ip4_address (%s): failed to set IPv4 address!", iface);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -86,7 +73,7 @@ gboolean nm_system_device_set_ip4_address (NMDevice *dev, int ip4_address)
|
|||||||
((unsigned char *)&ip4_address)[2], ((unsigned char *)&ip4_address)[3]);
|
((unsigned char *)&ip4_address)[2], ((unsigned char *)&ip4_address)[3]);
|
||||||
}
|
}
|
||||||
|
|
||||||
close (sk);
|
nm_dev_sock_close (sk);
|
||||||
return (success);
|
return (success);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -95,27 +82,27 @@ gboolean nm_system_device_set_ip4_netmask (NMDevice *dev, int ip4_netmask)
|
|||||||
{
|
{
|
||||||
struct ifreq ifr;
|
struct ifreq ifr;
|
||||||
const char *iface;
|
const char *iface;
|
||||||
int sk;
|
NMSock *sk;
|
||||||
gboolean success = FALSE;
|
gboolean success = FALSE;
|
||||||
struct sockaddr_in *p = (struct sockaddr_in *)&(ifr.ifr_addr);
|
struct sockaddr_in *p = (struct sockaddr_in *)&(ifr.ifr_addr);
|
||||||
|
|
||||||
g_return_val_if_fail (dev != NULL, FALSE);
|
g_return_val_if_fail (dev != NULL, FALSE);
|
||||||
|
|
||||||
iface = nm_device_get_iface (dev);
|
if ((sk = nm_dev_sock_open (dev, NETWORK_CONTROL, __FUNCTION__, NULL)) == NULL)
|
||||||
sk = nm_system_open_sock ();
|
|
||||||
if (sk < 0)
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
memset (&ifr, 0, sizeof(struct ifreq));
|
memset (&ifr, 0, sizeof(struct ifreq));
|
||||||
|
|
||||||
|
iface = nm_device_get_iface (dev);
|
||||||
memcpy (ifr.ifr_name, iface, strlen (iface));
|
memcpy (ifr.ifr_name, iface, strlen (iface));
|
||||||
p->sin_family = AF_INET;
|
p->sin_family = AF_INET;
|
||||||
p->sin_addr.s_addr = ip4_netmask;
|
p->sin_addr.s_addr = ip4_netmask;
|
||||||
if (ioctl (sk, SIOCSIFNETMASK, &ifr) == -1)
|
if (ioctl (nm_dev_sock_get_fd (sk), SIOCSIFNETMASK, &ifr) == -1)
|
||||||
nm_warning ("nm_system_device_set_ip4_netmask (%s): failed to set IPv4 netmask! errno = %s", iface, strerror (errno));
|
nm_warning ("nm_system_device_set_ip4_netmask (%s): failed to set IPv4 netmask! errno = %s", iface, strerror (errno));
|
||||||
else
|
else
|
||||||
success = TRUE;
|
success = TRUE;
|
||||||
|
|
||||||
close (sk);
|
nm_dev_sock_close (sk);
|
||||||
return (success);
|
return (success);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -124,27 +111,26 @@ gboolean nm_system_device_set_ip4_broadcast (NMDevice *dev, int ip4_broadcast)
|
|||||||
{
|
{
|
||||||
struct ifreq ifr;
|
struct ifreq ifr;
|
||||||
const char *iface;
|
const char *iface;
|
||||||
int sk;
|
NMSock *sk;
|
||||||
gboolean success = FALSE;
|
gboolean success = FALSE;
|
||||||
struct sockaddr_in *p = (struct sockaddr_in *)&(ifr.ifr_addr);
|
struct sockaddr_in *p = (struct sockaddr_in *)&(ifr.ifr_addr);
|
||||||
|
|
||||||
g_return_val_if_fail (dev != NULL, FALSE);
|
g_return_val_if_fail (dev != NULL, FALSE);
|
||||||
|
|
||||||
iface = nm_device_get_iface (dev);
|
if ((sk = nm_dev_sock_open (dev, NETWORK_CONTROL, __FUNCTION__, NULL)) == NULL)
|
||||||
sk = nm_system_open_sock ();
|
|
||||||
if (sk < 0)
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
memset (&ifr, 0, sizeof(struct ifreq));
|
memset (&ifr, 0, sizeof(struct ifreq));
|
||||||
|
iface = nm_device_get_iface (dev);
|
||||||
memcpy (ifr.ifr_name, iface, strlen (iface));
|
memcpy (ifr.ifr_name, iface, strlen (iface));
|
||||||
p->sin_family = AF_INET;
|
p->sin_family = AF_INET;
|
||||||
p->sin_addr.s_addr = ip4_broadcast;
|
p->sin_addr.s_addr = ip4_broadcast;
|
||||||
if (ioctl (sk, SIOCSIFBRDADDR, &ifr) == -1)
|
if (ioctl (nm_dev_sock_get_fd (sk), SIOCSIFBRDADDR, &ifr) == -1)
|
||||||
nm_warning ("nm_system_device_set_ip4_netmask (%s): failed to set IPv4 netmask!", iface);
|
nm_warning ("nm_system_device_set_ip4_netmask (%s): failed to set IPv4 netmask!", iface);
|
||||||
else
|
else
|
||||||
success = TRUE;
|
success = TRUE;
|
||||||
|
|
||||||
close (sk);
|
nm_dev_sock_close (sk);
|
||||||
return (success);
|
return (success);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -152,18 +138,18 @@ gboolean nm_system_device_set_ip4_broadcast (NMDevice *dev, int ip4_broadcast)
|
|||||||
gboolean nm_system_device_set_ip4_default_route (NMDevice *dev, int ip4_def_route)
|
gboolean nm_system_device_set_ip4_default_route (NMDevice *dev, int ip4_def_route)
|
||||||
{
|
{
|
||||||
const char *iface;
|
const char *iface;
|
||||||
int sk;
|
NMSock *sk;
|
||||||
gboolean success = FALSE;
|
gboolean success = FALSE;
|
||||||
struct rtentry rtent;
|
struct rtentry rtent;
|
||||||
struct sockaddr_in *p;
|
struct sockaddr_in *p;
|
||||||
|
|
||||||
g_return_val_if_fail (dev != NULL, FALSE);
|
g_return_val_if_fail (dev != NULL, FALSE);
|
||||||
|
|
||||||
iface = nm_device_get_iface (dev);
|
if ((sk = nm_dev_sock_open (dev, NETWORK_CONTROL, __FUNCTION__, NULL)) == NULL)
|
||||||
sk = nm_system_open_sock ();
|
|
||||||
if (sk < 0)
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
iface = nm_device_get_iface (dev);
|
||||||
|
|
||||||
memset (&rtent, 0, sizeof (struct rtentry));
|
memset (&rtent, 0, sizeof (struct rtentry));
|
||||||
p = (struct sockaddr_in *)&rtent.rt_dst;
|
p = (struct sockaddr_in *)&rtent.rt_dst;
|
||||||
p->sin_family = AF_INET;
|
p->sin_family = AF_INET;
|
||||||
@@ -179,7 +165,7 @@ gboolean nm_system_device_set_ip4_default_route (NMDevice *dev, int ip4_def_rout
|
|||||||
rtent.rt_window = 0;
|
rtent.rt_window = 0;
|
||||||
rtent.rt_flags = RTF_UP | RTF_GATEWAY | ( rtent.rt_window ? RTF_WINDOW : 0);
|
rtent.rt_flags = RTF_UP | RTF_GATEWAY | ( rtent.rt_window ? RTF_WINDOW : 0);
|
||||||
|
|
||||||
if (ioctl (sk, SIOCADDRT, &rtent) == -1)
|
if (ioctl (nm_dev_sock_get_fd (sk), SIOCADDRT, &rtent) == -1)
|
||||||
{
|
{
|
||||||
if (errno == ENETUNREACH) /* possibly gateway is over the bridge */
|
if (errno == ENETUNREACH) /* possibly gateway is over the bridge */
|
||||||
{ /* try adding a route to gateway first */
|
{ /* try adding a route to gateway first */
|
||||||
@@ -198,9 +184,9 @@ gboolean nm_system_device_set_ip4_default_route (NMDevice *dev, int ip4_def_rout
|
|||||||
rtent2.rt_metric = 0;
|
rtent2.rt_metric = 0;
|
||||||
rtent2.rt_flags = RTF_UP | RTF_HOST;
|
rtent2.rt_flags = RTF_UP | RTF_HOST;
|
||||||
|
|
||||||
if ( ioctl (sk, SIOCADDRT, &rtent2) == 0 )
|
if (ioctl (nm_dev_sock_get_fd (sk), SIOCADDRT, &rtent2) == 0 )
|
||||||
{
|
{
|
||||||
if ( ioctl (sk, SIOCADDRT, &rtent) == 0 )
|
if (ioctl (nm_dev_sock_get_fd (sk), SIOCADDRT, &rtent) == 0 )
|
||||||
success = TRUE;
|
success = TRUE;
|
||||||
else
|
else
|
||||||
nm_warning ("nm_system_device_set_ip4_default_route (%s): failed to set IPv4 default route! errno = %d", iface, errno);
|
nm_warning ("nm_system_device_set_ip4_default_route (%s): failed to set IPv4 default route! errno = %d", iface, errno);
|
||||||
@@ -212,7 +198,7 @@ gboolean nm_system_device_set_ip4_default_route (NMDevice *dev, int ip4_def_rout
|
|||||||
else
|
else
|
||||||
success = TRUE;
|
success = TRUE;
|
||||||
|
|
||||||
close (sk);
|
nm_dev_sock_close (sk);
|
||||||
return (success);
|
return (success);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -29,12 +29,24 @@
|
|||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
#include <iwlib.h>
|
||||||
|
|
||||||
#include "NetworkManager.h"
|
#include "NetworkManager.h"
|
||||||
#include "NetworkManagerUtils.h"
|
#include "NetworkManagerUtils.h"
|
||||||
#include "nm-utils.h"
|
#include "nm-utils.h"
|
||||||
|
|
||||||
|
|
||||||
|
struct NMSock
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
char *func;
|
||||||
|
char *desc;
|
||||||
|
NMDevice *dev;
|
||||||
|
};
|
||||||
|
|
||||||
|
static GSList *sock_list = NULL;
|
||||||
|
static GStaticMutex sock_list_mutex = G_STATIC_MUTEX_INIT;
|
||||||
|
|
||||||
typedef struct MutexDesc
|
typedef struct MutexDesc
|
||||||
{
|
{
|
||||||
GMutex *mutex;
|
GMutex *mutex;
|
||||||
@@ -155,6 +167,141 @@ void nm_unlock_mutex (GMutex *mutex, const char *func)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* nm_dev_sock_open
|
||||||
|
*
|
||||||
|
* Open a socket to a network device and store some debug info about it.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
NMSock *nm_dev_sock_open (NMDevice *dev, SockType type, const char *func_name, const char *desc)
|
||||||
|
{
|
||||||
|
NMSock *sock = NULL;
|
||||||
|
|
||||||
|
sock = g_malloc0 (sizeof (NMSock));
|
||||||
|
|
||||||
|
sock->fd = -1;
|
||||||
|
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case DEV_WIRELESS:
|
||||||
|
sock->fd = iw_sockets_open ();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DEV_GENERAL:
|
||||||
|
if ((sock->fd = socket (PF_INET, SOCK_DGRAM, 0)) < 0)
|
||||||
|
if ((sock->fd = socket (PF_PACKET, SOCK_DGRAM, 0)) < 0)
|
||||||
|
sock->fd = socket (PF_INET6, SOCK_DGRAM, 0);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NETWORK_CONTROL:
|
||||||
|
sock->fd = socket (AF_PACKET, SOCK_PACKET, htons (ETH_P_ALL));
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sock->fd < 0)
|
||||||
|
{
|
||||||
|
g_free (sock);
|
||||||
|
nm_warning ("Could not open control socket for device '%s'.", dev ? nm_device_get_iface (dev) : "none");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
sock->func = func_name ? g_strdup (func_name) : NULL;
|
||||||
|
sock->desc = desc ? g_strdup (desc) : NULL;
|
||||||
|
sock->dev = dev;
|
||||||
|
if (sock->dev)
|
||||||
|
nm_device_ref (sock->dev);
|
||||||
|
|
||||||
|
/* Add the sock to our global sock list for tracking */
|
||||||
|
g_static_mutex_lock (&sock_list_mutex);
|
||||||
|
sock_list = g_slist_append (sock_list, sock);
|
||||||
|
g_static_mutex_unlock (&sock_list_mutex);
|
||||||
|
|
||||||
|
return sock;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* nm_dev_sock_close
|
||||||
|
*
|
||||||
|
* Close a socket and free its debug data.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void nm_dev_sock_close (NMSock *sock)
|
||||||
|
{
|
||||||
|
GSList *elt;
|
||||||
|
|
||||||
|
g_return_if_fail (sock != NULL);
|
||||||
|
|
||||||
|
close (sock->fd);
|
||||||
|
g_free (sock->func);
|
||||||
|
g_free (sock->desc);
|
||||||
|
if (sock->dev)
|
||||||
|
nm_device_unref (sock->dev);
|
||||||
|
|
||||||
|
memset (sock, 0, sizeof (NMSock));
|
||||||
|
|
||||||
|
g_static_mutex_lock (&sock_list_mutex);
|
||||||
|
for (elt = sock_list; elt; elt = g_slist_next (elt))
|
||||||
|
{
|
||||||
|
NMSock *temp_sock = (NMSock *)(elt->data);
|
||||||
|
if (temp_sock == sock)
|
||||||
|
{
|
||||||
|
sock_list = g_slist_remove_link (sock_list, elt);
|
||||||
|
g_slist_free (elt);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
g_static_mutex_unlock (&sock_list_mutex);
|
||||||
|
|
||||||
|
g_free (sock);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* nm_dev_sock_get_fd
|
||||||
|
*
|
||||||
|
* Return the fd associated with an NMSock
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
int nm_dev_sock_get_fd (NMSock *sock)
|
||||||
|
{
|
||||||
|
g_return_val_if_fail (sock != NULL, -1);
|
||||||
|
|
||||||
|
return sock->fd;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* nm_print_open_socks
|
||||||
|
*
|
||||||
|
* Print a list of currently open and registered NMSocks.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void nm_print_open_socks (void)
|
||||||
|
{
|
||||||
|
GSList *elt = NULL;
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
nm_debug ("Open Sockets List:");
|
||||||
|
g_static_mutex_lock (&sock_list_mutex);
|
||||||
|
for (elt = sock_list; elt; elt = g_slist_next (elt))
|
||||||
|
{
|
||||||
|
NMSock *sock = (NMSock *)(elt->data);
|
||||||
|
if (sock)
|
||||||
|
{
|
||||||
|
i++;
|
||||||
|
nm_debug (" %d: %s fd:%d F:'%s' D:'%s'", i, sock->dev ? nm_device_get_iface (sock->dev) : "",
|
||||||
|
sock->fd, sock->func, sock->desc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
g_static_mutex_unlock (&sock_list_mutex);
|
||||||
|
nm_debug ("Open Sockets List Done.");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* nm_null_safe_strcmp
|
* nm_null_safe_strcmp
|
||||||
*
|
*
|
||||||
|
@@ -34,12 +34,26 @@
|
|||||||
#include "NetworkManagerMain.h"
|
#include "NetworkManagerMain.h"
|
||||||
#include "NetworkManagerDevice.h"
|
#include "NetworkManagerDevice.h"
|
||||||
|
|
||||||
|
typedef enum SockType
|
||||||
|
{
|
||||||
|
DEV_WIRELESS,
|
||||||
|
DEV_GENERAL,
|
||||||
|
NETWORK_CONTROL
|
||||||
|
} SockType;
|
||||||
|
|
||||||
|
typedef struct NMSock NMSock;
|
||||||
|
|
||||||
|
|
||||||
gboolean nm_try_acquire_mutex (GMutex *mutex, const char *func);
|
gboolean nm_try_acquire_mutex (GMutex *mutex, const char *func);
|
||||||
void nm_lock_mutex (GMutex *mutex, const char *func);
|
void nm_lock_mutex (GMutex *mutex, const char *func);
|
||||||
void nm_unlock_mutex (GMutex *mutex, const char *func);
|
void nm_unlock_mutex (GMutex *mutex, const char *func);
|
||||||
void nm_register_mutex_desc (GMutex *mutex, char *string);
|
void nm_register_mutex_desc (GMutex *mutex, char *string);
|
||||||
|
|
||||||
|
NMSock * nm_dev_sock_open (NMDevice *dev, SockType type, const char *func_name, const char *desc);
|
||||||
|
void nm_dev_sock_close (NMSock *sock);
|
||||||
|
int nm_dev_sock_get_fd (NMSock *sock);
|
||||||
|
void nm_print_open_socks (void);
|
||||||
|
|
||||||
int nm_null_safe_strcmp (const char *s1, const char *s2);
|
int nm_null_safe_strcmp (const char *s1, const char *s2);
|
||||||
|
|
||||||
gboolean nm_ethernet_address_is_valid (struct ether_addr *test_addr);
|
gboolean nm_ethernet_address_is_valid (struct ether_addr *test_addr);
|
||||||
|
20
src/autoip.c
20
src/autoip.c
@@ -33,6 +33,7 @@
|
|||||||
#include "NetworkManager.h"
|
#include "NetworkManager.h"
|
||||||
#include "NetworkManagerDevice.h"
|
#include "NetworkManagerDevice.h"
|
||||||
#include "NetworkManagerMain.h"
|
#include "NetworkManagerMain.h"
|
||||||
|
#include "NetworkManagerUtils.h"
|
||||||
#include "nm-utils.h"
|
#include "nm-utils.h"
|
||||||
|
|
||||||
// Times here are in seconds
|
// Times here are in seconds
|
||||||
@@ -57,7 +58,7 @@ static struct ether_addr broadcast_addr = {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}}
|
|||||||
/**
|
/**
|
||||||
* Pick a random link local IP address.
|
* Pick a random link local IP address.
|
||||||
*/
|
*/
|
||||||
static void pick(struct in_addr *ip)
|
static void pick (struct in_addr *ip)
|
||||||
{
|
{
|
||||||
ip->s_addr = htonl (LINKLOCAL_ADDR | ((abs(random()) % 0xFD00) + (abs(random()) % 0x0100)));
|
ip->s_addr = htonl (LINKLOCAL_ADDR | ((abs(random()) % 0xFD00) + (abs(random()) % 0x0100)));
|
||||||
|
|
||||||
@@ -175,7 +176,7 @@ gboolean get_autoip (NMDevice *dev, struct in_addr *out_ip)
|
|||||||
arpMessage p;
|
arpMessage p;
|
||||||
struct ether_addr addr;
|
struct ether_addr addr;
|
||||||
struct in_addr ip = {0};
|
struct in_addr ip = {0};
|
||||||
int fd;
|
NMSock *sk;
|
||||||
int nprobes = 0;
|
int nprobes = 0;
|
||||||
int nannounce = 0;
|
int nannounce = 0;
|
||||||
gboolean success = FALSE;
|
gboolean success = FALSE;
|
||||||
@@ -191,14 +192,14 @@ gboolean get_autoip (NMDevice *dev, struct in_addr *out_ip)
|
|||||||
strncpy (saddr.sa_data, nm_device_get_iface (dev), sizeof (saddr.sa_data));
|
strncpy (saddr.sa_data, nm_device_get_iface (dev), sizeof (saddr.sa_data));
|
||||||
|
|
||||||
/* open an ARP socket */
|
/* open an ARP socket */
|
||||||
if ((fd = socket (PF_PACKET, SOCK_PACKET, htons (ETH_P_ARP))) < 0)
|
if ((sk = nm_dev_sock_open (dev, NETWORK_CONTROL, __FUNCTION__, NULL)) == NULL)
|
||||||
{
|
{
|
||||||
nm_warning ("%s: Couldn't open network control socket.", nm_device_get_iface (dev));
|
nm_warning ("%s: Couldn't open network control socket.", nm_device_get_iface (dev));
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* bind to the ARP socket */
|
/* bind to the ARP socket */
|
||||||
if (bind (fd, &saddr, sizeof (saddr)) < 0)
|
if (bind (nm_dev_sock_get_fd (sk), &saddr, sizeof (saddr)) < 0)
|
||||||
{
|
{
|
||||||
nm_warning ("%s: Couldn't bind to the device.", nm_device_get_iface (dev));
|
nm_warning ("%s: Couldn't bind to the device.", nm_device_get_iface (dev));
|
||||||
goto out;
|
goto out;
|
||||||
@@ -228,7 +229,7 @@ gboolean get_autoip (NMDevice *dev, struct in_addr *out_ip)
|
|||||||
if (nprobes < PROBE_NUM)
|
if (nprobes < PROBE_NUM)
|
||||||
{
|
{
|
||||||
nm_info ("autoip: Sending probe #%d for IP address %s.", nprobes, inet_ntoa (ip));
|
nm_info ("autoip: Sending probe #%d for IP address %s.", nprobes, inet_ntoa (ip));
|
||||||
arp (fd, &saddr, ARPOP_REQUEST, &addr, null_ip, &null_addr, ip);
|
arp (nm_dev_sock_get_fd (sk), &saddr, ARPOP_REQUEST, &addr, null_ip, &null_addr, ip);
|
||||||
nprobes++;
|
nprobes++;
|
||||||
gettimeofday (&timeout, NULL);
|
gettimeofday (&timeout, NULL);
|
||||||
if (nprobes == PROBE_NUM)
|
if (nprobes == PROBE_NUM)
|
||||||
@@ -248,7 +249,7 @@ gboolean get_autoip (NMDevice *dev, struct in_addr *out_ip)
|
|||||||
else if (nannounce < ANNOUNCE_NUM)
|
else if (nannounce < ANNOUNCE_NUM)
|
||||||
{
|
{
|
||||||
nm_info ("autoip: Sending announce #%d for IP address %s.", nannounce, inet_ntoa (ip));
|
nm_info ("autoip: Sending announce #%d for IP address %s.", nannounce, inet_ntoa (ip));
|
||||||
arp (fd, &saddr, ARPOP_REQUEST, &addr, ip, &addr, ip);
|
arp (nm_dev_sock_get_fd (sk), &saddr, ARPOP_REQUEST, &addr, ip, &addr, ip);
|
||||||
nannounce++;
|
nannounce++;
|
||||||
gettimeofday (&timeout, NULL);
|
gettimeofday (&timeout, NULL);
|
||||||
timeout.tv_sec += ANNOUNCE_INTERVAL;
|
timeout.tv_sec += ANNOUNCE_INTERVAL;
|
||||||
@@ -263,7 +264,7 @@ gboolean get_autoip (NMDevice *dev, struct in_addr *out_ip)
|
|||||||
}
|
}
|
||||||
|
|
||||||
nm_info ("autoip: Waiting for reply...");
|
nm_info ("autoip: Waiting for reply...");
|
||||||
err = peekfd (dev, fd, &timeout);
|
err = peekfd (dev, nm_dev_sock_get_fd (sk), &timeout);
|
||||||
if ((err == RET_DHCP_ERROR) || (err == RET_DHCP_CEASED))
|
if ((err == RET_DHCP_ERROR) || (err == RET_DHCP_CEASED))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
@@ -273,7 +274,7 @@ gboolean get_autoip (NMDevice *dev, struct in_addr *out_ip)
|
|||||||
nm_info ("autoip: Got some data to check for reply packet.");
|
nm_info ("autoip: Got some data to check for reply packet.");
|
||||||
|
|
||||||
/* read ARP packet */
|
/* read ARP packet */
|
||||||
if (recv (fd, &p, sizeof (p), 0) < 0)
|
if (recv (nm_dev_sock_get_fd (sk), &p, sizeof (p), 0) < 0)
|
||||||
{
|
{
|
||||||
nm_warning ("autoip: packet receive failure, ignoring it.");
|
nm_warning ("autoip: packet receive failure, ignoring it.");
|
||||||
continue;
|
continue;
|
||||||
@@ -310,7 +311,6 @@ gboolean get_autoip (NMDevice *dev, struct in_addr *out_ip)
|
|||||||
}
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
if (fd >= 0)
|
nm_dev_sock_close (sk);
|
||||||
close (fd);
|
|
||||||
return (success);
|
return (success);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user