Commit d1ffbf28 authored by Jakub Kicinski's avatar Jakub Kicinski

Merge branch 'chelsio-chtls-fix-inline-tls-bugs'

Vinay Kumar Yadav says:

====================
chelsio/chtls: Fix inline tls bugs

This series of patches fix following bugs in chelsio inline tls driver.

Patch1: Fix incorrect socket lock.
Patch2: correct netdevice for vlan interface.
Patch3: Fix panic when server is listening on ipv6.
Patch4: Fix panic when listen on multiadapter.
Patch5: correct function return and return type.
Patch6: Fix writing freed memory.
====================

Link: https://lore.kernel.org/r/20201019115025.24233-1-vinay.yadav@chelsio.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents 280e3ebd da1a039b
...@@ -92,11 +92,13 @@ static void chtls_sock_release(struct kref *ref) ...@@ -92,11 +92,13 @@ static void chtls_sock_release(struct kref *ref)
static struct net_device *chtls_find_netdev(struct chtls_dev *cdev, static struct net_device *chtls_find_netdev(struct chtls_dev *cdev,
struct sock *sk) struct sock *sk)
{ {
struct adapter *adap = pci_get_drvdata(cdev->pdev);
struct net_device *ndev = cdev->ports[0]; struct net_device *ndev = cdev->ports[0];
#if IS_ENABLED(CONFIG_IPV6) #if IS_ENABLED(CONFIG_IPV6)
struct net_device *temp; struct net_device *temp;
int addr_type; int addr_type;
#endif #endif
int i;
switch (sk->sk_family) { switch (sk->sk_family) {
case PF_INET: case PF_INET:
...@@ -127,8 +129,12 @@ static struct net_device *chtls_find_netdev(struct chtls_dev *cdev, ...@@ -127,8 +129,12 @@ static struct net_device *chtls_find_netdev(struct chtls_dev *cdev,
return NULL; return NULL;
if (is_vlan_dev(ndev)) if (is_vlan_dev(ndev))
return vlan_dev_real_dev(ndev); ndev = vlan_dev_real_dev(ndev);
for_each_port(adap, i)
if (cdev->ports[i] == ndev)
return ndev; return ndev;
return NULL;
} }
static void assign_rxopt(struct sock *sk, unsigned int opt) static void assign_rxopt(struct sock *sk, unsigned int opt)
...@@ -477,7 +483,6 @@ void chtls_destroy_sock(struct sock *sk) ...@@ -477,7 +483,6 @@ void chtls_destroy_sock(struct sock *sk)
chtls_purge_write_queue(sk); chtls_purge_write_queue(sk);
free_tls_keyid(sk); free_tls_keyid(sk);
kref_put(&csk->kref, chtls_sock_release); kref_put(&csk->kref, chtls_sock_release);
csk->cdev = NULL;
if (sk->sk_family == AF_INET) if (sk->sk_family == AF_INET)
sk->sk_prot = &tcp_prot; sk->sk_prot = &tcp_prot;
#if IS_ENABLED(CONFIG_IPV6) #if IS_ENABLED(CONFIG_IPV6)
...@@ -736,14 +741,13 @@ void chtls_listen_stop(struct chtls_dev *cdev, struct sock *sk) ...@@ -736,14 +741,13 @@ void chtls_listen_stop(struct chtls_dev *cdev, struct sock *sk)
#if IS_ENABLED(CONFIG_IPV6) #if IS_ENABLED(CONFIG_IPV6)
if (sk->sk_family == PF_INET6) { if (sk->sk_family == PF_INET6) {
struct chtls_sock *csk; struct net_device *ndev = chtls_find_netdev(cdev, sk);
int addr_type = 0; int addr_type = 0;
csk = rcu_dereference_sk_user_data(sk);
addr_type = ipv6_addr_type((const struct in6_addr *) addr_type = ipv6_addr_type((const struct in6_addr *)
&sk->sk_v6_rcv_saddr); &sk->sk_v6_rcv_saddr);
if (addr_type != IPV6_ADDR_ANY) if (addr_type != IPV6_ADDR_ANY)
cxgb4_clip_release(csk->egress_dev, (const u32 *) cxgb4_clip_release(ndev, (const u32 *)
&sk->sk_v6_rcv_saddr, 1); &sk->sk_v6_rcv_saddr, 1);
} }
#endif #endif
...@@ -1157,6 +1161,9 @@ static struct sock *chtls_recv_sock(struct sock *lsk, ...@@ -1157,6 +1161,9 @@ static struct sock *chtls_recv_sock(struct sock *lsk,
ndev = n->dev; ndev = n->dev;
if (!ndev) if (!ndev)
goto free_dst; goto free_dst;
if (is_vlan_dev(ndev))
ndev = vlan_dev_real_dev(ndev);
port_id = cxgb4_port_idx(ndev); port_id = cxgb4_port_idx(ndev);
csk = chtls_sock_create(cdev); csk = chtls_sock_create(cdev);
......
...@@ -902,9 +902,9 @@ static int chtls_skb_copy_to_page_nocache(struct sock *sk, ...@@ -902,9 +902,9 @@ static int chtls_skb_copy_to_page_nocache(struct sock *sk,
return 0; return 0;
} }
static int csk_mem_free(struct chtls_dev *cdev, struct sock *sk) static bool csk_mem_free(struct chtls_dev *cdev, struct sock *sk)
{ {
return (cdev->max_host_sndbuf - sk->sk_wmem_queued); return (cdev->max_host_sndbuf - sk->sk_wmem_queued > 0);
} }
static int csk_wait_memory(struct chtls_dev *cdev, static int csk_wait_memory(struct chtls_dev *cdev,
...@@ -1240,6 +1240,7 @@ int chtls_sendpage(struct sock *sk, struct page *page, ...@@ -1240,6 +1240,7 @@ int chtls_sendpage(struct sock *sk, struct page *page,
copied = 0; copied = 0;
csk = rcu_dereference_sk_user_data(sk); csk = rcu_dereference_sk_user_data(sk);
cdev = csk->cdev; cdev = csk->cdev;
lock_sock(sk);
timeo = sock_sndtimeo(sk, flags & MSG_DONTWAIT); timeo = sock_sndtimeo(sk, flags & MSG_DONTWAIT);
err = sk_stream_wait_connect(sk, &timeo); err = sk_stream_wait_connect(sk, &timeo);
......
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