Commit 2f90165c authored by Chas Williams's avatar Chas Williams Committed by David S. Miller

[ATM]: [atmtcp] fix refcounting and vcc search

Signed-off-by: default avatarChas Williams <chas@cmf.nrl.navy.mil>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 71d41b04
...@@ -271,6 +271,28 @@ static void atmtcp_c_close(struct atm_vcc *vcc) ...@@ -271,6 +271,28 @@ static void atmtcp_c_close(struct atm_vcc *vcc)
} }
} }
read_unlock(&vcc_sklist_lock); read_unlock(&vcc_sklist_lock);
module_put(THIS_MODULE);
}
static struct atm_vcc *find_vcc(struct atm_dev *dev, short vpi, int vci)
{
struct hlist_head *head;
struct atm_vcc *vcc;
struct hlist_node *node;
struct sock *s;
head = &vcc_hash[vci & (VCC_HTABLE_SIZE -1)];
sk_for_each(s, node, head) {
vcc = atm_sk(s);
if (vcc->dev == dev &&
vcc->vci == vci && vcc->vpi == vpi &&
vcc->qos.rxtp.traffic_class != ATM_NONE) {
return vcc;
}
}
return NULL;
} }
...@@ -278,11 +300,9 @@ static int atmtcp_c_send(struct atm_vcc *vcc,struct sk_buff *skb) ...@@ -278,11 +300,9 @@ static int atmtcp_c_send(struct atm_vcc *vcc,struct sk_buff *skb)
{ {
struct atm_dev *dev; struct atm_dev *dev;
struct atmtcp_hdr *hdr; struct atmtcp_hdr *hdr;
struct sock *s; struct atm_vcc *out_vcc;
struct hlist_node *node;
struct atm_vcc *out_vcc = NULL;
struct sk_buff *new_skb; struct sk_buff *new_skb;
int i, result = 0; int result = 0;
if (!skb->len) return 0; if (!skb->len) return 0;
dev = vcc->dev_data; dev = vcc->dev_data;
...@@ -293,19 +313,7 @@ static int atmtcp_c_send(struct atm_vcc *vcc,struct sk_buff *skb) ...@@ -293,19 +313,7 @@ static int atmtcp_c_send(struct atm_vcc *vcc,struct sk_buff *skb)
goto done; goto done;
} }
read_lock(&vcc_sklist_lock); read_lock(&vcc_sklist_lock);
for(i = 0; i < VCC_HTABLE_SIZE; ++i) { out_vcc = find_vcc(dev, ntohs(hdr->vpi), ntohs(hdr->vci));
struct hlist_head *head = &vcc_hash[i];
sk_for_each(s, node, head) {
out_vcc = atm_sk(s);
if (out_vcc->dev != dev)
continue;
if (out_vcc->vpi == ntohs(hdr->vpi) &&
out_vcc->vci == ntohs(hdr->vci) &&
out_vcc->qos.rxtp.traffic_class != ATM_NONE)
break;
}
}
read_unlock(&vcc_sklist_lock); read_unlock(&vcc_sklist_lock);
if (!out_vcc) { if (!out_vcc) {
atomic_inc(&vcc->stats->tx_err); atomic_inc(&vcc->stats->tx_err);
......
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