Commit 39901e71 authored by Marek Lindner's avatar Marek Lindner
Browse files

batman-adv: separate ethernet comparing calls from hash functions



Note: The function compare_ether_addr() provided by the Linux kernel
requires aligned memory.

Signed-off-by: default avatarMarek Lindner <lindner_marek@yahoo.de>
parent 9e0b33c2
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -187,7 +187,7 @@ static void check_known_mac_addr(struct net_device *net_dev)
		if (batman_if->net_dev == net_dev)
			continue;

		if (!compare_orig(batman_if->net_dev->dev_addr,
		if (!compare_eth(batman_if->net_dev->dev_addr,
				  net_dev->dev_addr))
			continue;

+1 −1
Original line number Diff line number Diff line
@@ -161,7 +161,7 @@ int is_my_mac(uint8_t *addr)
		if (batman_if->if_status != IF_ACTIVE)
			continue;

		if (compare_orig(batman_if->net_dev->dev_addr, addr)) {
		if (compare_eth(batman_if->net_dev->dev_addr, addr)) {
			rcu_read_unlock();
			return 1;
		}
+10 −0
Original line number Diff line number Diff line
@@ -165,4 +165,14 @@ static inline void bat_dbg(char type __always_unused,
		pr_err("%s: " fmt, _netdev->name, ## arg);		\
	} while (0)

/**
 * returns 1 if they are the same ethernet addr
 *
 * note: can't use compare_ether_addr() as it requires aligned memory
 */
static inline int compare_eth(void *data1, void *data2)
{
	return (memcmp(data1, data2, ETH_ALEN) == 0 ? 1 : 0);
}

#endif /* _NET_BATMAN_ADV_MAIN_H_ */
+27 −28
Original line number Diff line number Diff line
@@ -163,7 +163,7 @@ static int is_bidirectional_neigh(struct orig_node *orig_node,
		hlist_for_each_entry_rcu(tmp_neigh_node, node,
					 &orig_node->neigh_list, list) {

			if (compare_orig(tmp_neigh_node->addr,
			if (compare_eth(tmp_neigh_node->addr,
					orig_neigh_node->orig) &&
			    (tmp_neigh_node->if_incoming == if_incoming))
				neigh_node = tmp_neigh_node;
@@ -192,7 +192,7 @@ static int is_bidirectional_neigh(struct orig_node *orig_node,
		hlist_for_each_entry_rcu(tmp_neigh_node, node,
					 &orig_neigh_node->neigh_list, list) {

			if (compare_orig(tmp_neigh_node->addr,
			if (compare_eth(tmp_neigh_node->addr,
					orig_neigh_node->orig) &&
			    (tmp_neigh_node->if_incoming == if_incoming))
				neigh_node = tmp_neigh_node;
@@ -304,7 +304,7 @@ static void bonding_candidate_add(struct orig_node *orig_node,
	spin_lock_bh(&orig_node->neigh_list_lock);

	/* only consider if it has the same primary address ...  */
	if (!compare_orig(orig_node->orig,
	if (!compare_eth(orig_node->orig,
			 neigh_node->orig_node->primary_addr))
		goto candidate_del;

@@ -334,7 +334,7 @@ static void bonding_candidate_add(struct orig_node *orig_node,
			continue;

		if ((neigh_node->if_incoming == tmp_neigh_node->if_incoming) ||
		    (compare_orig(neigh_node->addr, tmp_neigh_node->addr))) {
		    (compare_eth(neigh_node->addr, tmp_neigh_node->addr))) {
			interference_candidate = 1;
			break;
		}
@@ -394,7 +394,7 @@ static void update_orig(struct bat_priv *bat_priv,
	rcu_read_lock();
	hlist_for_each_entry_rcu(tmp_neigh_node, node,
				 &orig_node->neigh_list, list) {
		if (compare_orig(tmp_neigh_node->addr, ethhdr->h_source) &&
		if (compare_eth(tmp_neigh_node->addr, ethhdr->h_source) &&
		    (tmp_neigh_node->if_incoming == if_incoming) &&
		     atomic_inc_not_zero(&tmp_neigh_node->refcount)) {
			if (neigh_node)
@@ -579,7 +579,7 @@ static char count_real_packets(struct ethhdr *ethhdr,
					       orig_node->last_real_seqno,
					       batman_packet->seqno);

		if (compare_orig(tmp_neigh_node->addr, ethhdr->h_source) &&
		if (compare_eth(tmp_neigh_node->addr, ethhdr->h_source) &&
		    (tmp_neigh_node->if_incoming == if_incoming))
			set_mark = 1;
		else
@@ -644,7 +644,7 @@ void receive_bat_packet(struct ethhdr *ethhdr,

	has_directlink_flag = (batman_packet->flags & DIRECTLINK ? 1 : 0);

	is_single_hop_neigh = (compare_orig(ethhdr->h_source,
	is_single_hop_neigh = (compare_eth(ethhdr->h_source,
					   batman_packet->orig) ? 1 : 0);

	bat_dbg(DBG_BATMAN, bat_priv,
@@ -665,19 +665,19 @@ void receive_bat_packet(struct ethhdr *ethhdr,
		if (batman_if->soft_iface != if_incoming->soft_iface)
			continue;

		if (compare_orig(ethhdr->h_source,
		if (compare_eth(ethhdr->h_source,
				batman_if->net_dev->dev_addr))
			is_my_addr = 1;

		if (compare_orig(batman_packet->orig,
		if (compare_eth(batman_packet->orig,
				batman_if->net_dev->dev_addr))
			is_my_orig = 1;

		if (compare_orig(batman_packet->prev_sender,
		if (compare_eth(batman_packet->prev_sender,
				batman_if->net_dev->dev_addr))
			is_my_oldorig = 1;

		if (compare_orig(ethhdr->h_source, broadcast_addr))
		if (compare_eth(ethhdr->h_source, broadcast_addr))
			is_broadcast = 1;
	}
	rcu_read_unlock();
@@ -717,7 +717,7 @@ void receive_bat_packet(struct ethhdr *ethhdr,
		/* if received seqno equals last send seqno save new
		 * seqno for bidirectional check */
		if (has_directlink_flag &&
		    compare_orig(if_incoming->net_dev->dev_addr,
		    compare_eth(if_incoming->net_dev->dev_addr,
				batman_packet->orig) &&
		    (batman_packet->seqno - if_incoming_seqno + 2 == 0)) {
			offset = if_incoming->if_num * NUM_WORDS;
@@ -765,10 +765,10 @@ void receive_bat_packet(struct ethhdr *ethhdr,
	/* avoid temporary routing loops */
	if ((orig_node->router) &&
	    (orig_node->router->orig_node->router) &&
	    (compare_orig(orig_node->router->addr,
	    (compare_eth(orig_node->router->addr,
			 batman_packet->prev_sender)) &&
	    !(compare_orig(batman_packet->orig, batman_packet->prev_sender)) &&
	    (compare_orig(orig_node->router->addr,
	    !(compare_eth(batman_packet->orig, batman_packet->prev_sender)) &&
	    (compare_eth(orig_node->router->addr,
			 orig_node->router->orig_node->router->addr))) {
		bat_dbg(DBG_BATMAN, bat_priv,
			"Drop packet: ignoring all rebroadcast packets that "
@@ -1185,14 +1185,13 @@ struct neigh_node *find_router(struct bat_priv *bat_priv,

	/* if we have something in the primary_addr, we can search
	 * for a potential bonding candidate. */
	if (memcmp(router_orig->primary_addr, zero_mac, ETH_ALEN) == 0)
	if (compare_eth(router_orig->primary_addr, zero_mac))
		goto return_router;

	/* find the orig_node which has the primary interface. might
	 * even be the same as our router_orig in many cases */

	if (memcmp(router_orig->primary_addr,
				router_orig->orig, ETH_ALEN) == 0) {
	if (compare_eth(router_orig->primary_addr, router_orig->orig)) {
		primary_orig_node = router_orig;
	} else {
		primary_orig_node = hash_find(bat_priv->orig_hash, compare_orig,
+1 −1
Original line number Diff line number Diff line
@@ -326,7 +326,7 @@ void schedule_forward_packet(struct orig_node *orig_node,
	if ((orig_node->router) && (orig_node->router->tq_avg != 0)) {

		/* rebroadcast ogm of best ranking neighbor as is */
		if (!compare_orig(orig_node->router->addr, ethhdr->h_source)) {
		if (!compare_eth(orig_node->router->addr, ethhdr->h_source)) {
			batman_packet->tq = orig_node->router->tq_avg;

			if (orig_node->router->last_ttl)
Loading