[HELP] sendto:No buffer space available

linux JHON zhanglinuxstar at gmail.com
Fri May 27 08:51:43 UTC 2011


My machine has two net interface cards, fxp0 and acl0, but acl0 is down,
only fxp0 is working.

When I send raw packets through fxp0, it gives the error: sendto: No buffer
space available.

I have googled, but I found no answer. The netstat -m result is:

67/1223/1290 mbufs in use (current/cache/total)
64/340/404/25600 mbuf clusters in use (current/cache/total/max)
64/320 mbuf+clusters out of packet secondary zone in use (current/cache)
0/167/167/12800 4k (page size) jumbo clusters in use
(current/cache/total/max)
0/0/0/6400 9k jumbo clusters in use (current/cache/total/max)
0/0/0/3200 16k jumbo clusters in use (current/cache/total/max)
144K/1653K/1798K bytes allocated to network (current/cache/total)
0/0/0 requests for mbufs denied (mbufs/clusters/mbuf+clusters)
0/0/0 requests for jumbo clusters denied (4k/9k/16k)
0/5/6656 sfbufs in use (current/peak/max)
0 requests for sfbufs denied
0 requests for sfbufs delayed
0 requests for I/O initiated by sendfile
0 calls to protocol drain routines

And the ifconfig gives that:

alc0: flags=8802<BROADCAST,SIMPLEX,MULTICAST> metric 0 mtu 1500

options=c3198<VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,TSO4,WOL_MCAST,WOL_MAGIC,VLAN_HWTSO,LINKSTATE>
    ether xxxxxxxxxxxx
    media: Ethernet autoselect
fxp0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500

options=4219b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,TSO4,WOL_MAGIC,VLAN_HWTSO>
    ether xxxxxxxxxxx
    inet xxxxxx netmask 0xffffff00 broadcast xxxxxxxx
    media: Ethernet autoselect (100baseTX <full-duplex>)
    status: active
plip0: flags=8851<UP,POINTOPOINT,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu
1500
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
    options=3<RXCSUM,TXCSUM>
    inet6 fe80::1%lo0 prefixlen 64 scopeid 0x4
    inet6 ::1 prefixlen 128
    inet 127.0.0.1 netmask 0xff000000
    nd6 options=3<PERFORMNUD,ACCEPT_RTADV>

The core code of sending packets is as follows:

while (num_of_tries-- > 0)
    {
        if (sendto
                (s, datagram, iph->ip_len, 0, (struct sockaddr *) &servaddr,
                 sizeof (servaddr)) < 0)
        {
            fprintf (stderr, "Error in sendto:%s\n", strerror(errno));
            exit (1);
        }
        else
        {
            /*usleep(30);*/
            if (ft == 0)
            {
                fprintf (stderr,

"[****************]\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
                ft = 1;
            }

            if ((numtries % modval) == 0)
                fprintf (stderr, ".");

        }
    }

When I uncomment the sentence: usleep(30), the error disapears. But I want
to send packets in high speed, what should I do?

Btw, the packets are raw packets. So I thought maybe the kernel send some
packets to the net interface card alc0 which doesn't work.

How can I bind raw socket with device fxp0????

Thanks in advance.


More information about the freebsd-net mailing list