From a64c64d1e946a38c4f3b0c1eb245f7236b6bdecf Mon Sep 17 00:00:00 2001 From: Sven Eckelmann Date: Thu, 1 Sep 2011 22:28:59 +0200 Subject: [PATCH] Revert "batman-adv: improved gateway tq-based selection" This reverts commit 17852faeb269bc72f6ff542e21c0b3056fb99c48. Signed-off-by: Sven Eckelmann --- gateway_client.c | 94 +---------------------------------------------------- gateway_client.h | 3 +- main.h | 3 +- soft-interface.c | 10 +---- 4 files changed, 6 insertions(+), 104 deletions(-) diff --git a/gateway_client.c b/gateway_client.c index 056180e..7c3e60f 100644 --- a/gateway_client.c +++ b/gateway_client.c @@ -25,17 +25,11 @@ #include "gateway_common.h" #include "hard-interface.h" #include "originator.h" -#include "routing.h" #include #include #include #include -/* This is the offset of the options field in a dhcp packet starting at - * the beginning of the dhcp header */ -#define DHCP_OPTIONS_OFFSET 240 -#define DHCP_REQUEST 3 - static void gw_node_free_ref(struct gw_node *gw_node) { if (atomic_dec_and_test(&gw_node->refcount)) @@ -514,75 +508,14 @@ out: return ret; } -static bool is_type_dhcprequest(struct sk_buff *skb, int header_len) -{ - int ret = false; - unsigned char *p; - int pkt_len; - - if (skb_linearize(skb) < 0) - goto out; - - pkt_len = skb_headlen(skb); - - if (pkt_len < header_len + DHCP_OPTIONS_OFFSET + 1) - goto out; - - p = skb->data + header_len + DHCP_OPTIONS_OFFSET; - pkt_len -= header_len + DHCP_OPTIONS_OFFSET + 1; - - /* Access the dhcp option lists. Each entry is made up by: - * - octect 1: option type - * - octect 2: option data len (only if type != 255 and 0) - * - octect 3: option data */ - while (*p != 255 && !ret) { - /* p now points to the first octect: option type */ - if (*p == 53) { - /* type 53 is the message type option. - * Jump the len octect and go to the data octect */ - if (pkt_len < 2) - goto out; - p += 2; - - /* check if the message type is what we need */ - if (*p == DHCP_REQUEST) - ret = true; - break; - } else if (*p == 0) { - /* option type 0 (padding), just go forward */ - if (pkt_len < 1) - goto out; - pkt_len--; - p++; - } else { - /* This is any other option. So we get the length... */ - if (pkt_len < 1) - goto out; - pkt_len--; - p++; - - /* ...and then we jump over the data */ - if (pkt_len < *p) - goto out; - pkt_len -= *p; - p += (*p); - } - } -out: - return ret; -} - -int gw_is_target(struct bat_priv *bat_priv, struct sk_buff *skb, - struct orig_node *old_gw) +int gw_is_target(struct bat_priv *bat_priv, struct sk_buff *skb) { struct ethhdr *ethhdr; struct iphdr *iphdr; struct ipv6hdr *ipv6hdr; struct udphdr *udphdr; struct gw_node *curr_gw; - struct neigh_node *neigh_curr = NULL, *neigh_old = NULL; unsigned int header_len = 0; - int ret = 1; if (atomic_read(&bat_priv->gw_mode) == GW_MODE_OFF) return 0; @@ -650,30 +583,7 @@ int gw_is_target(struct bat_priv *bat_priv, struct sk_buff *skb, if (!curr_gw) return 0; - /* If old_gw != NULL then this packet is unicast. - * So, at this point we have to check the message type: if it is a - * DHCPREQUEST we have to decide whether to drop it or not */ - if (old_gw && curr_gw->orig_node != old_gw) { - if (is_type_dhcprequest(skb, header_len)) { - /* If the dhcp packet has been sent to a different gw, - * we have to evaluate whether the old gw is still - * reliable enough */ - neigh_curr = find_router(bat_priv, curr_gw->orig_node, - NULL); - neigh_old = find_router(bat_priv, old_gw, NULL); - if (!neigh_curr || !neigh_old) - goto free_neigh; - if (neigh_curr->tq_avg - neigh_old->tq_avg < - GW_THRESHOLD) - ret = -1; - } - } -free_neigh: - if (neigh_old) - neigh_node_free_ref(neigh_old); - if (neigh_curr) - neigh_node_free_ref(neigh_curr); if (curr_gw) gw_node_free_ref(curr_gw); - return ret; + return 1; } diff --git a/gateway_client.h b/gateway_client.h index b9b983c..1ce8c60 100644 --- a/gateway_client.h +++ b/gateway_client.h @@ -31,7 +31,6 @@ void gw_node_update(struct bat_priv *bat_priv, void gw_node_delete(struct bat_priv *bat_priv, struct orig_node *orig_node); void gw_node_purge(struct bat_priv *bat_priv); int gw_client_seq_print_text(struct seq_file *seq, void *offset); -int gw_is_target(struct bat_priv *bat_priv, struct sk_buff *skb, - struct orig_node *old_gw); +int gw_is_target(struct bat_priv *bat_priv, struct sk_buff *skb); #endif /* _NET_BATMAN_ADV_GATEWAY_CLIENT_H_ */ diff --git a/main.h b/main.h index 9ee8023..f527caa 100644 --- a/main.h +++ b/main.h @@ -92,6 +92,7 @@ enum mesh_state { #define BCAST_QUEUE_LEN 256 #define BATMAN_QUEUE_LEN 256 + enum uev_action { UEV_ADD = 0, UEV_DEL, @@ -102,8 +103,6 @@ enum uev_type { UEV_GW = 0 }; -#define GW_THRESHOLD 50 - /* * Debug Messages */ diff --git a/soft-interface.c b/soft-interface.c index 3e2f91f..e601786 100644 --- a/soft-interface.c +++ b/soft-interface.c @@ -30,7 +30,6 @@ #include "gateway_common.h" #include "gateway_client.h" #include "bat_sysfs.h" -#include "originator.h" #include #include #include @@ -562,7 +561,6 @@ static int interface_tx(struct sk_buff *skb, struct net_device *soft_iface) struct bcast_packet *bcast_packet; struct vlan_ethhdr *vhdr; struct softif_neigh *curr_softif_neigh = NULL; - struct orig_node *orig_node = NULL; int data_len = skb->len, ret; short vid = -1; bool do_bcast = false; @@ -597,10 +595,8 @@ static int interface_tx(struct sk_buff *skb, struct net_device *soft_iface) /* Register the client MAC in the transtable */ tt_local_add(soft_iface, ethhdr->h_source); - orig_node = transtable_search(bat_priv, ethhdr->h_dest); - if (is_multicast_ether_addr(ethhdr->h_dest) || - (orig_node && orig_node->gw_flags)) { - ret = gw_is_target(bat_priv, skb, orig_node); + if (is_multicast_ether_addr(ethhdr->h_dest)) { + ret = gw_is_target(bat_priv, skb); if (ret < 0) goto dropped; @@ -660,8 +656,6 @@ end: softif_neigh_free_ref(curr_softif_neigh); if (primary_if) hardif_free_ref(primary_if); - if (orig_node) - orig_node_free_ref(orig_node); return NETDEV_TX_OK; } -- 1.7.2.5