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
This commit is contained in:
Коммит
8aaa51b63c
|
@ -1251,8 +1251,7 @@ int mv88e6xxx_setup_port_common(struct dsa_switch *ds, int port)
|
|||
/* Port Control 1: disable trunking, disable sending
|
||||
* learning messages to this port.
|
||||
*/
|
||||
ret = _mv88e6xxx_reg_write(ds, REG_PORT(port), PORT_DEFAULT_VLAN,
|
||||
0x0000);
|
||||
ret = _mv88e6xxx_reg_write(ds, REG_PORT(port), PORT_CONTROL_1, 0x0000);
|
||||
if (ret)
|
||||
goto abort;
|
||||
|
||||
|
@ -1275,7 +1274,8 @@ int mv88e6xxx_setup_port_common(struct dsa_switch *ds, int port)
|
|||
/* Default VLAN ID and priority: don't set a default VLAN
|
||||
* ID, and set the default packet priority to zero.
|
||||
*/
|
||||
ret = _mv88e6xxx_reg_write(ds, REG_PORT(port), 0x07, 0x0000);
|
||||
ret = _mv88e6xxx_reg_write(ds, REG_PORT(port), PORT_DEFAULT_VLAN,
|
||||
0x0000);
|
||||
abort:
|
||||
mutex_unlock(&ps->smi_mutex);
|
||||
return ret;
|
||||
|
|
|
@ -72,7 +72,6 @@ struct msgdma_extended_desc {
|
|||
#define MSGDMA_DESC_CTL_TX_SINGLE (MSGDMA_DESC_CTL_GEN_SOP | \
|
||||
MSGDMA_DESC_CTL_GEN_EOP | \
|
||||
MSGDMA_DESC_CTL_TR_COMP_IRQ | \
|
||||
MSGDMA_DESC_CTL_TR_ERR_IRQ | \
|
||||
MSGDMA_DESC_CTL_GO)
|
||||
|
||||
#define MSGDMA_DESC_CTL_RX_SINGLE (MSGDMA_DESC_CTL_END_ON_EOP | \
|
||||
|
|
|
@ -781,10 +781,10 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
|
|||
MLX4_GET(field, outbox, QUERY_DEV_CAP_VL_PORT_OFFSET);
|
||||
dev_cap->num_ports = field & 0xf;
|
||||
MLX4_GET(field, outbox, QUERY_DEV_CAP_MAX_MSG_SZ_OFFSET);
|
||||
dev_cap->max_msg_sz = 1 << (field & 0x1f);
|
||||
MLX4_GET(field, outbox, QUERY_DEV_CAP_PORT_FLOWSTATS_COUNTERS_OFFSET);
|
||||
if (field & 0x10)
|
||||
dev_cap->flags2 |= MLX4_DEV_CAP_FLAG2_FLOWSTATS_EN;
|
||||
dev_cap->max_msg_sz = 1 << (field & 0x1f);
|
||||
MLX4_GET(field, outbox, QUERY_DEV_CAP_FLOW_STEERING_RANGE_EN_OFFSET);
|
||||
if (field & 0x80)
|
||||
dev_cap->flags2 |= MLX4_DEV_CAP_FLAG2_FS_EN;
|
||||
|
|
|
@ -1716,6 +1716,7 @@ ppp_receive_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch)
|
|||
{
|
||||
/* note: a 0-length skb is used as an error indication */
|
||||
if (skb->len > 0) {
|
||||
skb_checksum_complete_unset(skb);
|
||||
#ifdef CONFIG_PPP_MULTILINK
|
||||
/* XXX do channel-level decompression here */
|
||||
if (PPP_PROTO(skb) == PPP_MP)
|
||||
|
|
|
@ -380,6 +380,9 @@ static int pppoe_rcv_core(struct sock *sk, struct sk_buff *skb)
|
|||
* can't change.
|
||||
*/
|
||||
|
||||
if (skb->pkt_type == PACKET_OTHERHOST)
|
||||
goto abort_kfree;
|
||||
|
||||
if (sk->sk_state & PPPOX_BOUND) {
|
||||
ppp_input(&po->chan, skb);
|
||||
} else if (sk->sk_state & PPPOX_RELAY) {
|
||||
|
|
|
@ -3016,6 +3016,18 @@ static inline bool __skb_checksum_validate_needed(struct sk_buff *skb,
|
|||
*/
|
||||
#define CHECKSUM_BREAK 76
|
||||
|
||||
/* Unset checksum-complete
|
||||
*
|
||||
* Unset checksum complete can be done when packet is being modified
|
||||
* (uncompressed for instance) and checksum-complete value is
|
||||
* invalidated.
|
||||
*/
|
||||
static inline void skb_checksum_complete_unset(struct sk_buff *skb)
|
||||
{
|
||||
if (skb->ip_summed == CHECKSUM_COMPLETE)
|
||||
skb->ip_summed = CHECKSUM_NONE;
|
||||
}
|
||||
|
||||
/* Validate (init) checksum based on checksum complete.
|
||||
*
|
||||
* Return values:
|
||||
|
|
|
@ -82,6 +82,9 @@ int ip_forward(struct sk_buff *skb)
|
|||
if (skb->pkt_type != PACKET_HOST)
|
||||
goto drop;
|
||||
|
||||
if (unlikely(skb->sk))
|
||||
goto drop;
|
||||
|
||||
if (skb_warn_if_lro(skb))
|
||||
goto drop;
|
||||
|
||||
|
|
|
@ -520,8 +520,10 @@ unsigned int tcp_poll(struct file *file, struct socket *sock, poll_table *wait)
|
|||
|
||||
/* Race breaker. If space is freed after
|
||||
* wspace test but before the flags are set,
|
||||
* IO signal will be lost.
|
||||
* IO signal will be lost. Memory barrier
|
||||
* pairs with the input side.
|
||||
*/
|
||||
smp_mb__after_atomic();
|
||||
if (sk_stream_is_writeable(sk))
|
||||
mask |= POLLOUT | POLLWRNORM;
|
||||
}
|
||||
|
|
|
@ -4845,6 +4845,8 @@ static void tcp_check_space(struct sock *sk)
|
|||
{
|
||||
if (sock_flag(sk, SOCK_QUEUE_SHRUNK)) {
|
||||
sock_reset_flag(sk, SOCK_QUEUE_SHRUNK);
|
||||
/* pairs with tcp_poll() */
|
||||
smp_mb__after_atomic();
|
||||
if (sk->sk_socket &&
|
||||
test_bit(SOCK_NOSPACE, &sk->sk_socket->flags))
|
||||
tcp_new_space(sk);
|
||||
|
|
Загрузка…
Ссылка в новой задаче