Re: rtentry and rtrequest
- From: Alan Garfield <alan@xxxxxxxxxxxxx>
- Date: Sat, 21 Apr 2007 00:03:25 +1000
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"
- Follow-Ups:
- Re: rtentry and rtrequest
- From: Yar Tikhiy
- Re: rtentry and rtrequest
- References:
- rtentry and rtrequest
- From: Alan Garfield
- Re: rtentry and rtrequest
- From: Yar Tikhiy
- Re: rtentry and rtrequest
- From: Alan Garfield
- Re: rtentry and rtrequest
- From: Yar Tikhiy
- Re: rtentry and rtrequest
- From: Alan Garfield
- Re: rtentry and rtrequest
- From: Yar Tikhiy
- Re: rtentry and rtrequest
- From: Alan Garfield
- Re: rtentry and rtrequest
- From: Yar Tikhiy
- Re: rtentry and rtrequest
- From: Alan Garfield
- Re: rtentry and rtrequest
- From: Yar Tikhiy
- rtentry and rtrequest
- Prev by Date: Re: wpi driver.
- Next by Date: Re: [CODE DROP] Source-Specific Multicast for FreeBSD 7: Phase 1
- Previous by thread: Re: rtentry and rtrequest
- Next by thread: Re: rtentry and rtrequest
- Index(es):
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: 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) - 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)