ROSE: rose AX25 packet routing improvement
authorBernard Pidoux <f6bvp@free.fr>
Mon, 14 Feb 2011 21:31:09 +0000 (13:31 -0800)
committerDavid S. Miller <davem@davemloft.net>
Mon, 14 Feb 2011 21:31:09 +0000 (13:31 -0800)
FPAC AX25 packet application is using Linux kernel ROSE
routing skills in order to connect or send packets to remote stations
knowing their ROSE address via a network of interconnected nodes.

Each FPAC node has a ROSE routing table that Linux ROSE module is
looking at each time a ROSE frame is relayed by the node or when
a connect request to a neighbor node is received.

A previous patch improved the system time response by looking at
already established routes each time the system was looking for a
route to relay a frame. If a neighbor node routing the destination
address was already connected, then the frame would be sent
through him. If not, a connection request would be issued.

The present patch extends the same routing capability to a connect
request asked by a user locally connected into an FPAC node.
Without this patch, a connect request was not well handled unless it
was directed to an immediate connected neighbor of the local node.

Implemented at a number of ROSE FPAC node stations, the present patch
improved dramatically FPAC ROSE routing time response and efficiency.

Signed-off-by: Bernard Pidoux <f6bvp@free.fr>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/rose/rose_route.c

index b4fdaac233f77ec3dbe4bd86b0f8d5bc178bb9f7..88a77e90e7e86835587aabdb17f6805377f8df82 100644 (file)
@@ -674,29 +674,34 @@ struct rose_route *rose_route_free_lci(unsigned int lci, struct rose_neigh *neig
  *     Find a neighbour or a route given a ROSE address.
  */
 struct rose_neigh *rose_get_neigh(rose_address *addr, unsigned char *cause,
-       unsigned char *diagnostic, int new)
+       unsigned char *diagnostic, int route_frame)
 {
        struct rose_neigh *res = NULL;
        struct rose_node *node;
        int failed = 0;
        int i;
 
-       if (!new) spin_lock_bh(&rose_node_list_lock);
+       if (!route_frame) spin_lock_bh(&rose_node_list_lock);
        for (node = rose_node_list; node != NULL; node = node->next) {
                if (rosecmpm(addr, &node->address, node->mask) == 0) {
                        for (i = 0; i < node->count; i++) {
-                               if (new) {
-                                       if (node->neighbour[i]->restarted) {
-                                               res = node->neighbour[i];
-                                               goto out;
-                                       }
+                               if (node->neighbour[i]->restarted) {
+                                       res = node->neighbour[i];
+                                       goto out;
                                }
-                               else {
+                       }
+               }
+       }
+       if (!route_frame) { /* connect request */
+               for (node = rose_node_list; node != NULL; node = node->next) {
+                       if (rosecmpm(addr, &node->address, node->mask) == 0) {
+                               for (i = 0; i < node->count; i++) {
                                        if (!rose_ftimer_running(node->neighbour[i])) {
                                                res = node->neighbour[i];
+                                               failed = 0;
                                                goto out;
-                                       } else
-                                               failed = 1;
+                                       }
+                                       failed = 1;
                                }
                        }
                }
@@ -711,8 +716,7 @@ struct rose_neigh *rose_get_neigh(rose_address *addr, unsigned char *cause,
        }
 
 out:
-       if (!new) spin_unlock_bh(&rose_node_list_lock);
-
+       if (!route_frame) spin_unlock_bh(&rose_node_list_lock);
        return res;
 }