1
/* -*- Mode: C; tab-width: 5; indent-tabs-mode: t; c-basic-offset: 5 -*- */
2
/* NetworkManager Wireless Applet -- Display wireless access points and allow user control
4
* Dan Williams <dcbw@redhat.com>
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; either version 2 of the License, or
9
* (at your option) any later version.
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20
* (C) Copyright 2004-2005 Red Hat, Inc.
26
#include "nm-device.h"
30
* Representation of network device
63
* Create a new network device representation
66
NetworkDevice *network_device_new (const char *iface, NMDeviceType type, const char *nm_path)
68
NetworkDevice *dev = g_malloc0 (sizeof (NetworkDevice));
71
dev->iface = g_strdup (iface);
73
dev->nm_path = g_strdup (nm_path);
82
* Create a new network device representation, filling its
83
* data in from an already existing one. Deep-copies the
84
* wireless networks too.
87
NetworkDevice *network_device_copy (NetworkDevice *src)
92
g_return_val_if_fail (src != NULL, NULL);
94
dev = g_malloc0 (sizeof (NetworkDevice));
96
network_device_ref (dev);
97
dev->nm_path = g_strdup (src->nm_path);
98
dev->driver = g_strdup (src->driver);
99
dev->type = src->type;
100
dev->link = src->link;
101
dev->addr = g_strdup (src->addr);
102
dev->ip4addr = g_strdup (src->ip4addr);
103
dev->broadcast = g_strdup (src->broadcast);
104
dev->netmask = g_strdup (src->netmask);
105
dev->caps = src->caps;
106
dev->iface = g_strdup (src->iface);
107
dev->desc = g_strdup (src->desc);
108
dev->route = g_strdup (src->route);
109
dev->udi = g_strdup (src->udi);
110
dev->active = src->active;
111
dev->act_stage = src->act_stage;
112
dev->strength = src->strength;
114
for (elt = src->networks; elt; elt = g_slist_next (elt))
116
WirelessNetwork *net = (WirelessNetwork *)elt->data;
119
WirelessNetwork *copy = wireless_network_copy (net);
120
dev->networks = g_slist_append (dev->networks, copy);
131
* Increment the reference count of the network device
134
void network_device_ref (NetworkDevice *dev)
136
g_return_if_fail (dev != NULL);
143
* network_device_unref
145
* Unrefs (and possibly frees) the representation of a network device
148
void network_device_unref (NetworkDevice *dev)
150
g_return_if_fail (dev != NULL);
153
if (dev->refcount < 1)
155
if (dev->type == DEVICE_TYPE_802_11_WIRELESS)
156
network_device_clear_wireless_networks (dev);
157
g_free (dev->nm_path);
159
g_free (dev->driver);
164
g_free (dev->broadcast);
165
g_free (dev->netmask);
166
g_free (dev->ip4addr);
167
g_free (dev->primary_dns);
168
g_free (dev->secondary_dns);
169
memset (dev, 0, sizeof (NetworkDevice));
175
gboolean network_device_is_wired (NetworkDevice *dev)
177
g_return_val_if_fail (dev != NULL, FALSE);
179
return (network_device_get_type (dev) == DEVICE_TYPE_802_3_ETHERNET);
183
gboolean network_device_is_wireless (NetworkDevice *dev)
185
g_return_val_if_fail (dev != NULL, FALSE);
187
return (network_device_get_type (dev) == DEVICE_TYPE_802_11_WIRELESS);
192
* network_device_get_active_wireless_network
194
* Return the active wireless network.
197
WirelessNetwork *network_device_get_active_wireless_network (NetworkDevice *dev)
200
WirelessNetwork * active = NULL;
202
g_return_val_if_fail (dev != NULL, NULL);
203
g_return_val_if_fail (dev->type == DEVICE_TYPE_802_11_WIRELESS, NULL);
205
for (list = dev->networks; list; list = list->next)
207
WirelessNetwork *net = (WirelessNetwork *) list->data;
209
if (wireless_network_get_active (net))
221
* network_device_get_wireless_network_by_essid
223
* Return the wireless network with the specified essid.
226
WirelessNetwork *network_device_get_wireless_network_by_essid (NetworkDevice *dev, const char *essid)
229
WirelessNetwork * return_net = NULL;
231
g_return_val_if_fail (dev != NULL, NULL);
232
g_return_val_if_fail (dev->type == DEVICE_TYPE_802_11_WIRELESS, NULL);
233
g_return_val_if_fail (essid != NULL, NULL);
235
for (list = dev->networks; list; list = list->next)
237
WirelessNetwork *net = (WirelessNetwork *) list->data;
239
if (!strcmp (wireless_network_get_essid (net), essid))
251
* network_device_get_wireless_network_by_nm_path
253
* Return the wireless network with the specified NetworkManager object path.
256
WirelessNetwork *network_device_get_wireless_network_by_nm_path (NetworkDevice *dev, const char *nm_path)
259
WirelessNetwork * return_net = NULL;
261
g_return_val_if_fail (dev != NULL, NULL);
262
g_return_val_if_fail (dev->type == DEVICE_TYPE_802_11_WIRELESS, NULL);
263
g_return_val_if_fail (nm_path != NULL, NULL);
265
for (list = dev->networks; list; list = list->next)
267
WirelessNetwork *net = (WirelessNetwork *) list->data;
269
if (!strcmp (wireless_network_get_nm_path (net), nm_path))
281
* network_device_get_wireless_network_by_nm_path
283
* Return the wireless network with the specified NetworkManager object path.
286
void network_device_foreach_wireless_network (NetworkDevice *dev, WirelessNetworkForeach func, gpointer user_data)
290
g_return_if_fail (dev != NULL);
291
g_return_if_fail (dev->type == DEVICE_TYPE_802_11_WIRELESS);
292
g_return_if_fail (func != NULL);
294
for (list = dev->networks; list; list = list->next)
296
WirelessNetwork *net = (WirelessNetwork *) list->data;
299
(*func)(dev, net, user_data);
305
* network_device_add_wireless_network
307
* Adds a wireless network to the network device's network list
310
void network_device_add_wireless_network (NetworkDevice *dev, WirelessNetwork *net)
312
g_return_if_fail (dev != NULL);
313
g_return_if_fail (dev->type == DEVICE_TYPE_802_11_WIRELESS);
314
g_return_if_fail (net != NULL);
316
wireless_network_ref (net);
317
dev->networks = g_slist_append (dev->networks, net);
322
* network_device_clear_wireless_networks
325
void network_device_clear_wireless_networks (NetworkDevice *dev)
327
g_return_if_fail (dev != NULL);
328
g_return_if_fail (dev->type == DEVICE_TYPE_802_11_WIRELESS);
330
g_slist_foreach (dev->networks, (GFunc) wireless_network_unref, NULL);
331
g_slist_free (dev->networks);
332
dev->networks = NULL;
337
* network_device_remove_wireless_network
339
* Remove one wireless network from the wireless network list
342
void network_device_remove_wireless_network (NetworkDevice *dev, WirelessNetwork *net)
346
g_return_if_fail (dev != NULL);
347
g_return_if_fail (dev->type == DEVICE_TYPE_802_11_WIRELESS);
348
g_return_if_fail (net != NULL);
350
for (elt = dev->networks; elt; elt = g_slist_next (elt))
352
if (elt->data == net)
354
dev->networks = g_slist_remove_link (dev->networks, elt);
355
wireless_network_unref ((WirelessNetwork *)elt->data);
363
static int sort_networks_function (WirelessNetwork *a, WirelessNetwork *b)
365
const char *name_a = wireless_network_get_essid (a);
366
const char *name_b = wireless_network_get_essid (b);
368
if (name_a && !name_b)
370
else if (!name_a && name_b)
372
else if (!name_a && !name_b)
375
return strcasecmp (name_a, name_b);
380
* network_device_sort_wireless_networks
382
* Alphabetize the wireless networks list
385
void network_device_sort_wireless_networks (NetworkDevice *dev)
387
g_return_if_fail (dev != NULL);
388
g_return_if_fail (dev->type == DEVICE_TYPE_802_11_WIRELESS);
390
dev->networks = g_slist_sort (dev->networks, (GCompareFunc) sort_networks_function);
395
* network_device_get_num_wireless_networks
397
* Return the number of wireless networks this device knows about.
400
guint network_device_get_num_wireless_networks (NetworkDevice *dev)
402
g_return_val_if_fail (dev != NULL, 0);
403
g_return_val_if_fail (dev->type == DEVICE_TYPE_802_11_WIRELESS, 0);
405
return g_slist_length (dev->networks);
410
* Accessors for driver name
412
const char *network_device_get_driver (NetworkDevice *dev)
414
g_return_val_if_fail (dev != NULL, NULL);
419
void network_device_set_driver (NetworkDevice *dev, const char *driver)
421
g_return_if_fail (dev != NULL);
424
g_free (dev->driver);
425
dev->driver = driver ? g_strdup (driver) : NULL;
429
* Accessors for hardware address
431
const char *network_device_get_address (NetworkDevice *dev)
433
g_return_val_if_fail (dev != NULL, NULL);
438
void network_device_set_address (NetworkDevice *dev, const char *addr)
440
g_return_if_fail (dev != NULL);
444
dev->addr = addr ? g_strdup (addr) : NULL;
448
* Accessors for broadcast address
450
const char *network_device_get_broadcast (NetworkDevice *dev)
452
g_return_val_if_fail (dev != NULL, NULL);
454
return (dev->broadcast);
457
void network_device_set_broadcast (NetworkDevice *dev, const char *addr)
459
g_return_if_fail (dev != NULL);
462
g_free (dev->broadcast);
463
dev->broadcast = addr ? g_strdup (addr) : NULL;
467
* Accessors for subnet address
469
const char *network_device_get_netmask (NetworkDevice *dev)
471
g_return_val_if_fail (dev != NULL, NULL);
473
return (dev->netmask);
476
void network_device_set_netmask (NetworkDevice *dev, const char *addr)
478
g_return_if_fail (dev != NULL);
481
g_free (dev->netmask);
482
dev->netmask = addr ? g_strdup (addr) : NULL;
486
* Accessors for ip4 address
488
const char *network_device_get_ip4_address (NetworkDevice *dev)
490
g_return_val_if_fail (dev != NULL, NULL);
492
return (dev->ip4addr);
495
void network_device_set_ip4_address (NetworkDevice *dev, const char *addr)
497
g_return_if_fail (dev != NULL);
500
g_free (dev->ip4addr);
501
dev->ip4addr = addr ? g_strdup (addr) : NULL;
505
* Accessors for default route
507
const char *network_device_get_route (NetworkDevice *dev)
509
g_return_val_if_fail (dev != NULL, NULL);
514
void network_device_set_route (NetworkDevice *dev, const char *route)
516
g_return_if_fail (dev != NULL);
520
dev->route = route ? g_strdup (route) : NULL;
524
* Accessors for primary DNS
526
const char *network_device_get_primary_dns (NetworkDevice *dev)
528
g_return_val_if_fail (dev != NULL, NULL);
530
return (dev->primary_dns);
533
void network_device_set_primary_dns (NetworkDevice *dev, const char *dns)
535
g_return_if_fail (dev != NULL);
537
if (dev->primary_dns)
538
g_free (dev->primary_dns);
539
dev->primary_dns = dns ? g_strdup (dns) : NULL;
543
* Accessors for secondary DNS
545
const char *network_device_get_secondary_dns (NetworkDevice *dev)
547
g_return_val_if_fail (dev != NULL, NULL);
549
return (dev->secondary_dns);
552
void network_device_set_secondary_dns (NetworkDevice *dev, const char *dns)
554
g_return_if_fail (dev != NULL);
556
if (dev->secondary_dns)
557
g_free (dev->secondary_dns);
558
dev->secondary_dns = dns ? g_strdup (dns) : NULL;
562
* Accessors for device capabilities
564
guint32 network_device_get_capabilities (NetworkDevice *dev)
566
g_return_val_if_fail (dev != NULL, NM_DEVICE_CAP_NONE);
571
void network_device_set_capabilities (NetworkDevice *dev, guint32 caps)
573
g_return_if_fail (dev != NULL);
579
* Accessors for type-specific device capabilities
581
guint32 network_device_get_type_capabilities (NetworkDevice *dev)
583
g_return_val_if_fail (dev != NULL, NM_DEVICE_CAP_NONE);
585
return dev->type_caps;
588
void network_device_set_type_capabilities (NetworkDevice *dev, guint32 type_caps)
590
g_return_if_fail (dev != NULL);
592
dev->type_caps = type_caps;
596
* Accessors for NM object path
598
const char *network_device_get_nm_path (NetworkDevice *dev)
600
g_return_val_if_fail (dev != NULL, NULL);
602
return (dev->nm_path);
606
* Accessors for device type
608
NMDeviceType network_device_get_type (NetworkDevice *dev)
610
g_return_val_if_fail (dev != NULL, DEVICE_TYPE_UNKNOWN);
616
* Accessors for strength
618
gint network_device_get_strength (NetworkDevice *dev)
620
g_return_val_if_fail (dev != NULL, -1);
621
g_return_val_if_fail (dev->type == DEVICE_TYPE_802_11_WIRELESS, -1);
623
return (dev->strength);
626
void network_device_set_strength (NetworkDevice *dev, gint strength)
628
g_return_if_fail (dev != NULL);
629
g_return_if_fail (dev->type == DEVICE_TYPE_802_11_WIRELESS);
631
dev->strength = strength;
635
* Accessors for device's interface name
637
const char *network_device_get_iface (NetworkDevice *dev)
639
g_return_val_if_fail (dev != NULL, NULL);
645
* Accessors for HAL udi
647
const char *network_device_get_hal_udi (NetworkDevice *dev)
649
g_return_val_if_fail (dev != NULL, NULL);
654
void network_device_set_hal_udi (NetworkDevice *dev, const char *hal_udi)
656
g_return_if_fail (dev != NULL);
664
dev->udi = g_strdup (hal_udi);
670
gboolean network_device_get_link (NetworkDevice *dev)
672
g_return_val_if_fail (dev != NULL, FALSE);
677
void network_device_set_link (NetworkDevice *dev, gboolean new_link)
679
g_return_if_fail (dev != NULL);
681
dev->link = new_link;
685
* Accessors for speed (in Mb/s)
687
int network_device_get_speed (NetworkDevice *dev)
689
g_return_val_if_fail (dev != NULL, FALSE);
694
void network_device_set_speed (NetworkDevice *dev, int speed)
696
g_return_if_fail (dev != NULL);
702
* Accessors for active
704
gboolean network_device_get_active (NetworkDevice *dev)
706
g_return_val_if_fail (dev != NULL, FALSE);
708
return (dev->active);
711
void network_device_set_active (NetworkDevice *dev, gboolean active)
713
g_return_if_fail (dev != NULL);
715
dev->active = active;
721
const char *network_device_get_desc (NetworkDevice *dev)
723
g_return_val_if_fail (dev != NULL, NULL);
728
void network_device_set_desc (NetworkDevice *dev, const char *desc)
730
g_return_if_fail (dev != NULL);
738
dev->desc = g_strdup (desc);
742
* Accessors for activation stage
744
NMActStage network_device_get_act_stage (NetworkDevice *dev)
746
g_return_val_if_fail (dev != NULL, FALSE);
748
return (dev->act_stage);
751
void network_device_set_act_stage (NetworkDevice *dev, NMActStage act_stage)
753
g_return_if_fail (dev != NULL);
755
dev->act_stage = act_stage;