}
}
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;
}
{
struct atm_dev *dev;
struct atmtcp_hdr *hdr;
- struct atm_vcc *out_vcc;
+ struct sock *s;
+ struct hlist_node *node;
+ struct atm_vcc *out_vcc = NULL;
struct sk_buff *new_skb;
- int result = 0;
+ int i, result = 0;
if (!skb->len) return 0;
dev = vcc->dev_data;
goto done;
}
read_lock(&vcc_sklist_lock);
- out_vcc = find_vcc(dev, ntohs(hdr->vpi), ntohs(hdr->vci));
+ for(i = 0; i < VCC_HTABLE_SIZE; ++i) {
+ 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);
if (!out_vcc) {
atomic_inc(&vcc->stats->tx_err);