Commit 4f2ba5dc authored by Linus Torvalds's avatar Linus Torvalds

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

Pull networking fixes from David Miller:

 1) Fix refcounting in xfrm_bundle_lookup() when using a dummy bundle,
    from Steffen Klassert.

 2) Fix crypto header handling in rx data frames in ath10k driver, from
    Vasanthakumar Thiagarajan.

 3) Fix use after free of qdisc when we defer tcp_chain_flush() to a
    workqueue. From Cong Wang.

 4) Fix double free in lapbether driver, from Pan Bian.

 5) Sanitize TUNSETSNDBUF values, from Craig Gallek.

 6) Fix refcounting when addrconf_permanent_addr() calls
    ipv6_del_addr(). From Eric Dumazet.

 7) Fix MTU probing bug in TCP that goes back to 2007, from Eric
    Dumazet.

* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net:
  tcp: fix tcp_mtu_probe() vs highest_sack
  ipv6: addrconf: increment ifp refcount before ipv6_del_addr()
  tun/tap: sanitize TUNSETSNDBUF input
  mlxsw: i2c: Fix buffer increment counter for write transaction
  mlxsw: reg: Add high and low temperature thresholds
  MAINTAINERS: Remove Yotam from mlxfw
  MAINTAINERS: Update Yotam's E-mail
  net: hns: set correct return value
  net: lapbether: fix double free
  bpf: remove SK_REDIRECT from UAPI
  net: phy: marvell: Only configure RGMII delays when using RGMII
  xfrm: Fix GSO for IPsec with GRE tunnel.
  tc-testing: fix arg to ip command: -s -> -n
  net_sched: remove tcf_block_put_deferred()
  l2tp: hold tunnel in pppol2tp_connect()
  Revert "ath10k: fix napi_poll budget overflow"
  ath10k: rebuild crypto header in rx data frames
  wcn36xx: Remove unnecessary rcu_read_unlock in wcn36xx_bss_info_changed
  xfrm: Clear sk_dst_cache when applying per-socket policy.
  xfrm: Fix xfrm_dst_cache memleak
