MHonArc test archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: using linux at atm/ethernet gateway ... problems



> I have a PPro200 (RH4.2) with a 2.0.29 kernel and the linux atm-0.31
> code. It has a eepro100 card and a fore sba200e card driven by the
> 0.2 version driver module. The sba200e is hooked up to a fore asx200 and
> the linux box is using the led zepplelin LANE client to fore LANE services.
> 
> Im trying to use this box as a ethernet/LANE gateway.

This is one of the known bugs in the pca200e module version 0.2.


Explanation:
	Packets from ethernet are 4 byte aligned in memory when as arrive.
	Ethernet encapsulation uses a different header size than that of
	Classical IP or LANE -> the PDU to send is not 4 bytes aligned.


Problem:
	The pca200e module version 0.2 doesn't test for unaligned PDUs. The
	address of a PDU is written into the card. The card ignores the lower
	two bits of the address -> additional bytes at the start, missing
	bytes at the end.


Quick-Fix:

	1. Add a new member txbuff to the end of the qhost_tx struct in
	   pca200e.h:

		  void*     txbuff; /* used in case of misaligned data      */

	2. Add code to pca200e_send() to detect unaligned PDUs obtain a
	   temporary (4 byte aligned) buffer and copy the PDU into the buffer.
	   Write the buffer's address into the card.

	   instead of:

		  tpd->segment[0].buffer = skb->data;

	   it might look like this:

		  if (!(((unsigned long)(skb->data)) & 0x00000003))
		    tpd->segment[0].buffer = skb->data;
		  else
		    {
		      DPRINTK("pca200e_send: misaligned data detected.\n");
		      txq->txbuff = kmalloc(skb->len, GFP_ATOMIC);
		      if (!(txq->txbuff))
		          return -ENOMEM;
		      memcpy(txq->txbuff, skb->data, skb->len);
		      tpd->segment[0].buffer = txq->txbuff;
		    };

	3. Add code to pca200e_inttx() to detect unaligned PDUs and free the
	   temporary buffer.

	      for (i=0; i<QSIZE_TX; i++)
		{
		  if (txq->status[0] & stat_complete)
		    {
	+	      if (((unsigned long) txq->skb->data) & 0x00000003)
	+		kfree(txq->txbuff);
		      txq->vcc->pop(txq->vcc, txq->skb);


	The procedure described above may result in poor performance as all
	data to be forwarded must be copied first.

Solution:
	This will be fixed in pca200e module version 0.3 .
	I hope to get it ready in early January.



Uwe

-------------------------------------------------------------------------------
Uwe Dannowski, student, Dresden University of Technology, Dept. of CS, OS group
email: Uwe.Dannowski@inf.tu-dresden.de  WWW: http://www.inf.tu-dresden.de/~ud3/
tel: +49-351-2848091/+49-172-3736772 addr: Gamigstr. 20, 01239 Dresden, Germany



Home | Main Index | Thread Index