Re: rtentry and rtrequest



On Thu, 2007-04-19 at 21:53 +0400, Yar Tikhiy wrote:

1. Ping the Linux side with packets close to the MTU in size (ping
-s), use different data patterns (ping -p), see with tcpdump -X if
the data gets damaged.

Yeah I figured out. I wasn't handling mbuf chains properly so a bit of
the packet wasn't being put into the buffer. Fixed that now....

BUT!

Now I get this after I log in and try to output anything more than a few
characters (eg. ls -la) :-

----
Disconnecting: Corrupted MAC on input.
----


I'm sure it's something to do with how I'm doing the output. Does this
look sane?

----
static void
jnet_start_locked(struct ifnet* ifp)
{
/* {{{ */
struct jnet_softc *sc = ifp->if_softc;
struct mbuf *m0, *m;
int i, total_len;

//device_printf(sc->dev, "jnet_start_locked() called.\n");

JNET_ASSERT_LOCKED(sc);

outputloop:

if ((&ifp->if_snd)->ifq_len == TX_QUEUE_SIZE ||
(&ifp->if_snd)->ifq_drv_len == TX_QUEUE_SIZE) {

/* No room left. Set OACTIVE to tell everyone */
ifp->if_drv_flags |= IFF_DRV_OACTIVE;
return;
}

IFQ_DRV_DEQUEUE(&ifp->if_snd, m);

if (m == 0) {

/*
* Space is still available in buffers so allow
* new packets to be added
*/
ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
return;
}

m0 = m;

/* set address counter to zero, then read the entire fifo */
bus_space_write_1(sc->iot[PRS1_IO_OFFSET],
sc->ioh[PRS1_IO_OFFSET], PRS1_STATUS_OFFSET, 0x00);

/* Output the IP_CHAR to tell SP the buffer is an IP packet */
bus_space_write_1(sc->iot[PRS1_IO_OFFSET],
sc->ioh[PRS1_IO_OFFSET], PRS1_DATA_OFFSET, IP_CHAR);

total_len = 0;

// Loop over mbuf chain and output data to PRS1 DATA register -
Packet max length should
// already be worked out by the upper layers
while (m0) {

if(m0->m_len) {
total_len += m0->m_len;

/* Output ethernet frame to prs buffer */
bus_space_write_multi_1(sc->iot[PRS1_IO_OFFSET],
sc->ioh[PRS1_IO_OFFSET],
PRS1_DATA_OFFSET, mtod(m0,
unsigned char *), m0->m_len);

}
m0 = m0->m_next;
}

device_printf(sc->dev, "len: %i padding: %i total: %i\n",
total_len, FRAME_SIZE - total_len, total_len +
(FRAME_SIZE - total_len));

/* Added padding to fill what's left of the buffer */
for (i = total_len; i < FRAME_SIZE; i++) {
bus_space_write_1(sc->iot[PRS1_IO_OFFSET],
sc->ioh[PRS1_IO_OFFSET], PRS1_DATA_OFFSET, 0x00);
}

m0 = m;

BPF_MTAP(ifp, m0);

m_freem(m0);

/* Loop to top to possibly buffer more packets */
goto outputloop;
}
----



Nevertheless, it can be a reference driver working with real hardware
for other folks to study.

It's simple enough once I figured out where the pitfalls are. :)

-A.

_______________________________________________
freebsd-net@xxxxxxxxxxx mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-net
To unsubscribe, send any mail to "freebsd-net-unsubscribe@xxxxxxxxxxx"



Relevant Pages

  • Re: Interesting TCP behaviour with large sends/small buffers
    ... My current workaround is simply setting the send buffer to a larger ... The server, upon connection, sends a configurable number of bytes to ... packet before sending the next packet. ... ACK, according to the delayed ACK algorithm - 50KB bytes means 34 MSS- ...
    (microsoft.public.win32.programmer.networks)
  • Re: Interesting TCP behaviour with large sends/small buffers
    ... The server, upon connection, sends a configurable number of bytes to ... I set the client's receive buffer size to 1MBps, ... packet before sending the next packet. ... ACK, according to the delayed ACK algorithm - 50KB bytes means 34 MSS- ...
    (microsoft.public.win32.programmer.networks)
  • Re: Fundamentals question, is this how it works?
    ... You maintain a buffer for the last incomplete packet. ... receiving that many bytes i then break and wait for the next set of data ... With a tcp stream socket what happens when it is reading say 4000bytes ...
    (microsoft.public.win32.programmer.networks)
  • Re: Design of a Router
    ... packet forward it and than close the port and move to the next and so ... would ideally like the router as small and as fast as possible. ... size of your buffer (just keep in mind that if you have 4 ports than ...
    (comp.lang.verilog)
  • Re: Fundamentals question, is this how it works?
    ... Note the packet may be partially received when you get ... That is what i thought i was saying that it receives it all in a stream ... receving the buffer size each time. ... receiving that many bytes i then break and wait for the next set of data ...
    (microsoft.public.win32.programmer.networks)