Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a1f1ac5c authored by Simon Wunderlich's avatar Simon Wunderlich Committed by Antonio Quartulli
Browse files

batman-adv: reorder packet types



Reordering the packet type numbers allows us to handle unicast
packets in a general way - even if we don't know the specific packet
type, we can still forward it. There was already code handling
this for a couple of unicast packets, and this is the more
generalized version to do that.

Signed-off-by: default avatarSimon Wunderlich <siwu@hrz.tu-chemnitz.de>
Signed-off-by: default avatarMarek Lindner <lindner_marek@yahoo.de>
Signed-off-by: default avatarAntonio Quartulli <antonio@meshcoding.com>
parent 80067c83
Loading
Loading
Loading
Loading
+15 −5
Original line number Original line Diff line number Diff line
@@ -393,6 +393,9 @@ static void batadv_recv_handler_init(void)
	for (i = 0; i < ARRAY_SIZE(batadv_rx_handler); i++)
	for (i = 0; i < ARRAY_SIZE(batadv_rx_handler); i++)
		batadv_rx_handler[i] = batadv_recv_unhandled_packet;
		batadv_rx_handler[i] = batadv_recv_unhandled_packet;


	for (i = BATADV_UNICAST_MIN; i <= BATADV_UNICAST_MAX; i++)
		batadv_rx_handler[i] = batadv_recv_unhandled_unicast_packet;

	/* compile time checks for struct member offsets */
	/* compile time checks for struct member offsets */
	BUILD_BUG_ON(offsetof(struct batadv_unicast_4addr_packet, src) != 10);
	BUILD_BUG_ON(offsetof(struct batadv_unicast_4addr_packet, src) != 10);
	BUILD_BUG_ON(offsetof(struct batadv_unicast_packet, dest) != 4);
	BUILD_BUG_ON(offsetof(struct batadv_unicast_packet, dest) != 4);
@@ -401,18 +404,20 @@ static void batadv_recv_handler_init(void)
	BUILD_BUG_ON(offsetof(struct batadv_icmp_packet, dst) != 4);
	BUILD_BUG_ON(offsetof(struct batadv_icmp_packet, dst) != 4);
	BUILD_BUG_ON(offsetof(struct batadv_icmp_packet_rr, dst) != 4);
	BUILD_BUG_ON(offsetof(struct batadv_icmp_packet_rr, dst) != 4);


	/* batman icmp packet */
	/* broadcast packet */
	batadv_rx_handler[BATADV_ICMP] = batadv_recv_icmp_packet;
	batadv_rx_handler[BATADV_BCAST] = batadv_recv_bcast_packet;

	/* unicast packets ... */
	/* unicast with 4 addresses packet */
	/* unicast with 4 addresses packet */
	batadv_rx_handler[BATADV_UNICAST_4ADDR] = batadv_recv_unicast_packet;
	batadv_rx_handler[BATADV_UNICAST_4ADDR] = batadv_recv_unicast_packet;
	/* unicast packet */
	/* unicast packet */
	batadv_rx_handler[BATADV_UNICAST] = batadv_recv_unicast_packet;
	batadv_rx_handler[BATADV_UNICAST] = batadv_recv_unicast_packet;
	/* fragmented unicast packet */
	/* fragmented unicast packet */
	batadv_rx_handler[BATADV_UNICAST_FRAG] = batadv_recv_ucast_frag_packet;
	batadv_rx_handler[BATADV_UNICAST_FRAG] = batadv_recv_ucast_frag_packet;
	/* broadcast packet */
	batadv_rx_handler[BATADV_BCAST] = batadv_recv_bcast_packet;
	/* unicast tvlv packet */
	/* unicast tvlv packet */
	batadv_rx_handler[BATADV_UNICAST_TVLV] = batadv_recv_unicast_tvlv;
	batadv_rx_handler[BATADV_UNICAST_TVLV] = batadv_recv_unicast_tvlv;
	/* batman icmp packet */
	batadv_rx_handler[BATADV_ICMP] = batadv_recv_icmp_packet;
}
}


