Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net

Pull networking fixes from David Miller:
"Just a few fixes trickling in at this point.

1) If we see an attached socket on an skb in the ipv4 forwarding path,
bail. This can happen due to races with FIB rule addition, and
deletion, and we should just drop such frames. From Sebastian
Pöhn.

2) pppoe receive should only accept packets destined for this hosts's
MAC address. From Joakim Tjernlund.

3) Handle checksum unwrapping properly in ppp receive properly when
it's encapsulated in UDP in some way, fix from Tom Herbert.

4) Fix some bugs in mv88e6xxx DSA driver resulting from the conversion
from register offset constants to mnenomic macros. From Vivien
Didelot.

5) Fix handling of HCA max message size in mlx4 adapters, from Eran
Ben ELisha"

* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net:
net/mlx4_core: Fix reading HCA max message size in mlx4_QUERY_DEV_CAP
tcp: add memory barriers to write space paths
altera tse: Error-Bit on tx-avalon-stream always set.
net: dsa: mv88e6xxx: use PORT_DEFAULT_VLAN
net: dsa: mv88e6xxx: fix setup of port control 1
ppp: call skb_checksum_complete_unset in ppp_receive_frame
net: add skb_checksum_complete_unset
pppoe: Lacks DST MAC address check
ip_forward: Drop frames with attached skb->sk

+28 -6
+3 -3
drivers/net/dsa/mv88e6xxx.c
··· 1251 1251 /* Port Control 1: disable trunking, disable sending 1252 1252 * learning messages to this port. 1253 1253 */ 1254 - ret = _mv88e6xxx_reg_write(ds, REG_PORT(port), PORT_DEFAULT_VLAN, 1255 - 0x0000); 1254 + ret = _mv88e6xxx_reg_write(ds, REG_PORT(port), PORT_CONTROL_1, 0x0000); 1256 1255 if (ret) 1257 1256 goto abort; 1258 1257 ··· 1274 1275 /* Default VLAN ID and priority: don't set a default VLAN 1275 1276 * ID, and set the default packet priority to zero. 1276 1277 */ 1277 - ret = _mv88e6xxx_reg_write(ds, REG_PORT(port), 0x07, 0x0000); 1278 + ret = _mv88e6xxx_reg_write(ds, REG_PORT(port), PORT_DEFAULT_VLAN, 1279 + 0x0000); 1278 1280 abort: 1279 1281 mutex_unlock(&ps->smi_mutex); 1280 1282 return ret;
-1
drivers/net/ethernet/altera/altera_msgdmahw.h
··· 72 72 #define MSGDMA_DESC_CTL_TX_SINGLE (MSGDMA_DESC_CTL_GEN_SOP | \ 73 73 MSGDMA_DESC_CTL_GEN_EOP | \ 74 74 MSGDMA_DESC_CTL_TR_COMP_IRQ | \ 75 - MSGDMA_DESC_CTL_TR_ERR_IRQ | \ 76 75 MSGDMA_DESC_CTL_GO) 77 76 78 77 #define MSGDMA_DESC_CTL_RX_SINGLE (MSGDMA_DESC_CTL_END_ON_EOP | \
+1 -1
drivers/net/ethernet/mellanox/mlx4/fw.c
··· 781 781 MLX4_GET(field, outbox, QUERY_DEV_CAP_VL_PORT_OFFSET); 782 782 dev_cap->num_ports = field & 0xf; 783 783 MLX4_GET(field, outbox, QUERY_DEV_CAP_MAX_MSG_SZ_OFFSET); 784 + dev_cap->max_msg_sz = 1 << (field & 0x1f); 784 785 MLX4_GET(field, outbox, QUERY_DEV_CAP_PORT_FLOWSTATS_COUNTERS_OFFSET); 785 786 if (field & 0x10) 786 787 dev_cap->flags2 |= MLX4_DEV_CAP_FLAG2_FLOWSTATS_EN; 787 - dev_cap->max_msg_sz = 1 << (field & 0x1f); 788 788 MLX4_GET(field, outbox, QUERY_DEV_CAP_FLOW_STEERING_RANGE_EN_OFFSET); 789 789 if (field & 0x80) 790 790 dev_cap->flags2 |= MLX4_DEV_CAP_FLAG2_FS_EN;
+1
drivers/net/ppp/ppp_generic.c
··· 1716 1716 { 1717 1717 /* note: a 0-length skb is used as an error indication */ 1718 1718 if (skb->len > 0) { 1719 + skb_checksum_complete_unset(skb); 1719 1720 #ifdef CONFIG_PPP_MULTILINK 1720 1721 /* XXX do channel-level decompression here */ 1721 1722 if (PPP_PROTO(skb) == PPP_MP)
+3
drivers/net/ppp/pppoe.c
··· 380 380 * can't change. 381 381 */ 382 382 383 + if (skb->pkt_type == PACKET_OTHERHOST) 384 + goto abort_kfree; 385 + 383 386 if (sk->sk_state & PPPOX_BOUND) { 384 387 ppp_input(&po->chan, skb); 385 388 } else if (sk->sk_state & PPPOX_RELAY) {
+12
include/linux/skbuff.h
··· 3016 3016 */ 3017 3017 #define CHECKSUM_BREAK 76 3018 3018 3019 + /* Unset checksum-complete 3020 + * 3021 + * Unset checksum complete can be done when packet is being modified 3022 + * (uncompressed for instance) and checksum-complete value is 3023 + * invalidated. 3024 + */ 3025 + static inline void skb_checksum_complete_unset(struct sk_buff *skb) 3026 + { 3027 + if (skb->ip_summed == CHECKSUM_COMPLETE) 3028 + skb->ip_summed = CHECKSUM_NONE; 3029 + } 3030 + 3019 3031 /* Validate (init) checksum based on checksum complete. 3020 3032 * 3021 3033 * Return values:
+3
net/ipv4/ip_forward.c
··· 82 82 if (skb->pkt_type != PACKET_HOST) 83 83 goto drop; 84 84 85 + if (unlikely(skb->sk)) 86 + goto drop; 87 + 85 88 if (skb_warn_if_lro(skb)) 86 89 goto drop; 87 90
+3 -1
net/ipv4/tcp.c
··· 520 520 521 521 /* Race breaker. If space is freed after 522 522 * wspace test but before the flags are set, 523 - * IO signal will be lost. 523 + * IO signal will be lost. Memory barrier 524 + * pairs with the input side. 524 525 */ 526 + smp_mb__after_atomic(); 525 527 if (sk_stream_is_writeable(sk)) 526 528 mask |= POLLOUT | POLLWRNORM; 527 529 }
+2
net/ipv4/tcp_input.c
··· 4845 4845 { 4846 4846 if (sock_flag(sk, SOCK_QUEUE_SHRUNK)) { 4847 4847 sock_reset_flag(sk, SOCK_QUEUE_SHRUNK); 4848 + /* pairs with tcp_poll() */ 4849 + smp_mb__after_atomic(); 4848 4850 if (sk->sk_socket && 4849 4851 test_bit(SOCK_NOSPACE, &sk->sk_socket->flags)) 4850 4852 tcp_new_space(sk);