]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - net/tipc/link.c
tipc: simplify the link lookup routine
[karo-tx-linux.git] / net / tipc / link.c
index 223bbc87e4514513bde73b2468d448aebc089d19..e8153f64d2d6fb3c23d7f24f42e50ee2ea019df6 100644 (file)
@@ -75,20 +75,6 @@ static const char *link_unk_evt = "Unknown link event ";
  */
 #define START_CHANGEOVER 100000u
 
-/**
- * struct tipc_link_name - deconstructed link name
- * @addr_local: network address of node at this end
- * @if_local: name of interface at this end
- * @addr_peer: network address of node at far end
- * @if_peer: name of interface at far end
- */
-struct tipc_link_name {
-       u32 addr_local;
-       char if_local[TIPC_MAX_IF_NAME];
-       u32 addr_peer;
-       char if_peer[TIPC_MAX_IF_NAME];
-};
-
 static void link_handle_out_of_seq_msg(struct tipc_link *l_ptr,
                                       struct sk_buff *buf);
 static void link_recv_proto_msg(struct tipc_link *l_ptr, struct sk_buff *buf);
@@ -159,72 +145,6 @@ int tipc_link_is_active(struct tipc_link *l_ptr)
                (l_ptr->owner->active_links[1] == l_ptr);
 }
 
-/**
- * link_name_validate - validate & (optionally) deconstruct tipc_link name
- * @name: ptr to link name string
- * @name_parts: ptr to area for link name components (or NULL if not needed)
- *
- * Returns 1 if link name is valid, otherwise 0.
- */
-static int link_name_validate(const char *name,
-                               struct tipc_link_name *name_parts)
-{
-       char name_copy[TIPC_MAX_LINK_NAME];
-       char *addr_local;
-       char *if_local;
-       char *addr_peer;
-       char *if_peer;
-       char dummy;
-       u32 z_local, c_local, n_local;
-       u32 z_peer, c_peer, n_peer;
-       u32 if_local_len;
-       u32 if_peer_len;
-
-       /* copy link name & ensure length is OK */
-       name_copy[TIPC_MAX_LINK_NAME - 1] = 0;
-       /* need above in case non-Posix strncpy() doesn't pad with nulls */
-       strncpy(name_copy, name, TIPC_MAX_LINK_NAME);
-       if (name_copy[TIPC_MAX_LINK_NAME - 1] != 0)
-               return 0;
-
-       /* ensure all component parts of link name are present */
-       addr_local = name_copy;
-       if_local = strchr(addr_local, ':');
-       if (if_local == NULL)
-               return 0;
-       *(if_local++) = 0;
-       addr_peer = strchr(if_local, '-');
-       if (addr_peer == NULL)
-               return 0;
-       *(addr_peer++) = 0;
-       if_local_len = addr_peer - if_local;
-       if_peer = strchr(addr_peer, ':');
-       if (if_peer == NULL)
-               return 0;
-       *(if_peer++) = 0;
-       if_peer_len = strlen(if_peer) + 1;
-
-       /* validate component parts of link name */
-       if ((sscanf(addr_local, "%u.%u.%u%c",
-                   &z_local, &c_local, &n_local, &dummy) != 3) ||
-           (sscanf(addr_peer, "%u.%u.%u%c",
-                   &z_peer, &c_peer, &n_peer, &dummy) != 3) ||
-           (z_local > 255) || (c_local > 4095) || (n_local > 4095) ||
-           (z_peer  > 255) || (c_peer  > 4095) || (n_peer  > 4095) ||
-           (if_local_len <= 1) || (if_local_len > TIPC_MAX_IF_NAME) ||
-           (if_peer_len  <= 1) || (if_peer_len  > TIPC_MAX_IF_NAME))
-               return 0;
-
-       /* return link name components, if necessary */
-       if (name_parts) {
-               name_parts->addr_local = tipc_addr(z_local, c_local, n_local);
-               strcpy(name_parts->if_local, if_local);
-               name_parts->addr_peer = tipc_addr(z_peer, c_peer, n_peer);
-               strcpy(name_parts->if_peer, if_peer);
-       }
-       return 1;
-}
-
 /**
  * link_timeout - handle expiration of link timer
  * @l_ptr: pointer to link
@@ -2580,25 +2500,21 @@ void tipc_link_set_queue_limits(struct tipc_link *l_ptr, u32 window)
 static struct tipc_link *link_find_link(const char *name,
                                        struct tipc_node **node)
 {
-       struct tipc_link_name link_name_parts;
-       struct tipc_bearer *b_ptr;
        struct tipc_link *l_ptr;
+       struct tipc_node *n_ptr;
+       int i;
 
-       if (!link_name_validate(name, &link_name_parts))
-               return NULL;
-
-       b_ptr = tipc_bearer_find_interface(link_name_parts.if_local);
-       if (!b_ptr)
-               return NULL;
-
-       *node = tipc_node_find(link_name_parts.addr_peer);
-       if (!*node)
-               return NULL;
-
-       l_ptr = (*node)->links[b_ptr->identity];
-       if (!l_ptr || strcmp(l_ptr->name, name))
-               return NULL;
-
+       list_for_each_entry(n_ptr, &tipc_node_list, list) {
+               for (i = 0; i < MAX_BEARERS; i++) {
+                       l_ptr = n_ptr->links[i];
+                       if (l_ptr && !strcmp(l_ptr->name, name))
+                               goto found;
+               }
+       }
+       l_ptr = NULL;
+       n_ptr = NULL;
+found:
+       *node = n_ptr;
        return l_ptr;
 }