patch-2.4.21 linux-2.4.21/net/atm/lec.c
Next file: linux-2.4.21/net/atm/lec.h
Previous file: linux-2.4.21/net/atm/common.c
Back to the patch index
Back to the overall index
- Lines: 191
- Date:
2003-06-13 07:51:39.000000000 -0700
- Orig file:
linux-2.4.20/net/atm/lec.c
- Orig date:
2001-09-30 12:26:08.000000000 -0700
diff -urN linux-2.4.20/net/atm/lec.c linux-2.4.21/net/atm/lec.c
@@ -123,7 +123,7 @@
priv = (struct lec_priv *)dev->priv;
atm_force_charge(priv->lecd, skb2->truesize);
- skb_queue_tail(&priv->lecd->recvq, skb2);
+ skb_queue_tail(&priv->lecd->sk->receive_queue, skb2);
wake_up(&priv->lecd->sleep);
}
@@ -204,7 +204,8 @@
struct lecdatahdr_8023 *lec_h;
struct atm_vcc *send_vcc;
struct lec_arp_table *entry;
- unsigned char *nb, *dst;
+ unsigned char *dst;
+ int min_frame_size;
#ifdef CONFIG_TR
unsigned char rdesc[ETH_ALEN]; /* Token Ring route descriptor */
#endif
@@ -275,26 +276,24 @@
#endif /* DUMP_PACKETS > 0 */
/* Minimum ethernet-frame size */
- if (skb->len <62) {
- if (skb->truesize < 62) {
- printk("%s:data packet %d / %d\n",
- dev->name,
- skb->len,skb->truesize);
- nb=(unsigned char*)kmalloc(64, GFP_ATOMIC);
- if (nb == NULL) {
+#ifdef CONFIG_TR
+ if (priv->is_trdev)
+ min_frame_size = LEC_MINIMUM_8025_SIZE;
+ else
+#endif
+ min_frame_size = LEC_MINIMUM_8023_SIZE;
+ if (skb->len < min_frame_size) {
+ if (skb->truesize < min_frame_size) {
+ skb2 = skb_copy_expand(skb, 0,
+ min_frame_size - skb->truesize, GFP_ATOMIC);
dev_kfree_skb(skb);
+ if (skb2 == NULL) {
+ priv->stats.tx_dropped++;
return 0;
}
- memcpy(nb,skb->data,skb->len);
- kfree(skb->head);
- skb->head = skb->data = nb;
- skb->tail = nb+62;
- skb->end = nb+64;
- skb->len=62;
- skb->truesize = 64;
- } else {
- skb->len = 62;
+ skb = skb2;
}
+ skb_put(skb, min_frame_size - skb->len);
}
/* Send to right vcc */
@@ -347,7 +346,7 @@
DPRINTK("%s:sending to vpi:%d vci:%d\n", dev->name,
send_vcc->vpi, send_vcc->vci);
if (atm_may_send(send_vcc, skb2->len)) {
- atomic_add(skb2->truesize, &send_vcc->tx_inuse);
+ atomic_add(skb2->truesize, &send_vcc->sk->wmem_alloc);
priv->stats.tx_packets++;
priv->stats.tx_bytes += skb2->len;
send_vcc->send(send_vcc, skb2);
@@ -361,7 +360,7 @@
ATM_SKB(skb)->iovcnt = 0;
ATM_SKB(skb)->atm_options = send_vcc->atm_options;
if (atm_may_send(send_vcc, skb->len)) {
- atomic_add(skb->truesize, &send_vcc->tx_inuse);
+ atomic_add(skb->truesize, &send_vcc->sk->wmem_alloc);
priv->stats.tx_packets++;
priv->stats.tx_bytes += skb->len;
send_vcc->send(send_vcc, skb);
@@ -405,7 +404,7 @@
int i;
char *tmp; /* FIXME */
- atomic_sub(skb->truesize+ATM_PDU_OVHD, &vcc->tx_inuse);
+ atomic_sub(skb->truesize+ATM_PDU_OVHD, &vcc->sk->wmem_alloc);
mesg = (struct atmlec_msg *)skb->data;
tmp = skb->data;
tmp += sizeof(struct atmlec_msg);
@@ -511,7 +510,7 @@
skb2->len = sizeof(struct atmlec_msg);
memcpy(skb2->data, mesg, sizeof(struct atmlec_msg));
atm_force_charge(priv->lecd, skb2->truesize);
- skb_queue_tail(&priv->lecd->recvq, skb2);
+ skb_queue_tail(&priv->lecd->sk->receive_queue, skb2);
wake_up(&priv->lecd->sleep);
}
if (f != NULL) br_fdb_put_hook(f);
@@ -540,10 +539,10 @@
netif_stop_queue(dev);
lec_arp_destroy(priv);
- if (skb_peek(&vcc->recvq))
+ if (skb_peek(&vcc->sk->receive_queue))
printk("%s lec_atm_close: closing with messages pending\n",
dev->name);
- while ((skb = skb_dequeue(&vcc->recvq))) {
+ while ((skb = skb_dequeue(&vcc->sk->receive_queue))) {
atm_return(vcc, skb->truesize);
dev_kfree_skb(skb);
}
@@ -601,13 +600,13 @@
memcpy(&mesg->content.normal.atm_addr, atm_addr, ATM_ESA_LEN);
atm_force_charge(priv->lecd, skb->truesize);
- skb_queue_tail(&priv->lecd->recvq, skb);
+ skb_queue_tail(&priv->lecd->sk->receive_queue, skb);
wake_up(&priv->lecd->sleep);
if (data != NULL) {
DPRINTK("lec: about to send %d bytes of data\n", data->len);
atm_force_charge(priv->lecd, data->truesize);
- skb_queue_tail(&priv->lecd->recvq, data);
+ skb_queue_tail(&priv->lecd->sk->receive_queue, data);
wake_up(&priv->lecd->sleep);
}
@@ -623,6 +622,14 @@
return 0;
}
+static void lec_set_multicast_list(struct net_device *dev)
+{
+ /* by default, all multicast frames arrive over the bus.
+ * eventually support selective multicast service
+ */
+ return;
+}
+
static void
lec_init(struct net_device *dev)
{
@@ -632,7 +639,7 @@
dev->hard_start_xmit = lec_send_packet;
dev->get_stats = lec_get_stats;
- dev->set_multicast_list = NULL;
+ dev->set_multicast_list = lec_set_multicast_list;
dev->do_ioctl = NULL;
printk("%s: Initialized!\n",dev->name);
return;
@@ -681,7 +688,7 @@
#endif /* DUMP_PACKETS > 0 */
if (memcmp(skb->data, lec_ctrl_magic, 4) ==0) { /* Control frame, to daemon*/
DPRINTK("%s: To daemon\n",dev->name);
- skb_queue_tail(&vcc->recvq, skb);
+ skb_queue_tail(&vcc->sk->receive_queue, skb);
wake_up(&vcc->sleep);
} else { /* Data frame, queue to protocol handlers */
unsigned char *dst;
@@ -711,7 +718,7 @@
lec_arp_check_empties(priv, vcc, skb);
}
skb->dev = dev;
- skb->data += 2; /* skip lec_id */
+ skb_pull(skb, 2); /* skip lec_id */
#ifdef CONFIG_TR
if (priv->is_trdev) skb->protocol = tr_type_trans(skb, dev);
else
@@ -782,16 +789,20 @@
size = sizeof(struct lec_priv);
#ifdef CONFIG_TR
if (is_trdev)
- dev_lec[i] = init_trdev(NULL, size);
+ dev_lec[i] = alloc_trdev(size);
else
#endif
- dev_lec[i] = init_etherdev(NULL, size);
+ dev_lec[i] = alloc_etherdev(size);
if (!dev_lec[i])
return -ENOMEM;
+ snprintf(dev_lec[i]->name, IFNAMSIZ, "lec%d", i);
+ if (register_netdev(dev_lec[i])) {
+ kfree(dev_lec[i]);
+ return -EINVAL;
+ }
priv = dev_lec[i]->priv;
priv->is_trdev = is_trdev;
- sprintf(dev_lec[i]->name, "lec%d", i);
lec_init(dev_lec[i]);
} else {
priv = dev_lec[i]->priv;
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)