You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
MMerge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Pull networking fixes from David Miller:
1) Stretch ACKs can kill performance with Reno and CUBIC congestion
control, largely due to LRO and GRO. Fix from Neal Cardwell.
2) Fix userland breakage because we accidently emit zero length netlink
messages from the bridging code. From Roopa Prabhu.
3) Carry handling in generic csum_tcpudp_nofold is broken, fix from
Karl Beldan.
4) Remove bogus dev_set_net() calls from CAIF driver, from Nicolas
Dichtel.
5) Make sure PPP deflation never returns a length greater then the
output buffer, otherwise we overflow and trigger skb_over_panic().
Fix from Florian Westphal.
6) COSA driver needs VIRT_TO_BUS Kconfig dependencies, from Arnd
Bergmann.
7) Don't increase route cached MTU on datagram too big ICMPs. From Li
Wei.
8) Fix error path leaks in nf_tables, from Pablo Neira Ayuso.
9) Fix bitmask handling regression in netlink that broke things like
acpi userland tools. From Pablo Neira Ayuso.
10) Wrong header pointer passed to param_type2af() in SCTP code, from
Saran Maruti Ramanara.
11) Stacked vlans not handled correctly by vlan_get_protocol(), from
Toshiaki Makita.
12) Add missing DMA memory barrier to xgene driver, from Iyappan
Subramanian.
13) Fix crash in rate estimators, from Eric Dumazet.
14) We've been adding various workarounds, one after another, for the
change which added the per-net tcp_sock. It was meant to reduce
socket contention but added lots of problems.
Reduce this instead to a proper per-cpu socket and that rids us of
all the daemons.
From Eric Dumazet.
15) Fix memory corruption and OOPS in mlx4 driver, from Jack
Morgenstein.
16) When we disabled UFO in the virtio_net device, it introduces some
serious performance regressions. The orignal problem was IPV6
fragment ID generation, so fix that properly instead. From Vlad
Yasevich.
17) sr9700 driver build breaks on xtensa because it defines macros with
the same name as those used by the arch code. Use more unique
names. From Chen Gang.
18) Fix endianness in new virio 1.0 mode of the vhost net driver, from
Michael S Tsirkin.
19) Several sysctls were setting the maxlen attribute incorrectly, from
Sasha Levin.
20) Don't accept an FQ scheduler quantum of zero, that leads to crashes.
From Kenneth Klette Jonassen.
21) Fix dumping of non-existing actions in the packet scheduler
classifier. From Ignacy Gawędzki.
22) Return the write work_done value when doing TX work in the qlcnic
driver.
23) ip6gre_err accesses the info field with the wrong endianness, from
Sabrina Dubroca.
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: (54 commits)
sit: fix some __be16/u16 mismatches
ipv6: fix sparse errors in ip6_make_flowlabel()
net: remove some sparse warnings
flow_keys: n_proto type should be __be16
ip6_gre: fix endianness errors in ip6gre_err
qlcnic: Fix NAPI poll routine for Tx completion
amd-xgbe: Set RSS enablement based on hardware features
amd-xgbe: Adjust for zero-based traffic class count
cls_api.c: Fix dumping of non-existing actions' stats.
pkt_sched: fq: avoid hang when quantum 0
net: rds: use correct size for max unacked packets and bytes
vhost/net: fix up num_buffers endian-ness
gianfar: correct the bad expression while writing bit-pattern
net: usb: sr9700: Use 'SR_' prefix for the common register macros
Revert "drivers/net: Disable UFO through virtio"
Revert "drivers/net, ipv6: Select IPv6 fragment idents for virtio UFO packets"
ipv6: Select fragment id during UFO segmentation if not set.
xen-netback: stop the guest rx thread after a fatal error
net/mlx4_core: Fix kernel Oops (mem corruption) when working with more than 80 VFs
isdn: off by one in connect_res()
...
This commit is contained in:
@@ -199,16 +199,9 @@ frame header.
|
||||
TX limitations
|
||||
--------------
|
||||
|
||||
Kernel processing usually involves validation of the message received by
|
||||
user-space, then processing its contents. The kernel must assure that
|
||||
userspace is not able to modify the message contents after they have been
|
||||
validated. In order to do so, the message is copied from the ring frame
|
||||
to an allocated buffer if either of these conditions is false:
|
||||
|
||||
- only a single mapping of the ring exists
|
||||
- the file descriptor is not shared between processes
|
||||
|
||||
This means that for threaded programs, the kernel will fall back to copying.
|
||||
As of Jan 2015 the message is always copied from the ring frame to an
|
||||
allocated buffer due to unresolved security concerns.
|
||||
See commit 4682a0358639b29cf ("netlink: Always copy on mmap TX.").
|
||||
|
||||
Example
|
||||
-------
|
||||
|
||||
@@ -1474,7 +1474,7 @@ static byte connect_res(dword Id, word Number, DIVA_CAPI_ADAPTER *a,
|
||||
add_ai(plci, &parms[5]);
|
||||
sig_req(plci, REJECT, 0);
|
||||
}
|
||||
else if (Reject == 1 || Reject > 9)
|
||||
else if (Reject == 1 || Reject >= 9)
|
||||
{
|
||||
add_ai(plci, &parms[5]);
|
||||
sig_req(plci, HANGUP, 0);
|
||||
|
||||
@@ -1415,7 +1415,6 @@ static int caif_hsi_newlink(struct net *src_net, struct net_device *dev,
|
||||
|
||||
cfhsi = netdev_priv(dev);
|
||||
cfhsi_netlink_parms(data, cfhsi);
|
||||
dev_net_set(cfhsi->ndev, src_net);
|
||||
|
||||
get_ops = symbol_get(cfhsi_get_ops);
|
||||
if (!get_ops) {
|
||||
|
||||
@@ -45,7 +45,7 @@ config AMD8111_ETH
|
||||
|
||||
config LANCE
|
||||
tristate "AMD LANCE and PCnet (AT1500 and NE2100) support"
|
||||
depends on ISA && ISA_DMA_API
|
||||
depends on ISA && ISA_DMA_API && !ARM
|
||||
---help---
|
||||
If you have a network (Ethernet) card of this type, say Y and read
|
||||
the Ethernet-HOWTO, available from
|
||||
@@ -142,7 +142,7 @@ config PCMCIA_NMCLAN
|
||||
|
||||
config NI65
|
||||
tristate "NI6510 support"
|
||||
depends on ISA && ISA_DMA_API
|
||||
depends on ISA && ISA_DMA_API && !ARM
|
||||
---help---
|
||||
If you have a network (Ethernet) card of this type, say Y and read
|
||||
the Ethernet-HOWTO, available from
|
||||
|
||||
@@ -952,6 +952,8 @@ static irqreturn_t mace_interrupt(int irq, void *dev_id)
|
||||
do {
|
||||
/* WARNING: MACE_IR is a READ/CLEAR port! */
|
||||
status = inb(ioaddr + AM2150_MACE_BASE + MACE_IR);
|
||||
if (!(status & ~MACE_IMR_DEFAULT) && IntrCnt == MACE_MAX_IR_ITERATIONS)
|
||||
return IRQ_NONE;
|
||||
|
||||
pr_debug("mace_interrupt: irq 0x%X status 0x%X.\n", irq, status);
|
||||
|
||||
|
||||
@@ -523,6 +523,7 @@ void xgbe_get_all_hw_features(struct xgbe_prv_data *pdata)
|
||||
hw_feat->sph = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, SPHEN);
|
||||
hw_feat->tso = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, TSOEN);
|
||||
hw_feat->dma_debug = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, DBGMEMA);
|
||||
hw_feat->rss = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, RSSEN);
|
||||
hw_feat->tc_cnt = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, NUMTC);
|
||||
hw_feat->hash_table_size = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R,
|
||||
HASHTBLSZ);
|
||||
@@ -552,13 +553,14 @@ void xgbe_get_all_hw_features(struct xgbe_prv_data *pdata)
|
||||
break;
|
||||
}
|
||||
|
||||
/* The Queue and Channel counts are zero based so increment them
|
||||
/* The Queue, Channel and TC counts are zero based so increment them
|
||||
* to get the actual number
|
||||
*/
|
||||
hw_feat->rx_q_cnt++;
|
||||
hw_feat->tx_q_cnt++;
|
||||
hw_feat->rx_ch_cnt++;
|
||||
hw_feat->tx_ch_cnt++;
|
||||
hw_feat->tc_cnt++;
|
||||
|
||||
DBGPR("<--xgbe_get_all_hw_features\n");
|
||||
}
|
||||
|
||||
@@ -369,6 +369,8 @@ static int xgene_enet_process_ring(struct xgene_enet_desc_ring *ring,
|
||||
if (unlikely(xgene_enet_is_desc_slot_empty(raw_desc)))
|
||||
break;
|
||||
|
||||
/* read fpqnum field after dataaddr field */
|
||||
dma_rmb();
|
||||
if (is_rx_desc(raw_desc))
|
||||
ret = xgene_enet_rx_frame(ring, raw_desc);
|
||||
else
|
||||
|
||||
@@ -32,7 +32,8 @@ config CS89x0
|
||||
will be called cs89x0.
|
||||
|
||||
config CS89x0_PLATFORM
|
||||
bool "CS89x0 platform driver support"
|
||||
bool "CS89x0 platform driver support" if HAS_IOPORT_MAP
|
||||
default !HAS_IOPORT_MAP
|
||||
depends on CS89x0
|
||||
help
|
||||
Say Y to compile the cs89x0 driver as a platform driver. This
|
||||
|
||||
@@ -1586,7 +1586,7 @@ static int gfar_write_filer_table(struct gfar_private *priv,
|
||||
return -EBUSY;
|
||||
|
||||
/* Fill regular entries */
|
||||
for (; i < MAX_FILER_IDX - 1 && (tab->fe[i].ctrl | tab->fe[i].ctrl);
|
||||
for (; i < MAX_FILER_IDX - 1 && (tab->fe[i].ctrl | tab->fe[i].prop);
|
||||
i++)
|
||||
gfar_write_filer(priv, i, tab->fe[i].ctrl, tab->fe[i].prop);
|
||||
/* Fill the rest with fall-troughs */
|
||||
|
||||
@@ -1907,7 +1907,8 @@ static void igbvf_watchdog_task(struct work_struct *work)
|
||||
|
||||
static int igbvf_tso(struct igbvf_adapter *adapter,
|
||||
struct igbvf_ring *tx_ring,
|
||||
struct sk_buff *skb, u32 tx_flags, u8 *hdr_len)
|
||||
struct sk_buff *skb, u32 tx_flags, u8 *hdr_len,
|
||||
__be16 protocol)
|
||||
{
|
||||
struct e1000_adv_tx_context_desc *context_desc;
|
||||
struct igbvf_buffer *buffer_info;
|
||||
@@ -1927,7 +1928,7 @@ static int igbvf_tso(struct igbvf_adapter *adapter,
|
||||
l4len = tcp_hdrlen(skb);
|
||||
*hdr_len += l4len;
|
||||
|
||||
if (skb->protocol == htons(ETH_P_IP)) {
|
||||
if (protocol == htons(ETH_P_IP)) {
|
||||
struct iphdr *iph = ip_hdr(skb);
|
||||
iph->tot_len = 0;
|
||||
iph->check = 0;
|
||||
@@ -1958,7 +1959,7 @@ static int igbvf_tso(struct igbvf_adapter *adapter,
|
||||
/* ADV DTYP TUCMD MKRLOC/ISCSIHEDLEN */
|
||||
tu_cmd |= (E1000_TXD_CMD_DEXT | E1000_ADVTXD_DTYP_CTXT);
|
||||
|
||||
if (skb->protocol == htons(ETH_P_IP))
|
||||
if (protocol == htons(ETH_P_IP))
|
||||
tu_cmd |= E1000_ADVTXD_TUCMD_IPV4;
|
||||
tu_cmd |= E1000_ADVTXD_TUCMD_L4T_TCP;
|
||||
|
||||
@@ -1984,7 +1985,8 @@ static int igbvf_tso(struct igbvf_adapter *adapter,
|
||||
|
||||
static inline bool igbvf_tx_csum(struct igbvf_adapter *adapter,
|
||||
struct igbvf_ring *tx_ring,
|
||||
struct sk_buff *skb, u32 tx_flags)
|
||||
struct sk_buff *skb, u32 tx_flags,
|
||||
__be16 protocol)
|
||||
{
|
||||
struct e1000_adv_tx_context_desc *context_desc;
|
||||
unsigned int i;
|
||||
@@ -2011,7 +2013,7 @@ static inline bool igbvf_tx_csum(struct igbvf_adapter *adapter,
|
||||
tu_cmd |= (E1000_TXD_CMD_DEXT | E1000_ADVTXD_DTYP_CTXT);
|
||||
|
||||
if (skb->ip_summed == CHECKSUM_PARTIAL) {
|
||||
switch (skb->protocol) {
|
||||
switch (protocol) {
|
||||
case htons(ETH_P_IP):
|
||||
tu_cmd |= E1000_ADVTXD_TUCMD_IPV4;
|
||||
if (ip_hdr(skb)->protocol == IPPROTO_TCP)
|
||||
@@ -2211,6 +2213,7 @@ static netdev_tx_t igbvf_xmit_frame_ring_adv(struct sk_buff *skb,
|
||||
u8 hdr_len = 0;
|
||||
int count = 0;
|
||||
int tso = 0;
|
||||
__be16 protocol = vlan_get_protocol(skb);
|
||||
|
||||
if (test_bit(__IGBVF_DOWN, &adapter->state)) {
|
||||
dev_kfree_skb_any(skb);
|
||||
@@ -2239,13 +2242,13 @@ static netdev_tx_t igbvf_xmit_frame_ring_adv(struct sk_buff *skb,
|
||||
tx_flags |= (vlan_tx_tag_get(skb) << IGBVF_TX_FLAGS_VLAN_SHIFT);
|
||||
}
|
||||
|
||||
if (skb->protocol == htons(ETH_P_IP))
|
||||
if (protocol == htons(ETH_P_IP))
|
||||
tx_flags |= IGBVF_TX_FLAGS_IPV4;
|
||||
|
||||
first = tx_ring->next_to_use;
|
||||
|
||||
tso = skb_is_gso(skb) ?
|
||||
igbvf_tso(adapter, tx_ring, skb, tx_flags, &hdr_len) : 0;
|
||||
igbvf_tso(adapter, tx_ring, skb, tx_flags, &hdr_len, protocol) : 0;
|
||||
if (unlikely(tso < 0)) {
|
||||
dev_kfree_skb_any(skb);
|
||||
return NETDEV_TX_OK;
|
||||
@@ -2253,7 +2256,7 @@ static netdev_tx_t igbvf_xmit_frame_ring_adv(struct sk_buff *skb,
|
||||
|
||||
if (tso)
|
||||
tx_flags |= IGBVF_TX_FLAGS_TSO;
|
||||
else if (igbvf_tx_csum(adapter, tx_ring, skb, tx_flags) &&
|
||||
else if (igbvf_tx_csum(adapter, tx_ring, skb, tx_flags, protocol) &&
|
||||
(skb->ip_summed == CHECKSUM_PARTIAL))
|
||||
tx_flags |= IGBVF_TX_FLAGS_CSUM;
|
||||
|
||||
|
||||
@@ -7227,11 +7227,11 @@ netdev_tx_t ixgbe_xmit_frame_ring(struct sk_buff *skb,
|
||||
if (!vhdr)
|
||||
goto out_drop;
|
||||
|
||||
protocol = vhdr->h_vlan_encapsulated_proto;
|
||||
tx_flags |= ntohs(vhdr->h_vlan_TCI) <<
|
||||
IXGBE_TX_FLAGS_VLAN_SHIFT;
|
||||
tx_flags |= IXGBE_TX_FLAGS_SW_VLAN;
|
||||
}
|
||||
protocol = vlan_get_protocol(skb);
|
||||
|
||||
if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) &&
|
||||
adapter->ptp_clock &&
|
||||
|
||||
@@ -3099,7 +3099,7 @@ static int ixgbevf_tso(struct ixgbevf_ring *tx_ring,
|
||||
/* ADV DTYP TUCMD MKRLOC/ISCSIHEDLEN */
|
||||
type_tucmd = IXGBE_ADVTXD_TUCMD_L4T_TCP;
|
||||
|
||||
if (skb->protocol == htons(ETH_P_IP)) {
|
||||
if (first->protocol == htons(ETH_P_IP)) {
|
||||
struct iphdr *iph = ip_hdr(skb);
|
||||
iph->tot_len = 0;
|
||||
iph->check = 0;
|
||||
@@ -3156,7 +3156,7 @@ static void ixgbevf_tx_csum(struct ixgbevf_ring *tx_ring,
|
||||
|
||||
if (skb->ip_summed == CHECKSUM_PARTIAL) {
|
||||
u8 l4_hdr = 0;
|
||||
switch (skb->protocol) {
|
||||
switch (first->protocol) {
|
||||
case htons(ETH_P_IP):
|
||||
vlan_macip_lens |= skb_network_header_len(skb);
|
||||
type_tucmd |= IXGBE_ADVTXD_TUCMD_IPV4;
|
||||
|
||||
@@ -235,7 +235,8 @@ do { \
|
||||
extern int mlx4_log_num_mgm_entry_size;
|
||||
extern int log_mtts_per_seg;
|
||||
|
||||
#define MLX4_MAX_NUM_SLAVES (MLX4_MAX_NUM_PF + MLX4_MAX_NUM_VF)
|
||||
#define MLX4_MAX_NUM_SLAVES (min(MLX4_MAX_NUM_PF + MLX4_MAX_NUM_VF, \
|
||||
MLX4_MFUNC_MAX))
|
||||
#define ALL_SLAVES 0xff
|
||||
|
||||
struct mlx4_bitmap {
|
||||
|
||||
@@ -967,7 +967,12 @@ static int qlcnic_poll(struct napi_struct *napi, int budget)
|
||||
tx_complete = qlcnic_process_cmd_ring(adapter, tx_ring,
|
||||
budget);
|
||||
work_done = qlcnic_process_rcv_ring(sds_ring, budget);
|
||||
if ((work_done < budget) && tx_complete) {
|
||||
|
||||
/* Check if we need a repoll */
|
||||
if (!tx_complete)
|
||||
work_done = budget;
|
||||
|
||||
if (work_done < budget) {
|
||||
napi_complete(&sds_ring->napi);
|
||||
if (test_bit(__QLCNIC_DEV_UP, &adapter->state)) {
|
||||
qlcnic_enable_sds_intr(adapter, sds_ring);
|
||||
@@ -992,6 +997,9 @@ static int qlcnic_tx_poll(struct napi_struct *napi, int budget)
|
||||
napi_complete(&tx_ring->napi);
|
||||
if (test_bit(__QLCNIC_DEV_UP, &adapter->state))
|
||||
qlcnic_enable_tx_intr(adapter, tx_ring);
|
||||
} else {
|
||||
/* As qlcnic_process_cmd_ring() returned 0, we need a repoll*/
|
||||
work_done = budget;
|
||||
}
|
||||
|
||||
return work_done;
|
||||
@@ -1950,7 +1958,12 @@ static int qlcnic_83xx_msix_sriov_vf_poll(struct napi_struct *napi, int budget)
|
||||
|
||||
tx_complete = qlcnic_process_cmd_ring(adapter, tx_ring, budget);
|
||||
work_done = qlcnic_83xx_process_rcv_ring(sds_ring, budget);
|
||||
if ((work_done < budget) && tx_complete) {
|
||||
|
||||
/* Check if we need a repoll */
|
||||
if (!tx_complete)
|
||||
work_done = budget;
|
||||
|
||||
if (work_done < budget) {
|
||||
napi_complete(&sds_ring->napi);
|
||||
qlcnic_enable_sds_intr(adapter, sds_ring);
|
||||
}
|
||||
@@ -1973,7 +1986,12 @@ static int qlcnic_83xx_poll(struct napi_struct *napi, int budget)
|
||||
|
||||
tx_complete = qlcnic_process_cmd_ring(adapter, tx_ring, budget);
|
||||
work_done = qlcnic_83xx_process_rcv_ring(sds_ring, budget);
|
||||
if ((work_done < budget) && tx_complete) {
|
||||
|
||||
/* Check if we need a repoll */
|
||||
if (!tx_complete)
|
||||
work_done = budget;
|
||||
|
||||
if (work_done < budget) {
|
||||
napi_complete(&sds_ring->napi);
|
||||
qlcnic_enable_sds_intr(adapter, sds_ring);
|
||||
}
|
||||
@@ -1995,6 +2013,9 @@ static int qlcnic_83xx_msix_tx_poll(struct napi_struct *napi, int budget)
|
||||
napi_complete(&tx_ring->napi);
|
||||
if (test_bit(__QLCNIC_DEV_UP , &adapter->state))
|
||||
qlcnic_enable_tx_intr(adapter, tx_ring);
|
||||
} else {
|
||||
/* need a repoll */
|
||||
work_done = budget;
|
||||
}
|
||||
|
||||
return work_done;
|
||||
|
||||
@@ -2351,23 +2351,29 @@ static int qlge_update_hw_vlan_features(struct net_device *ndev,
|
||||
{
|
||||
struct ql_adapter *qdev = netdev_priv(ndev);
|
||||
int status = 0;
|
||||
bool need_restart = netif_running(ndev);
|
||||
|
||||
status = ql_adapter_down(qdev);
|
||||
if (status) {
|
||||
netif_err(qdev, link, qdev->ndev,
|
||||
"Failed to bring down the adapter\n");
|
||||
return status;
|
||||
if (need_restart) {
|
||||
status = ql_adapter_down(qdev);
|
||||
if (status) {
|
||||
netif_err(qdev, link, qdev->ndev,
|
||||
"Failed to bring down the adapter\n");
|
||||
return status;
|
||||
}
|
||||
}
|
||||
|
||||
/* update the features with resent change */
|
||||
ndev->features = features;
|
||||
|
||||
status = ql_adapter_up(qdev);
|
||||
if (status) {
|
||||
netif_err(qdev, link, qdev->ndev,
|
||||
"Failed to bring up the adapter\n");
|
||||
return status;
|
||||
if (need_restart) {
|
||||
status = ql_adapter_up(qdev);
|
||||
if (status) {
|
||||
netif_err(qdev, link, qdev->ndev,
|
||||
"Failed to bring up the adapter\n");
|
||||
return status;
|
||||
}
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
@@ -1119,6 +1119,7 @@ static inline struct sk_buff *vnet_skb_shape(struct sk_buff *skb, int ncookies)
|
||||
skb_shinfo(nskb)->gso_size = skb_shinfo(skb)->gso_size;
|
||||
skb_shinfo(nskb)->gso_type = skb_shinfo(skb)->gso_type;
|
||||
}
|
||||
nskb->queue_mapping = skb->queue_mapping;
|
||||
dev_kfree_skb(skb);
|
||||
skb = nskb;
|
||||
}
|
||||
|
||||
@@ -716,7 +716,7 @@ int netvsc_send(struct hv_device *device,
|
||||
u64 req_id;
|
||||
unsigned int section_index = NETVSC_INVALID_INDEX;
|
||||
u32 msg_size = 0;
|
||||
struct sk_buff *skb;
|
||||
struct sk_buff *skb = NULL;
|
||||
u16 q_idx = packet->q_idx;
|
||||
|
||||
|
||||
@@ -743,8 +743,6 @@ int netvsc_send(struct hv_device *device,
|
||||
packet);
|
||||
skb = (struct sk_buff *)
|
||||
(unsigned long)packet->send_completion_tid;
|
||||
if (skb)
|
||||
dev_kfree_skb_any(skb);
|
||||
packet->page_buf_cnt = 0;
|
||||
}
|
||||
}
|
||||
@@ -810,6 +808,13 @@ int netvsc_send(struct hv_device *device,
|
||||
packet, ret);
|
||||
}
|
||||
|
||||
if (ret != 0) {
|
||||
if (section_index != NETVSC_INVALID_INDEX)
|
||||
netvsc_free_send_slot(net_device, section_index);
|
||||
} else if (skb) {
|
||||
dev_kfree_skb_any(skb);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -17,7 +17,6 @@
|
||||
#include <linux/fs.h>
|
||||
#include <linux/uio.h>
|
||||
|
||||
#include <net/ipv6.h>
|
||||
#include <net/net_namespace.h>
|
||||
#include <net/rtnetlink.h>
|
||||
#include <net/sock.h>
|
||||
@@ -81,7 +80,7 @@ static struct cdev macvtap_cdev;
|
||||
static const struct proto_ops macvtap_socket_ops;
|
||||
|
||||
#define TUN_OFFLOADS (NETIF_F_HW_CSUM | NETIF_F_TSO_ECN | NETIF_F_TSO | \
|
||||
NETIF_F_TSO6)
|
||||
NETIF_F_TSO6 | NETIF_F_UFO)
|
||||
#define RX_OFFLOADS (NETIF_F_GRO | NETIF_F_LRO)
|
||||
#define TAP_FEATURES (NETIF_F_GSO | NETIF_F_SG)
|
||||
|
||||
@@ -586,11 +585,7 @@ static int macvtap_skb_from_vnet_hdr(struct macvtap_queue *q,
|
||||
gso_type = SKB_GSO_TCPV6;
|
||||
break;
|
||||
case VIRTIO_NET_HDR_GSO_UDP:
|
||||
pr_warn_once("macvtap: %s: using disabled UFO feature; please fix this program\n",
|
||||
current->comm);
|
||||
gso_type = SKB_GSO_UDP;
|
||||
if (skb->protocol == htons(ETH_P_IPV6))
|
||||
ipv6_proxy_select_ident(skb);
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
@@ -636,6 +631,8 @@ static void macvtap_skb_to_vnet_hdr(struct macvtap_queue *q,
|
||||
vnet_hdr->gso_type = VIRTIO_NET_HDR_GSO_TCPV4;
|
||||
else if (sinfo->gso_type & SKB_GSO_TCPV6)
|
||||
vnet_hdr->gso_type = VIRTIO_NET_HDR_GSO_TCPV6;
|
||||
else if (sinfo->gso_type & SKB_GSO_UDP)
|
||||
vnet_hdr->gso_type = VIRTIO_NET_HDR_GSO_UDP;
|
||||
else
|
||||
BUG();
|
||||
if (sinfo->gso_type & SKB_GSO_TCP_ECN)
|
||||
@@ -965,6 +962,9 @@ static int set_offload(struct macvtap_queue *q, unsigned long arg)
|
||||
if (arg & TUN_F_TSO6)
|
||||
feature_mask |= NETIF_F_TSO6;
|
||||
}
|
||||
|
||||
if (arg & TUN_F_UFO)
|
||||
feature_mask |= NETIF_F_UFO;
|
||||
}
|
||||
|
||||
/* tun/tap driver inverts the usage for TSO offloads, where
|
||||
@@ -975,7 +975,7 @@ static int set_offload(struct macvtap_queue *q, unsigned long arg)
|
||||
* When user space turns off TSO, we turn off GSO/LRO so that
|
||||
* user-space will not receive TSO frames.
|
||||
*/
|
||||
if (feature_mask & (NETIF_F_TSO | NETIF_F_TSO6))
|
||||
if (feature_mask & (NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_UFO))
|
||||
features |= RX_OFFLOADS;
|
||||
else
|
||||
features &= ~RX_OFFLOADS;
|
||||
@@ -1090,7 +1090,7 @@ static long macvtap_ioctl(struct file *file, unsigned int cmd,
|
||||
case TUNSETOFFLOAD:
|
||||
/* let the user check for future flags */
|
||||
if (arg & ~(TUN_F_CSUM | TUN_F_TSO4 | TUN_F_TSO6 |
|
||||
TUN_F_TSO_ECN))
|
||||
TUN_F_TSO_ECN | TUN_F_UFO))
|
||||
return -EINVAL;
|
||||
|
||||
rtnl_lock();
|
||||
|
||||
@@ -246,7 +246,7 @@ static int z_compress(void *arg, unsigned char *rptr, unsigned char *obuf,
|
||||
/*
|
||||
* See if we managed to reduce the size of the packet.
|
||||
*/
|
||||
if (olen < isize) {
|
||||
if (olen < isize && olen <= osize) {
|
||||
state->stats.comp_bytes += olen;
|
||||
state->stats.comp_packets++;
|
||||
} else {
|
||||
|
||||
+9
-16
@@ -65,7 +65,6 @@
|
||||
#include <linux/nsproxy.h>
|
||||
#include <linux/virtio_net.h>
|
||||
#include <linux/rcupdate.h>
|
||||
#include <net/ipv6.h>
|
||||
#include <net/net_namespace.h>
|
||||
#include <net/netns/generic.h>
|
||||
#include <net/rtnetlink.h>
|
||||
@@ -187,7 +186,7 @@ struct tun_struct {
|
||||
struct net_device *dev;
|
||||
netdev_features_t set_features;
|
||||
#define TUN_USER_FEATURES (NETIF_F_HW_CSUM|NETIF_F_TSO_ECN|NETIF_F_TSO| \
|
||||
NETIF_F_TSO6)
|
||||
NETIF_F_TSO6|NETIF_F_UFO)
|
||||
|
||||
int vnet_hdr_sz;
|
||||
int sndbuf;
|
||||
@@ -1167,8 +1166,6 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile,
|
||||
break;
|
||||
}
|
||||
|
||||
skb_reset_network_header(skb);
|
||||
|
||||
if (gso.gso_type != VIRTIO_NET_HDR_GSO_NONE) {
|
||||
pr_debug("GSO!\n");
|
||||
switch (gso.gso_type & ~VIRTIO_NET_HDR_GSO_ECN) {
|
||||
@@ -1179,20 +1176,8 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile,
|
||||
skb_shinfo(skb)->gso_type = SKB_GSO_TCPV6;
|
||||
break;
|
||||
case VIRTIO_NET_HDR_GSO_UDP:
|
||||
{
|
||||
static bool warned;
|
||||
|
||||
if (!warned) {
|
||||
warned = true;
|
||||
netdev_warn(tun->dev,
|
||||
"%s: using disabled UFO feature; please fix this program\n",
|
||||
current->comm);
|
||||
}
|
||||
skb_shinfo(skb)->gso_type = SKB_GSO_UDP;
|
||||
if (skb->protocol == htons(ETH_P_IPV6))
|
||||
ipv6_proxy_select_ident(skb);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
tun->dev->stats.rx_frame_errors++;
|
||||
kfree_skb(skb);
|
||||
@@ -1221,6 +1206,7 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile,
|
||||
skb_shinfo(skb)->tx_flags |= SKBTX_SHARED_FRAG;
|
||||
}
|
||||
|
||||
skb_reset_network_header(skb);
|
||||
skb_probe_transport_header(skb, 0);
|
||||
|
||||
rxhash = skb_get_hash(skb);
|
||||
@@ -1298,6 +1284,8 @@ static ssize_t tun_put_user(struct tun_struct *tun,
|
||||
gso.gso_type = VIRTIO_NET_HDR_GSO_TCPV4;
|
||||
else if (sinfo->gso_type & SKB_GSO_TCPV6)
|
||||
gso.gso_type = VIRTIO_NET_HDR_GSO_TCPV6;
|
||||
else if (sinfo->gso_type & SKB_GSO_UDP)
|
||||
gso.gso_type = VIRTIO_NET_HDR_GSO_UDP;
|
||||
else {
|
||||
pr_err("unexpected GSO type: "
|
||||
"0x%x, gso_size %d, hdr_len %d\n",
|
||||
@@ -1746,6 +1734,11 @@ static int set_offload(struct tun_struct *tun, unsigned long arg)
|
||||
features |= NETIF_F_TSO6;
|
||||
arg &= ~(TUN_F_TSO4|TUN_F_TSO6);
|
||||
}
|
||||
|
||||
if (arg & TUN_F_UFO) {
|
||||
features |= NETIF_F_UFO;
|
||||
arg &= ~TUN_F_UFO;
|
||||
}
|
||||
}
|
||||
|
||||
/* This gives the user a way to test for new features in future by
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user