NetworkManager r4271 - in trunk: . src
- From: dcbw svn gnome org
- To: svn-commits-list gnome org
- Subject: NetworkManager r4271 - in trunk: . src
- Date: Thu, 6 Nov 2008 04:04:52 +0000 (UTC)
Author: dcbw
Date: Thu Nov 6 04:04:51 2008
New Revision: 4271
URL: http://svn.gnome.org/viewvc/NetworkManager?rev=4271&view=rev
Log:
2008-11-05 Dan Williams <dcbw redhat com>
* nm-ip4-config.c
nm-ip4-config.h
- (nm_ip4_config_compare): compare two IP4 configs
Modified:
trunk/ChangeLog
trunk/src/nm-ip4-config.c
trunk/src/nm-ip4-config.h
Modified: trunk/src/nm-ip4-config.c
==============================================================================
--- trunk/src/nm-ip4-config.c (original)
+++ trunk/src/nm-ip4-config.c Thu Nov 6 04:04:51 2008
@@ -453,6 +453,188 @@
return addr;
}
+static gboolean
+addr_slist_compare (GSList *a, GSList *b)
+{
+ GSList *iter_a, *iter_b;
+ gboolean found = FALSE;
+
+ for (iter_a = a; iter_a; iter_a = g_slist_next (iter_a)) {
+ NMIP4Address *addr_a = (NMIP4Address *) iter_a->data;
+
+ for (iter_b = b, found = FALSE; iter_b; iter_b = g_slist_next (iter_b)) {
+ NMIP4Address *addr_b = (NMIP4Address *) iter_b->data;
+
+ if (nm_ip4_address_compare (addr_a, addr_b)) {
+ found = TRUE;
+ break;
+ }
+ }
+
+ if (!found)
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static gboolean
+route_slist_compare (GSList *a, GSList *b)
+{
+ GSList *iter_a, *iter_b;
+ gboolean found = FALSE;
+
+ for (iter_a = a; iter_a; iter_a = g_slist_next (iter_a)) {
+ NMIP4Route *route_a = (NMIP4Route *) iter_a->data;
+
+ for (iter_b = b, found = FALSE; iter_b; iter_b = g_slist_next (iter_b)) {
+ NMIP4Route *route_b = (NMIP4Route *) iter_b->data;
+
+ if (nm_ip4_route_compare (route_a, route_b)) {
+ found = TRUE;
+ break;
+ }
+ }
+
+ if (!found)
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static gboolean
+string_array_compare (GPtrArray *a, GPtrArray *b)
+{
+ int i, j;
+ gboolean found = FALSE;
+
+ for (i = 0; i < a->len; i++) {
+ for (j = 0, found = FALSE; j < b->len; j++) {
+ const char *item_a = g_ptr_array_index (a, i);
+ const char *item_b = g_ptr_array_index (b, j);
+
+ if ((!item_a && !item_b) || (item_a && item_b && !strcmp (item_a, item_b))) {
+ found = TRUE;
+ break;
+ }
+ }
+
+ if (!found)
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static gboolean
+addr_array_compare (GArray *a, GArray *b)
+{
+ int i, j;
+ gboolean found = FALSE;
+
+ for (i = 0; i < a->len; i++) {
+ for (j = 0, found = FALSE; j < b->len; j++) {
+ if (g_array_index (a, guint32, i) == g_array_index (b, guint32, j)) {
+ found = TRUE;
+ break;
+ }
+ }
+
+ if (!found)
+ return FALSE;
+ }
+ return TRUE;
+}
+
+gboolean
+nm_ip4_config_compare (NMIP4Config *a,
+ NMIP4Config *b,
+ NMIP4ConfigCompareFlags flags)
+{
+ NMIP4ConfigPrivate *a_priv = NM_IP4_CONFIG_GET_PRIVATE (a);
+ NMIP4ConfigPrivate *b_priv = NM_IP4_CONFIG_GET_PRIVATE (b);
+
+ g_return_val_if_fail (NM_IS_IP4_CONFIG (a), FALSE);
+ g_return_val_if_fail (NM_IS_IP4_CONFIG (b), FALSE);
+
+ if (flags == NM_IP4_COMPARE_FLAG_EXACT)
+ flags = 0xFFFFFFFF;
+
+ if (flags & NM_IP4_COMPARE_FLAG_ADDRESSES) {
+ /* Ensure all A exist in B */
+ if (!addr_slist_compare (a_priv->addresses, b_priv->addresses))
+ return FALSE;
+
+ /* Ensure all B exist in A */
+ if (!addr_slist_compare (b_priv->addresses, a_priv->addresses))
+ return FALSE;
+ }
+
+ if (flags & NM_IP4_COMPARE_FLAG_PTP_ADDRESS) {
+ if (a_priv->ptp_address != b_priv->ptp_address)
+ return FALSE;
+ }
+
+ if (flags & NM_IP4_COMPARE_FLAG_NAMESERVERS) {
+ if (a_priv->nameservers->len != b_priv->nameservers->len) /* Shortcut */
+ return FALSE;
+
+ /* Ensure all A exist in B */
+ if (!addr_array_compare (a_priv->nameservers, b_priv->nameservers))
+ return FALSE;
+
+ /* Ensure all B exist in A */
+ if (!addr_array_compare (b_priv->nameservers, a_priv->nameservers))
+ return FALSE;
+ }
+
+ if (flags & NM_IP4_COMPARE_FLAG_ROUTES) {
+ /* Ensure all A exist in B */
+ if (!route_slist_compare (a_priv->routes, b_priv->routes))
+ return FALSE;
+
+ /* Ensure all B exist in A */
+ if (!route_slist_compare (b_priv->routes, a_priv->routes))
+ return FALSE;
+ }
+
+ if (flags & NM_IP4_COMPARE_FLAG_DOMAINS) {
+ if (a_priv->domains->len != b_priv->domains->len) /* Shortcut */
+ return FALSE;
+
+ /* Ensure all A exist in B */
+ if (!string_array_compare (a_priv->domains, b_priv->domains))
+ return FALSE;
+
+ /* Ensure all B exist in A */
+ if (!string_array_compare (b_priv->domains, a_priv->domains))
+ return FALSE;
+ }
+
+ if (flags & NM_IP4_COMPARE_FLAG_SEARCHES) {
+ if (a_priv->searches->len != b_priv->searches->len) /* Shortcut */
+ return FALSE;
+
+ /* Ensure all A exist in B */
+ if (!string_array_compare (a_priv->searches, b_priv->searches))
+ return FALSE;
+
+ /* Ensure all B exist in A */
+ if (!string_array_compare (b_priv->searches, a_priv->searches))
+ return FALSE;
+ }
+
+ if (flags & NM_IP4_COMPARE_FLAG_MTU) {
+ if (a_priv->mtu != b_priv->mtu)
+ return FALSE;
+ }
+
+ if (flags & NM_IP4_COMPARE_FLAG_MSS) {
+ if (a_priv->mss != b_priv->mss)
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
static void
nm_ip4_config_init (NMIP4Config *config)
{
Modified: trunk/src/nm-ip4-config.h
==============================================================================
--- trunk/src/nm-ip4-config.h (original)
+++ trunk/src/nm-ip4-config.h Thu Nov 6 04:04:51 2008
@@ -101,4 +101,18 @@
struct rtnl_addr *nm_ip4_config_to_rtnl_addr (NMIP4Config *config, guint32 i, guint32 flags);
+typedef enum {
+ NM_IP4_COMPARE_FLAG_EXACT = 0x00000000, /* match exactly */
+ NM_IP4_COMPARE_FLAG_ADDRESSES = 0x00000001,
+ NM_IP4_COMPARE_FLAG_PTP_ADDRESS = 0x00000002,
+ NM_IP4_COMPARE_FLAG_NAMESERVERS = 0x00000004,
+ NM_IP4_COMPARE_FLAG_ROUTES = 0x00000008,
+ NM_IP4_COMPARE_FLAG_DOMAINS = 0x00000010,
+ NM_IP4_COMPARE_FLAG_SEARCHES = 0x00000020,
+ NM_IP4_COMPARE_FLAG_MTU = 0x00000040,
+ NM_IP4_COMPARE_FLAG_MSS = 0x00000080
+} NMIP4ConfigCompareFlags;
+
+gboolean nm_ip4_config_compare (NMIP4Config *a, NMIP4Config *b, NMIP4ConfigCompareFlags flags);
+
#endif /* NM_IP4_CONFIG_H */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]