Staging: batman-adv: receive packets directly using skbs
[firefly-linux-kernel-4.4.55.git] / drivers / staging / batman-adv / aggregation.c
index 9c6e681f6fb65bc319944dcd3ea5d467bf0f9786..7917322a7e2a2c170675cb2cc08db2db2e24d081 100644 (file)
@@ -96,6 +96,7 @@ static void new_aggregated_packet(unsigned char *packet_buff,
                           int own_packet)
 {
        struct forw_packet *forw_packet_aggr;
+       unsigned long flags;
 
        forw_packet_aggr = kmalloc(sizeof(struct forw_packet), GFP_ATOMIC);
        if (!forw_packet_aggr)
@@ -115,6 +116,7 @@ static void new_aggregated_packet(unsigned char *packet_buff,
               packet_buff,
               forw_packet_aggr->packet_len);
 
+       forw_packet_aggr->skb = NULL;
        forw_packet_aggr->own = own_packet;
        forw_packet_aggr->if_incoming = if_incoming;
        forw_packet_aggr->num_packets = 0;
@@ -126,9 +128,9 @@ static void new_aggregated_packet(unsigned char *packet_buff,
                forw_packet_aggr->direct_link_flags |= 1;
 
        /* add new packet to packet list */
-       spin_lock(&forw_bat_list_lock);
+       spin_lock_irqsave(&forw_bat_list_lock, flags);
        hlist_add_head(&forw_packet_aggr->list, &forw_bat_list);
-       spin_unlock(&forw_bat_list_lock);
+       spin_unlock_irqrestore(&forw_bat_list_lock, flags);
 
        /* start timer for this packet */
        INIT_DELAYED_WORK(&forw_packet_aggr->delayed_work,
@@ -168,9 +170,10 @@ void add_bat_packet_to_list(unsigned char *packet_buff, int packet_len,
        struct batman_packet *batman_packet =
                (struct batman_packet *)packet_buff;
        bool direct_link = batman_packet->flags & DIRECTLINK ? 1 : 0;
+       unsigned long flags;
 
        /* find position for the packet in the forward queue */
-       spin_lock(&forw_bat_list_lock);
+       spin_lock_irqsave(&forw_bat_list_lock, flags);
        /* own packets are not to be aggregated */
        if ((atomic_read(&aggregation_enabled)) && (!own_packet)) {
                hlist_for_each_entry(forw_packet_pos, tmp_node, &forw_bat_list,
@@ -191,7 +194,7 @@ void add_bat_packet_to_list(unsigned char *packet_buff, int packet_len,
         * suitable aggregation packet found */
        if (forw_packet_aggr == NULL) {
                /* the following section can run without the lock */
-               spin_unlock(&forw_bat_list_lock);
+               spin_unlock_irqrestore(&forw_bat_list_lock, flags);
                new_aggregated_packet(packet_buff, packet_len,
                                      send_time, direct_link,
                                      if_incoming, own_packet);
@@ -199,7 +202,7 @@ void add_bat_packet_to_list(unsigned char *packet_buff, int packet_len,
                aggregate(forw_packet_aggr,
                          packet_buff, packet_len,
                          direct_link);
-               spin_unlock(&forw_bat_list_lock);
+               spin_unlock_irqrestore(&forw_bat_list_lock, flags);
        }
 }