Ignore:
Timestamp:
Apr 18, 2017, 8:47:31 AM (6 weeks ago)
Author:
brainslayer
Message:

update kernels

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/linux/universal/linux-4.4/drivers/net/ethernet/ibm/ibmveth.c

    r28606 r31884  
    5959static const char ibmveth_driver_name[] = "ibmveth";
    6060static const char ibmveth_driver_string[] = "IBM Power Virtual Ethernet Driver";
    61 #define ibmveth_driver_version "1.05"
     61#define ibmveth_driver_version "1.06"
    6262
    6363MODULE_AUTHOR("Santiago Leon <santil@linux.vnet.ibm.com>");
     
    138138}
    139139
     140static inline int ibmveth_rxq_large_packet(struct ibmveth_adapter *adapter)
     141{
     142        return ibmveth_rxq_flags(adapter) & IBMVETH_RXQ_LRG_PKT;
     143}
     144
    140145static inline int ibmveth_rxq_frame_length(struct ibmveth_adapter *adapter)
    141146{
     
    11731178}
    11741179
     1180static void ibmveth_rx_mss_helper(struct sk_buff *skb, u16 mss, int lrg_pkt)
     1181{
     1182        int offset = 0;
     1183
     1184        /* only TCP packets will be aggregated */
     1185        if (skb->protocol == htons(ETH_P_IP)) {
     1186                struct iphdr *iph = (struct iphdr *)skb->data;
     1187
     1188                if (iph->protocol == IPPROTO_TCP) {
     1189                        offset = iph->ihl * 4;
     1190                        skb_shinfo(skb)->gso_type = SKB_GSO_TCPV4;
     1191                } else {
     1192                        return;
     1193                }
     1194        } else if (skb->protocol == htons(ETH_P_IPV6)) {
     1195                struct ipv6hdr *iph6 = (struct ipv6hdr *)skb->data;
     1196
     1197                if (iph6->nexthdr == IPPROTO_TCP) {
     1198                        offset = sizeof(struct ipv6hdr);
     1199                        skb_shinfo(skb)->gso_type = SKB_GSO_TCPV6;
     1200                } else {
     1201                        return;
     1202                }
     1203        } else {
     1204                return;
     1205        }
     1206        /* if mss is not set through Large Packet bit/mss in rx buffer,
     1207         * expect that the mss will be written to the tcp header checksum.
     1208         */
     1209        if (lrg_pkt) {
     1210                skb_shinfo(skb)->gso_size = mss;
     1211        } else if (offset) {
     1212                struct tcphdr *tcph = (struct tcphdr *)(skb->data + offset);
     1213
     1214                skb_shinfo(skb)->gso_size = ntohs(tcph->check);
     1215                tcph->check = 0;
     1216        }
     1217}
     1218
    11751219static int ibmveth_poll(struct napi_struct *napi, int budget)
    11761220{
     
    11811225        unsigned long lpar_rc;
    11821226        struct iphdr *iph;
     1227        u16 mss = 0;
    11831228
    11841229restart_poll:
     
    11981243                        int offset = ibmveth_rxq_frame_offset(adapter);
    11991244                        int csum_good = ibmveth_rxq_csum_good(adapter);
     1245                        int lrg_pkt = ibmveth_rxq_large_packet(adapter);
    12001246
    12011247                        skb = ibmveth_rxq_get_buffer(adapter);
     1248
     1249                        /* if the large packet bit is set in the rx queue
     1250                         * descriptor, the mss will be written by PHYP eight
     1251                         * bytes from the start of the rx buffer, which is
     1252                         * skb->data at this stage
     1253                         */
     1254                        if (lrg_pkt) {
     1255                                __be64 *rxmss = (__be64 *)(skb->data + 8);
     1256
     1257                                mss = (u16)be64_to_cpu(*rxmss);
     1258                        }
    12021259
    12031260                        new_skb = NULL;
     
    12341291                                                iph->check = 0;
    12351292                                                iph->check = ip_fast_csum((unsigned char *)iph, iph->ihl);
    1236                                                 adapter->rx_large_packets++;
    12371293                                        }
    12381294                                }
     1295                        }
     1296
     1297                        if (length > netdev->mtu + ETH_HLEN) {
     1298                                ibmveth_rx_mss_helper(skb, mss, lrg_pkt);
     1299                                adapter->rx_large_packets++;
    12391300                        }
    12401301
Note: See TracChangeset for help on using the changeset viewer.