parents cb0631fd 2b7cda9c
...@@ -6671,7 +6671,7 @@ F: include/net/ieee802154_netdev.h ...@@ -6671,7 +6671,7 @@ F: include/net/ieee802154_netdev.h
F: Documentation/networking/ieee802154.txt F: Documentation/networking/ieee802154.txt
IFE PROTOCOL IFE PROTOCOL
M: Yotam Gigi <yotamg@mellanox.com> M: Yotam Gigi <yotam.gi@gmail.com>
M: Jamal Hadi Salim <jhs@mojatatu.com> M: Jamal Hadi Salim <jhs@mojatatu.com>
F: net/ife F: net/ife
F: include/net/ife.h F: include/net/ife.h
...@@ -8743,7 +8743,7 @@ Q: http://patchwork.ozlabs.org/project/netdev/list/ ...@@ -8743,7 +8743,7 @@ Q: http://patchwork.ozlabs.org/project/netdev/list/
F: drivers/net/ethernet/mellanox/mlxsw/ F: drivers/net/ethernet/mellanox/mlxsw/
MELLANOX FIRMWARE FLASH LIBRARY (mlxfw) MELLANOX FIRMWARE FLASH LIBRARY (mlxfw)
M: Yotam Gigi <yotamg@mellanox.com> M: mlxsw@mellanox.com
L: netdev@vger.kernel.org L: netdev@vger.kernel.org
S: Supported S: Supported
W: http://www.mellanox.com W: http://www.mellanox.com
...@@ -10890,7 +10890,7 @@ S: Maintained ...@@ -10890,7 +10890,7 @@ S: Maintained
F: drivers/block/ps3vram.c F: drivers/block/ps3vram.c
PSAMPLE PACKET SAMPLING SUPPORT: PSAMPLE PACKET SAMPLING SUPPORT:
M: Yotam Gigi <yotamg@mellanox.com> M: Yotam Gigi <yotam.gi@gmail.com>
S: Maintained S: Maintained
F: net/psample F: net/psample
F: include/net/psample.h F: include/net/psample.h
......
...@@ -2369,8 +2369,8 @@ static int hns_nic_dev_probe(struct platform_device *pdev) ...@@ -2369,8 +2369,8 @@ static int hns_nic_dev_probe(struct platform_device *pdev)
priv->enet_ver = AE_VERSION_2; priv->enet_ver = AE_VERSION_2;
ae_node = of_parse_phandle(dev->of_node, "ae-handle", 0); ae_node = of_parse_phandle(dev->of_node, "ae-handle", 0);
if (IS_ERR_OR_NULL(ae_node)) { if (!ae_node) {
ret = PTR_ERR(ae_node); ret = -ENODEV;
dev_err(dev, "not find ae-handle\n"); dev_err(dev, "not find ae-handle\n");
goto out_read_prop_fail; goto out_read_prop_fail;
} }
......
...@@ -294,7 +294,7 @@ mlxsw_i2c_write(struct device *dev, size_t in_mbox_size, u8 *in_mbox, int num, ...@@ -294,7 +294,7 @@ mlxsw_i2c_write(struct device *dev, size_t in_mbox_size, u8 *in_mbox, int num,
write_tran.len = MLXSW_I2C_ADDR_WIDTH + chunk_size; write_tran.len = MLXSW_I2C_ADDR_WIDTH + chunk_size;
mlxsw_i2c_set_slave_addr(tran_buf, off); mlxsw_i2c_set_slave_addr(tran_buf, off);
memcpy(&tran_buf[MLXSW_I2C_ADDR_BUF_SIZE], in_mbox + memcpy(&tran_buf[MLXSW_I2C_ADDR_BUF_SIZE], in_mbox +
chunk_size * i, chunk_size); MLXSW_I2C_BLK_MAX * i, chunk_size);
j = 0; j = 0;
end = jiffies + timeout; end = jiffies + timeout;
......
...@@ -5827,6 +5827,29 @@ MLXSW_ITEM32(reg, mtmp, mtr, 0x08, 30, 1); ...@@ -5827,6 +5827,29 @@ MLXSW_ITEM32(reg, mtmp, mtr, 0x08, 30, 1);
*/ */
MLXSW_ITEM32(reg, mtmp, max_temperature, 0x08, 0, 16); MLXSW_ITEM32(reg, mtmp, max_temperature, 0x08, 0, 16);
/* reg_mtmp_tee
* Temperature Event Enable.
* 0 - Do not generate event
* 1 - Generate event
* 2 - Generate single event
* Access: RW
*/
MLXSW_ITEM32(reg, mtmp, tee, 0x0C, 30, 2);
#define MLXSW_REG_MTMP_THRESH_HI 0x348 /* 105 Celsius */
/* reg_mtmp_temperature_threshold_hi
* High threshold for Temperature Warning Event. In 0.125 Celsius.
* Access: RW
*/
MLXSW_ITEM32(reg, mtmp, temperature_threshold_hi, 0x0C, 0, 16);
/* reg_mtmp_temperature_threshold_lo
* Low threshold for Temperature Warning Event. In 0.125 Celsius.
* Access: RW
*/
MLXSW_ITEM32(reg, mtmp, temperature_threshold_lo, 0x10, 0, 16);
#define MLXSW_REG_MTMP_SENSOR_NAME_SIZE 8 #define MLXSW_REG_MTMP_SENSOR_NAME_SIZE 8
/* reg_mtmp_sensor_name /* reg_mtmp_sensor_name
...@@ -5843,6 +5866,8 @@ static inline void mlxsw_reg_mtmp_pack(char *payload, u8 sensor_index, ...@@ -5843,6 +5866,8 @@ static inline void mlxsw_reg_mtmp_pack(char *payload, u8 sensor_index,
mlxsw_reg_mtmp_sensor_index_set(payload, sensor_index); mlxsw_reg_mtmp_sensor_index_set(payload, sensor_index);
mlxsw_reg_mtmp_mte_set(payload, max_temp_enable); mlxsw_reg_mtmp_mte_set(payload, max_temp_enable);
mlxsw_reg_mtmp_mtr_set(payload, max_temp_reset); mlxsw_reg_mtmp_mtr_set(payload, max_temp_reset);
mlxsw_reg_mtmp_temperature_threshold_hi_set(payload,
MLXSW_REG_MTMP_THRESH_HI);
} }
static inline void mlxsw_reg_mtmp_unpack(char *payload, unsigned int *p_temp, static inline void mlxsw_reg_mtmp_unpack(char *payload, unsigned int *p_temp,
......
...@@ -681,9 +681,11 @@ static int m88e1116r_config_init(struct phy_device *phydev) ...@@ -681,9 +681,11 @@ static int m88e1116r_config_init(struct phy_device *phydev)
if (err < 0) if (err < 0)
return err; return err;
if (phy_interface_is_rgmii(phydev)) {
err = m88e1121_config_aneg_rgmii_delays(phydev); err = m88e1121_config_aneg_rgmii_delays(phydev);
if (err < 0) if (err < 0)
return err; return err;
}
err = genphy_soft_reset(phydev); err = genphy_soft_reset(phydev);
if (err < 0) if (err < 0)
......
...@@ -1032,6 +1032,8 @@ static long tap_ioctl(struct file *file, unsigned int cmd, ...@@ -1032,6 +1032,8 @@ static long tap_ioctl(struct file *file, unsigned int cmd,
case TUNSETSNDBUF: case TUNSETSNDBUF:
if (get_user(s, sp)) if (get_user(s, sp))
return -EFAULT; return -EFAULT;
if (s <= 0)
return -EINVAL;
q->sk.sk_sndbuf = s; q->sk.sk_sndbuf = s;
return 0; return 0;
......
...@@ -2429,6 +2429,10 @@ static long __tun_chr_ioctl(struct file *file, unsigned int cmd, ...@@ -2429,6 +2429,10 @@ static long __tun_chr_ioctl(struct file *file, unsigned int cmd,
ret = -EFAULT; ret = -EFAULT;
break; break;
} }
if (sndbuf <= 0) {
ret = -EINVAL;
break;
}
tun->sndbuf = sndbuf; tun->sndbuf = sndbuf;
tun_set_sndbuf(tun); tun_set_sndbuf(tun);
......
...@@ -346,7 +346,6 @@ static int lapbeth_new_device(struct net_device *dev) ...@@ -346,7 +346,6 @@ static int lapbeth_new_device(struct net_device *dev)
fail: fail:
dev_put(dev); dev_put(dev);
free_netdev(ndev); free_netdev(ndev);
kfree(lapbeth);
goto out; goto out;
} }
......
This diff is collapsed.
...@@ -239,6 +239,9 @@ enum htt_rx_mpdu_encrypt_type { ...@@ -239,6 +239,9 @@ enum htt_rx_mpdu_encrypt_type {
HTT_RX_MPDU_ENCRYPT_WAPI = 5, HTT_RX_MPDU_ENCRYPT_WAPI = 5,
HTT_RX_MPDU_ENCRYPT_AES_CCM_WPA2 = 6, HTT_RX_MPDU_ENCRYPT_AES_CCM_WPA2 = 6,
HTT_RX_MPDU_ENCRYPT_NONE = 7, HTT_RX_MPDU_ENCRYPT_NONE = 7,
HTT_RX_MPDU_ENCRYPT_AES_CCM256_WPA2 = 8,
HTT_RX_MPDU_ENCRYPT_AES_GCMP_WPA2 = 9,
HTT_RX_MPDU_ENCRYPT_AES_GCMP256_WPA2 = 10,
}; };
#define RX_MPDU_START_INFO0_PEER_IDX_MASK 0x000007ff #define RX_MPDU_START_INFO0_PEER_IDX_MASK 0x000007ff
......
...@@ -812,7 +812,6 @@ static void wcn36xx_bss_info_changed(struct ieee80211_hw *hw, ...@@ -812,7 +812,6 @@ static void wcn36xx_bss_info_changed(struct ieee80211_hw *hw,
if (!sta) { if (!sta) {
wcn36xx_err("sta %pM is not found\n", wcn36xx_err("sta %pM is not found\n",
bss_conf->bssid); bss_conf->bssid);
rcu_read_unlock();
goto out; goto out;
} }
sta_priv = wcn36xx_sta_to_priv(sta); sta_priv = wcn36xx_sta_to_priv(sta);
......
...@@ -1771,12 +1771,12 @@ static inline void tcp_highest_sack_reset(struct sock *sk) ...@@ -1771,12 +1771,12 @@ static inline void tcp_highest_sack_reset(struct sock *sk)
tcp_sk(sk)->highest_sack = tcp_write_queue_head(sk); tcp_sk(sk)->highest_sack = tcp_write_queue_head(sk);
} }
/* Called when old skb is about to be deleted (to be combined with new skb) */ /* Called when old skb is about to be deleted and replaced by new skb */
static inline void tcp_highest_sack_combine(struct sock *sk, static inline void tcp_highest_sack_replace(struct sock *sk,
struct sk_buff *old, struct sk_buff *old,
struct sk_buff *new) struct sk_buff *new)
{ {
if (tcp_sk(sk)->sacked_out && (old == tcp_sk(sk)->highest_sack)) if (old == tcp_highest_sack(sk))
tcp_sk(sk)->highest_sack = new; tcp_sk(sk)->highest_sack = new;
} }
......
...@@ -788,7 +788,6 @@ struct xdp_md { ...@@ -788,7 +788,6 @@ struct xdp_md {
enum sk_action { enum sk_action {
SK_DROP = 0, SK_DROP = 0,
SK_PASS, SK_PASS,
SK_REDIRECT,
}; };
#define BPF_TAG_SIZE 8 #define BPF_TAG_SIZE 8
......
...@@ -101,13 +101,19 @@ static inline void bpf_compute_data_end_sk_skb(struct sk_buff *skb) ...@@ -101,13 +101,19 @@ static inline void bpf_compute_data_end_sk_skb(struct sk_buff *skb)
TCP_SKB_CB(skb)->bpf.data_end = skb->data + skb_headlen(skb); TCP_SKB_CB(skb)->bpf.data_end = skb->data + skb_headlen(skb);
} }
enum __sk_action {
__SK_DROP = 0,
__SK_PASS,
__SK_REDIRECT,
};
static int smap_verdict_func(struct smap_psock *psock, struct sk_buff *skb) static int smap_verdict_func(struct smap_psock *psock, struct sk_buff *skb)
{ {
struct bpf_prog *prog = READ_ONCE(psock->bpf_verdict); struct bpf_prog *prog = READ_ONCE(psock->bpf_verdict);
int rc; int rc;
if (unlikely(!prog)) if (unlikely(!prog))
return SK_DROP; return __SK_DROP;
skb_orphan(skb); skb_orphan(skb);
/* We need to ensure that BPF metadata for maps is also cleared /* We need to ensure that BPF metadata for maps is also cleared
...@@ -122,8 +128,10 @@ static int smap_verdict_func(struct smap_psock *psock, struct sk_buff *skb) ...@@ -122,8 +128,10 @@ static int smap_verdict_func(struct smap_psock *psock, struct sk_buff *skb)
preempt_enable(); preempt_enable();
skb->sk = NULL; skb->sk = NULL;
/* Moving return codes from UAPI namespace into internal namespace */
return rc == SK_PASS ? return rc == SK_PASS ?
(TCP_SKB_CB(skb)->bpf.map ? SK_REDIRECT : SK_PASS) : SK_DROP; (TCP_SKB_CB(skb)->bpf.map ? __SK_REDIRECT : __SK_PASS) :
__SK_DROP;
} }
static void smap_do_verdict(struct smap_psock *psock, struct sk_buff *skb) static void smap_do_verdict(struct smap_psock *psock, struct sk_buff *skb)
...@@ -133,7 +141,7 @@ static void smap_do_verdict(struct smap_psock *psock, struct sk_buff *skb) ...@@ -133,7 +141,7 @@ static void smap_do_verdict(struct smap_psock *psock, struct sk_buff *skb)
rc = smap_verdict_func(psock, skb); rc = smap_verdict_func(psock, skb);
switch (rc) { switch (rc) {
case SK_REDIRECT: case __SK_REDIRECT:
sk = do_sk_redirect_map(skb); sk = do_sk_redirect_map(skb);
if (likely(sk)) { if (likely(sk)) {
struct smap_psock *peer = smap_psock_sk(sk); struct smap_psock *peer = smap_psock_sk(sk);
...@@ -149,7 +157,7 @@ static void smap_do_verdict(struct smap_psock *psock, struct sk_buff *skb) ...@@ -149,7 +157,7 @@ static void smap_do_verdict(struct smap_psock *psock, struct sk_buff *skb)
} }
} }
/* Fall through and free skb otherwise */ /* Fall through and free skb otherwise */
case SK_DROP: case __SK_DROP:
default: default:
kfree_skb(skb); kfree_skb(skb);
} }
......
...@@ -137,6 +137,6 @@ int ife_tlv_meta_encode(void *skbdata, u16 attrtype, u16 dlen, const void *dval) ...@@ -137,6 +137,6 @@ int ife_tlv_meta_encode(void *skbdata, u16 attrtype, u16 dlen, const void *dval)
EXPORT_SYMBOL_GPL(ife_tlv_meta_encode); EXPORT_SYMBOL_GPL(ife_tlv_meta_encode);
MODULE_AUTHOR("Jamal Hadi Salim <jhs@mojatatu.com>"); MODULE_AUTHOR("Jamal Hadi Salim <jhs@mojatatu.com>");
MODULE_AUTHOR("Yotam Gigi <yotamg@mellanox.com>"); MODULE_AUTHOR("Yotam Gigi <yotam.gi@gmail.com>");
MODULE_DESCRIPTION("Inter-FE LFB action"); MODULE_DESCRIPTION("Inter-FE LFB action");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
...@@ -2062,6 +2062,7 @@ static int tcp_mtu_probe(struct sock *sk) ...@@ -2062,6 +2062,7 @@ static int tcp_mtu_probe(struct sock *sk)
nskb->ip_summed = skb->ip_summed; nskb->ip_summed = skb->ip_summed;
tcp_insert_write_queue_before(nskb, skb, sk); tcp_insert_write_queue_before(nskb, skb, sk);
tcp_highest_sack_replace(sk, skb, nskb);
len = 0; len = 0;
tcp_for_write_queue_from_safe(skb, next, sk) { tcp_for_write_queue_from_safe(skb, next, sk) {
...@@ -2665,7 +2666,7 @@ static bool tcp_collapse_retrans(struct sock *sk, struct sk_buff *skb) ...@@ -2665,7 +2666,7 @@ static bool tcp_collapse_retrans(struct sock *sk, struct sk_buff *skb)
else if (!skb_shift(skb, next_skb, next_skb_size)) else if (!skb_shift(skb, next_skb, next_skb_size))
return false; return false;
} }
tcp_highest_sack_combine(sk, next_skb, skb); tcp_highest_sack_replace(sk, next_skb, skb);
tcp_unlink_write_queue(next_skb, sk); tcp_unlink_write_queue(next_skb, sk);
......
...@@ -3335,6 +3335,7 @@ static void addrconf_permanent_addr(struct net_device *dev) ...@@ -3335,6 +3335,7 @@ static void addrconf_permanent_addr(struct net_device *dev)
if ((ifp->flags & IFA_F_PERMANENT) && if ((ifp->flags & IFA_F_PERMANENT) &&
fixup_permanent_addr(idev, ifp) < 0) { fixup_permanent_addr(idev, ifp) < 0) {
write_unlock_bh(&idev->lock); write_unlock_bh(&idev->lock);
in6_ifa_hold(ifp);
ipv6_del_addr(ifp); ipv6_del_addr(ifp);
write_lock_bh(&idev->lock); write_lock_bh(&idev->lock);
......
...@@ -584,6 +584,7 @@ static int pppol2tp_connect(struct socket *sock, struct sockaddr *uservaddr, ...@@ -584,6 +584,7 @@ static int pppol2tp_connect(struct socket *sock, struct sockaddr *uservaddr,
u32 tunnel_id, peer_tunnel_id; u32 tunnel_id, peer_tunnel_id;
u32 session_id, peer_session_id; u32 session_id, peer_session_id;
bool drop_refcnt = false; bool drop_refcnt = false;
bool drop_tunnel = false;
int ver = 2; int ver = 2;
int fd; int fd;
...@@ -652,7 +653,9 @@ static int pppol2tp_connect(struct socket *sock, struct sockaddr *uservaddr, ...@@ -652,7 +653,9 @@ static int pppol2tp_connect(struct socket *sock, struct sockaddr *uservaddr,
if (tunnel_id == 0) if (tunnel_id == 0)
goto end; goto end;
tunnel = l2tp_tunnel_find(sock_net(sk), tunnel_id); tunnel = l2tp_tunnel_get(sock_net(sk), tunnel_id);
if (tunnel)
drop_tunnel = true;
/* Special case: create tunnel context if session_id and /* Special case: create tunnel context if session_id and
* peer_session_id is 0. Otherwise look up tunnel using supplied * peer_session_id is 0. Otherwise look up tunnel using supplied
...@@ -781,6 +784,8 @@ static int pppol2tp_connect(struct socket *sock, struct sockaddr *uservaddr, ...@@ -781,6 +784,8 @@ static int pppol2tp_connect(struct socket *sock, struct sockaddr *uservaddr,
end: end:
if (drop_refcnt) if (drop_refcnt)
l2tp_session_dec_refcount(session); l2tp_session_dec_refcount(session);
if (drop_tunnel)
l2tp_tunnel_dec_refcount(tunnel);
release_sock(sk); release_sock(sk);
return error; return error;
......
...@@ -296,6 +296,6 @@ static void __exit psample_module_exit(void) ...@@ -296,6 +296,6 @@ static void __exit psample_module_exit(void)
module_init(psample_module_init); module_init(psample_module_init);
module_exit(psample_module_exit); module_exit(psample_module_exit);
MODULE_AUTHOR("Yotam Gigi <yotamg@mellanox.com>"); MODULE_AUTHOR("Yotam Gigi <yotam.gi@gmail.com>");
MODULE_DESCRIPTION("netlink channel for packet sampling"); MODULE_DESCRIPTION("netlink channel for packet sampling");
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");
...@@ -271,6 +271,6 @@ static void __exit sample_cleanup_module(void) ...@@ -271,6 +271,6 @@ static void __exit sample_cleanup_module(void)
module_init(sample_init_module); module_init(sample_init_module);
module_exit(sample_cleanup_module); module_exit(sample_cleanup_module);
MODULE_AUTHOR("Yotam Gigi <yotamg@mellanox.com>"); MODULE_AUTHOR("Yotam Gigi <yotam.gi@gmail.com>");
MODULE_DESCRIPTION("Packet sampling action"); MODULE_DESCRIPTION("Packet sampling action");
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");
...@@ -280,8 +280,8 @@ static void tcf_block_put_final(struct work_struct *work) ...@@ -280,8 +280,8 @@ static void tcf_block_put_final(struct work_struct *work)
struct tcf_block *block = container_of(work, struct tcf_block, work); struct tcf_block *block = container_of(work, struct tcf_block, work);
struct tcf_chain *chain, *tmp; struct tcf_chain *chain, *tmp;
/* At this point, all the chains should have refcnt == 1. */
rtnl_lock(); rtnl_lock();
/* Only chain 0 should be still here. */
list_for_each_entry_safe(chain, tmp, &block->chain_list, list) list_for_each_entry_safe(chain, tmp, &block->chain_list, list)
tcf_chain_put(chain); tcf_chain_put(chain);
rtnl_unlock(); rtnl_unlock();
...@@ -289,23 +289,17 @@ static void tcf_block_put_final(struct work_struct *work) ...@@ -289,23 +289,17 @@ static void tcf_block_put_final(struct work_struct *work)
} }
/* XXX: Standalone actions are not allowed to jump to any chain, and bound /* XXX: Standalone actions are not allowed to jump to any chain, and bound
* actions should be all removed after flushing. However, filters are destroyed * actions should be all removed after flushing. However, filters are now
* in RCU callbacks, we have to hold the chains first, otherwise we would * destroyed in tc filter workqueue with RTNL lock, they can not race here.
* always race with RCU callbacks on this list without proper locking.
*/ */
static void tcf_block_put_deferred(struct work_struct *work) void tcf_block_put(struct tcf_block *block)
{ {
struct tcf_block *block = container_of(work, struct tcf_block, work); struct tcf_chain *chain, *tmp;
struct tcf_chain *chain;
rtnl_lock(); if (!block)
/* Hold a refcnt for all chains, except 0, in case they are gone. */ return;
list_for_each_entry(chain, &block->chain_list, list)
if (chain->index)
tcf_chain_hold(chain);
/* No race on the list, because no chain could be destroyed. */ list_for_each_entry_safe(chain, tmp, &block->chain_list, list)
list_for_each_entry(chain, &block->chain_list, list)
tcf_chain_flush(chain); tcf_chain_flush(chain);
INIT_WORK(&block->work, tcf_block_put_final); INIT_WORK(&block->work, tcf_block_put_final);
...@@ -314,21 +308,6 @@ static void tcf_block_put_deferred(struct work_struct *work) ...@@ -314,21 +308,6 @@ static void tcf_block_put_deferred(struct work_struct *work)
*/ */
rcu_barrier(); rcu_barrier();
tcf_queue_work(&block->work); tcf_queue_work(&block->work);
rtnl_unlock();
}
void tcf_block_put(struct tcf_block *block)
{
if (!block)
return;
INIT_WORK(&block->work, tcf_block_put_deferred);
/* Wait for existing RCU callbacks to cool down, make sure their works
* have been queued before this. We can not flush pending works here
* because we are holding the RTNL lock.
*/
rcu_barrier();
tcf_queue_work(&block->work);
} }
EXPORT_SYMBOL(tcf_block_put); EXPORT_SYMBOL(tcf_block_put);
......
...@@ -105,6 +105,9 @@ static int xfrm_output_one(struct sk_buff *skb, int err) ...@@ -105,6 +105,9 @@ static int xfrm_output_one(struct sk_buff *skb, int err)
if (xfrm_offload(skb)) { if (xfrm_offload(skb)) {
x->type_offload->encap(x, skb); x->type_offload->encap(x, skb);
} else { } else {
/* Inner headers are invalid now. */
skb->encapsulation = 0;
err = x->type->output(x, skb); err = x->type->output(x, skb);
if (err == -EINPROGRESS) if (err == -EINPROGRESS)
goto out; goto out;
...@@ -208,7 +211,6 @@ int xfrm_output(struct sock *sk, struct sk_buff *skb) ...@@ -208,7 +211,6 @@ int xfrm_output(struct sock *sk, struct sk_buff *skb)
int err; int err;
secpath_reset(skb); secpath_reset(skb);
skb->encapsulation = 0;
if (xfrm_dev_offload_ok(skb, x)) { if (xfrm_dev_offload_ok(skb, x)) {
struct sec_path *sp; struct sec_path *sp;
......
...@@ -2076,7 +2076,6 @@ xfrm_bundle_lookup(struct net *net, const struct flowi *fl, u16 family, u8 dir, ...@@ -2076,7 +2076,6 @@ xfrm_bundle_lookup(struct net *net, const struct flowi *fl, u16 family, u8 dir,
xdst->num_xfrms = num_xfrms; xdst->num_xfrms = num_xfrms;
memcpy(xdst->pols, pols, sizeof(struct xfrm_policy *) * num_pols); memcpy(xdst->pols, pols, sizeof(struct xfrm_policy *) * num_pols);
dst_hold(&xdst->u.dst);
return xdst; return xdst;
inc_error: inc_error:
......
...@@ -2069,6 +2069,7 @@ int xfrm_user_policy(struct sock *sk, int optname, u8 __user *optval, int optlen ...@@ -2069,6 +2069,7 @@ int xfrm_user_policy(struct sock *sk, int optname, u8 __user *optval, int optlen
if (err >= 0) { if (err >= 0) {
xfrm_sk_policy_insert(sk, err, pol); xfrm_sk_policy_insert(sk, err, pol);
xfrm_pol_put(pol); xfrm_pol_put(pol);
__sk_dst_reset(sk);
err = 0; err = 0;
} }
......
...@@ -576,7 +576,7 @@ union bpf_attr { ...@@ -576,7 +576,7 @@ union bpf_attr {
* @map: pointer to sockmap * @map: pointer to sockmap
* @key: key to lookup sock in map * @key: key to lookup sock in map
* @flags: reserved for future use * @flags: reserved for future use
* Return: SK_REDIRECT * Return: SK_PASS
* *
* int bpf_sock_map_update(skops, map, key, flags) * int bpf_sock_map_update(skops, map, key, flags)
* @skops: pointer to bpf_sock_ops * @skops: pointer to bpf_sock_ops
...@@ -789,7 +789,6 @@ struct xdp_md { ...@@ -789,7 +789,6 @@ struct xdp_md {
enum sk_action { enum sk_action {
SK_DROP = 0, SK_DROP = 0,
SK_PASS, SK_PASS,
SK_REDIRECT,
}; };
#define BPF_TAG_SIZE 8 #define BPF_TAG_SIZE 8
......
...@@ -152,11 +152,11 @@ def ns_create(): ...@@ -152,11 +152,11 @@ def ns_create():
exec_cmd(cmd, False) exec_cmd(cmd, False)
cmd = 'ip link set $DEV0 up' cmd = 'ip link set $DEV0 up'
exec_cmd(cmd, False) exec_cmd(cmd, False)
cmd = 'ip -s $NS link set $DEV1 up' cmd = 'ip -n $NS link set $DEV1 up'
exec_cmd(cmd, False) exec_cmd(cmd, False)
cmd = 'ip link set $DEV2 netns $NS' cmd = 'ip link set $DEV2 netns $NS'
exec_cmd(cmd, False) exec_cmd(cmd, False)
cmd = 'ip -s $NS link set $DEV2 up' cmd = 'ip -n $NS link set $DEV2 up'
exec_cmd(cmd, False) exec_cmd(cmd, False)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment