lkml.org 
[lkml]   [2020]   [May]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    Subject[PATCH] staging: rtl8192u: Merge almost duplicate code
    From
    This causes a change in behaviour:
    - stats also get updated when reordering, this seems like it should be
    the case but those lines were commented out.
    - sub_skb NULL check now happens early in both cases, previously it
    happened only after dereferencing it 12 times, so it may not actually
    be needed.

    Signed-off-by: Pascal Terjan <pterjan@google.com>
    ---
    .../staging/rtl8192u/ieee80211/ieee80211_rx.c | 126 +++++++-----------
    1 file changed, 49 insertions(+), 77 deletions(-)

    diff --git a/drivers/staging/rtl8192u/ieee80211/ieee80211_rx.c b/drivers/staging/rtl8192u/ieee80211/ieee80211_rx.c
    index e101f7b13c7e..3309f64be4c9 100644
    --- a/drivers/staging/rtl8192u/ieee80211/ieee80211_rx.c
    +++ b/drivers/staging/rtl8192u/ieee80211/ieee80211_rx.c
    @@ -520,55 +520,67 @@ static bool AddReorderEntry(struct rx_ts_record *pTS, struct rx_reorder_entry *p
    return true;
    }

    -void ieee80211_indicate_packets(struct ieee80211_device *ieee, struct ieee80211_rxb **prxbIndicateArray, u8 index)
    +void indicate_packets(struct ieee80211_device *ieee, struct ieee80211_rxb *rxb)
    {
    - u8 i = 0, j = 0;
    + struct net_device_stats *stats = &ieee->stats;
    + struct net_device *dev = ieee->dev;
    u16 ethertype;
    -// if(index > 1)
    -// IEEE80211_DEBUG(IEEE80211_DL_REORDER,"%s(): hahahahhhh, We indicate packet from reorder list, index is %u\n",__func__,index);
    - for (j = 0; j < index; j++) {
    -//added by amy for reorder
    - struct ieee80211_rxb *prxb = prxbIndicateArray[j];
    - for (i = 0; i < prxb->nr_subframes; i++) {
    - struct sk_buff *sub_skb = prxb->subframes[i];
    + u8 i;
    +
    + for (i = 0; i < rxb->nr_subframes; i++) {
    + struct sk_buff *sub_skb = rxb->subframes[i];
    +
    + if (!sub_skb)
    + continue;

    /* convert hdr + possible LLC headers into Ethernet header */
    - ethertype = (sub_skb->data[6] << 8) | sub_skb->data[7];
    - if (sub_skb->len >= 8 &&
    - ((memcmp(sub_skb->data, rfc1042_header, SNAP_SIZE) == 0 &&
    - ethertype != ETH_P_AARP && ethertype != ETH_P_IPX) ||
    - memcmp(sub_skb->data, bridge_tunnel_header, SNAP_SIZE) == 0)) {
    + ethertype = (sub_skb->data[6] << 8) | sub_skb->data[7];
    + if (sub_skb->len >= 8 &&
    + ((!memcmp(sub_skb->data, rfc1042_header, SNAP_SIZE) &&
    + ethertype != ETH_P_AARP &&
    + ethertype != ETH_P_IPX) ||
    + !memcmp(sub_skb->data, bridge_tunnel_header, SNAP_SIZE))) {
    /* remove RFC1042 or Bridge-Tunnel encapsulation and
    * replace EtherType */
    - skb_pull(sub_skb, SNAP_SIZE);
    - memcpy(skb_push(sub_skb, ETH_ALEN), prxb->src, ETH_ALEN);
    - memcpy(skb_push(sub_skb, ETH_ALEN), prxb->dst, ETH_ALEN);
    - } else {
    + skb_pull(sub_skb, SNAP_SIZE);
    + } else {
    /* Leave Ethernet header part of hdr and full payload */
    - put_unaligned_be16(sub_skb->len, skb_push(sub_skb, 2));
    - memcpy(skb_push(sub_skb, ETH_ALEN), prxb->src, ETH_ALEN);
    - memcpy(skb_push(sub_skb, ETH_ALEN), prxb->dst, ETH_ALEN);
    - }
    - //stats->rx_packets++;
    - //stats->rx_bytes += sub_skb->len;
    + put_unaligned_be16(sub_skb->len, skb_push(sub_skb, 2));
    + }
    + memcpy(skb_push(sub_skb, ETH_ALEN), rxb->src, ETH_ALEN);
    + memcpy(skb_push(sub_skb, ETH_ALEN), rxb->dst, ETH_ALEN);
    +
    + stats->rx_packets++;
    + stats->rx_bytes += sub_skb->len;
    + if (is_multicast_ether_addr(rxb->dst))
    + stats->multicast++;

    /* Indicate the packets to upper layer */
    - if (sub_skb) {
    - sub_skb->protocol = eth_type_trans(sub_skb, ieee->dev);
    - memset(sub_skb->cb, 0, sizeof(sub_skb->cb));
    - sub_skb->dev = ieee->dev;
    - sub_skb->ip_summed = CHECKSUM_NONE; /* 802.11 crc not sufficient */
    - //skb->ip_summed = CHECKSUM_UNNECESSARY; /* 802.11 crc not sufficient */
    - ieee->last_rx_ps_time = jiffies;
    - netif_rx(sub_skb);
    - }
    - }
    + sub_skb->protocol = eth_type_trans(sub_skb, dev);
    + memset(sub_skb->cb, 0, sizeof(sub_skb->cb));
    + sub_skb->dev = dev;
    + /* 802.11 crc not sufficient */
    + sub_skb->ip_summed = CHECKSUM_NONE;
    + ieee->last_rx_ps_time = jiffies;
    + netif_rx(sub_skb);
    + }
    +}
    +
    +void ieee80211_indicate_packets(struct ieee80211_device *ieee,
    + struct ieee80211_rxb **prxbIndicateArray,
    + u8 index)
    +{
    + u8 i;
    +
    + for (i = 0; i < index; i++) {
    + struct ieee80211_rxb *prxb = prxbIndicateArray[i];
    +
    + indicate_packets(ieee, prxb);
    kfree(prxb);
    prxb = NULL;
    }
    }

    -
    static void RxReorderIndicatePacket(struct ieee80211_device *ieee,
    struct ieee80211_rxb *prxb,
    struct rx_ts_record *pTS, u16 SeqNum)
    @@ -721,6 +733,7 @@ static void RxReorderIndicatePacket(struct ieee80211_device *ieee,

    /* Handling pending timer. Set this timer to prevent from long time Rx buffering.*/
    if (index > 0) {
    + u8 i;
    // Cancel previous pending timer.
    // del_timer_sync(&pTS->rx_pkt_pending_timer);
    pTS->rx_timeout_indicate_seq = 0xffff;
    @@ -877,7 +890,6 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
    u16 fc, type, stype, sc;
    struct net_device_stats *stats;
    unsigned int frag;
    - u16 ethertype;
    //added by amy for reorder
    u8 TID = 0;
    u16 SeqNum = 0;
    @@ -1260,47 +1272,7 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,

    //added by amy for reorder
    if (!ieee->pHTInfo->bCurRxReorderEnable || !pTS) {
    -//added by amy for reorder
    - for (i = 0; i < rxb->nr_subframes; i++) {
    - struct sk_buff *sub_skb = rxb->subframes[i];
    -
    - if (sub_skb) {
    - /* convert hdr + possible LLC headers into Ethernet header */
    - ethertype = (sub_skb->data[6] << 8) | sub_skb->data[7];
    - if (sub_skb->len >= 8 &&
    - ((memcmp(sub_skb->data, rfc1042_header, SNAP_SIZE) == 0 &&
    - ethertype != ETH_P_AARP && ethertype != ETH_P_IPX) ||
    - memcmp(sub_skb->data, bridge_tunnel_header, SNAP_SIZE) == 0)) {
    - /* remove RFC1042 or Bridge-Tunnel encapsulation and
    - * replace EtherType */
    - skb_pull(sub_skb, SNAP_SIZE);
    - memcpy(skb_push(sub_skb, ETH_ALEN), src, ETH_ALEN);
    - memcpy(skb_push(sub_skb, ETH_ALEN), dst, ETH_ALEN);
    - } else {
    - u16 len;
    - /* Leave Ethernet header part of hdr and full payload */
    - len = be16_to_cpu(htons(sub_skb->len));
    - memcpy(skb_push(sub_skb, 2), &len, 2);
    - memcpy(skb_push(sub_skb, ETH_ALEN), src, ETH_ALEN);
    - memcpy(skb_push(sub_skb, ETH_ALEN), dst, ETH_ALEN);
    - }
    -
    - stats->rx_packets++;
    - stats->rx_bytes += sub_skb->len;
    - if (is_multicast_ether_addr(dst)) {
    - stats->multicast++;
    - }
    -
    - /* Indicate the packets to upper layer */
    - sub_skb->protocol = eth_type_trans(sub_skb, dev);
    - memset(sub_skb->cb, 0, sizeof(sub_skb->cb));
    - sub_skb->dev = dev;
    - sub_skb->ip_summed = CHECKSUM_NONE; /* 802.11 crc not sufficient */
    - //skb->ip_summed = CHECKSUM_UNNECESSARY; /* 802.11 crc not sufficient */
    - ieee->last_rx_ps_time = jiffies;
    - netif_rx(sub_skb);
    - }
    - }
    + indicate_packets(ieee, rxb);
    kfree(rxb);
    rxb = NULL;

    --
    2.26.2.761.g0e0b3e54be-goog
    \
     
     \ /
      Last update: 2020-05-17 18:59    [W:3.558 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site