int
int
@@ -420,7 +425,12 @@ batadv_recv_handler_register(uint8_t packet_type,
			     int (*recv_handler)(struct sk_buff *,
			     int (*recv_handler)(struct sk_buff *,
						 struct batadv_hard_iface *))
						 struct batadv_hard_iface *))
{
{
	if (batadv_rx_handler[packet_type] != &batadv_recv_unhandled_packet)
	int (*curr)(struct sk_buff *,
		    struct batadv_hard_iface *);
	curr = batadv_rx_handler[packet_type];

	if ((curr != batadv_recv_unhandled_packet) &&
	    (curr != batadv_recv_unhandled_unicast_packet))
		return -EBUSY;
		return -EBUSY;


	batadv_rx_handler[packet_type] = recv_handler;
	batadv_rx_handler[packet_type] = recv_handler;
+23 −8
Original line number Original line Diff line number Diff line
@@ -22,17 +22,32 @@


/**
/**
 * enum batadv_packettype - types for batman-adv encapsulated packets
 * enum batadv_packettype - types for batman-adv encapsulated packets
 * @BATADV_IV_OGM: originator messages for B.A.T.M.A.N. IV
 * @BATADV_BCAST: broadcast packets carrying broadcast payload
 * @BATADV_CODED: network coded packets
 *
 * @BATADV_UNICAST: unicast packets carrying unicast payload traffic
 * @BATADV_UNICAST_FRAG: unicast packets carrying a fragment of the original
 *     payload packet
 * @BATADV_UNICAST_4ADDR: unicast packet including the originator address of
 *     the sender
 * @BATADV_ICMP: unicast packet like IP ICMP used for ping or traceroute
 * @BATADV_UNICAST_TVLV: unicast packet carrying TVLV containers
 * @BATADV_UNICAST_TVLV: unicast packet carrying TVLV containers
 */
 */
enum batadv_packettype {
enum batadv_packettype {
	BATADV_IV_OGM		= 0x01,
	/* 0x00 - 0x3f: local packets or special rules for handling */
	BATADV_ICMP		= 0x02,
	BATADV_IV_OGM           = 0x00,
	BATADV_UNICAST		= 0x03,
	BATADV_BCAST            = 0x01,
	BATADV_BCAST		= 0x04,
	BATADV_CODED            = 0x02,
	BATADV_UNICAST_FRAG	= 0x06,
	/* 0x40 - 0x7f: unicast */
	BATADV_UNICAST_4ADDR	= 0x09,
#define BATADV_UNICAST_MIN     0x40
	BATADV_CODED		= 0x0a,
	BATADV_UNICAST          = 0x40,
	BATADV_UNICAST_TVLV	= 0x0b,
	BATADV_UNICAST_FRAG     = 0x41,
	BATADV_UNICAST_4ADDR    = 0x42,
	BATADV_ICMP             = 0x43,
	BATADV_UNICAST_TVLV     = 0x44,
#define BATADV_UNICAST_MAX     0x7f
	/* 0x80 - 0xff: reserved */
};
};


/**
/**
+28 −0
Original line number Original line Diff line number Diff line
@@ -911,6 +911,34 @@ static int batadv_check_unicast_ttvn(struct batadv_priv *bat_priv,
	return 1;
	return 1;
}
}


/**
 * batadv_recv_unhandled_unicast_packet - receive and process packets which
 *	are in the unicast number space but not yet known to the implementation
 * @skb: unicast tvlv packet to process
 * @recv_if: pointer to interface this packet was received on
 *
 * Returns NET_RX_SUCCESS if the packet has been consumed or NET_RX_DROP
 * otherwise.
 */
int batadv_recv_unhandled_unicast_packet(struct sk_buff *skb,
					 struct batadv_hard_iface *recv_if)
{
	struct batadv_unicast_packet *unicast_packet;
	struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface);
	int check, hdr_size = sizeof(*unicast_packet);

	check = batadv_check_unicast_packet(bat_priv, skb, hdr_size);
	if (check < 0)
		return NET_RX_DROP;

	/* we don't know about this type, drop it. */
	unicast_packet = (struct batadv_unicast_packet *)skb->data;
	if (batadv_is_my_mac(bat_priv, unicast_packet->dest))
		return NET_RX_DROP;

	return batadv_route_unicast_packet(skb, recv_if);
}

int batadv_recv_unicast_packet(struct sk_buff *skb,
int batadv_recv_unicast_packet(struct sk_buff *skb,
			       struct batadv_hard_iface *recv_if)
			       struct batadv_hard_iface *recv_if)
{
{
+2 −0
Original line number Original line Diff line number Diff line
@@ -40,6 +40,8 @@ int batadv_recv_roam_adv(struct sk_buff *skb,
			 struct batadv_hard_iface *recv_if);
			 struct batadv_hard_iface *recv_if);
int batadv_recv_unicast_tvlv(struct sk_buff *skb,
int batadv_recv_unicast_tvlv(struct sk_buff *skb,
			     struct batadv_hard_iface *recv_if);
			     struct batadv_hard_iface *recv_if);
int batadv_recv_unhandled_unicast_packet(struct sk_buff *skb,
					 struct batadv_hard_iface *recv_if);
struct batadv_neigh_node *
struct batadv_neigh_node *
batadv_find_router(struct batadv_priv *bat_priv,
batadv_find_router(struct batadv_priv *bat_priv,
		   struct batadv_orig_node *orig_node,
		   struct batadv_orig_node *orig_node,