netgraph and kqueue together - socket problems

Jonas Bulow xfree at bulow.mine.nu
Tue Jan 6 23:05:46 PST 2004


Hi,

Julian Elischer wrote:

>On Wed, 7 Jan 2004, Jonas Bulow wrote:
>
>  
>
>>Hi,
>>
>>I'm trying to use netgraph and kqueue together and ran into some 
>>problems. I hope someone can enligthen me what I'm missing.
>>    
>>
>
>I'm not sure that anyone has ever looked at netgraph and kqueue as a
>pair.
>
>
>
>  
>
>>I register EVFILT_READ and EVFILT_WRITE on a netgraph-socket connected 
>>to a netgraph echo-node. The EVFILT_WRITE-filter returns immediately 
>>from the kevent call saying there is 20480 bytes remaining in the write 
>>buffer (in the event data field). Then I write 20480 using NgSendData. 
>>NgSendData encounters an error: "No buffer space available".
>>    
>>
>
>  
>
>WHat does it mean "write buffer"?
>  
>
I guess it is struct sockbuf sn_snd in struckt socket.


>The netgraph socket will pass th edat adirectly to whatever is
>connected. There is no buffer.
>The echo node in turn passes it back to the socket node (though there
>maybe a lock.. not sure) so eventually the data will be put in the
>receive buffer, so for this case the receive buffer is the send buffer
>but the socket can not know this..
>
>
>
>
>
>  
>
>>When I write fewer but smaller chunks of data, say ~3000 bytes, the next 
>>call to kevent returns the same amount of remaining space in the write 
>>buffer. The kqueue event data field never change from 20480 for the 
>>EVFILT_WRITE-filter.
>>    
>>
>
>No it is returning some default value..
>I doubt it is related in any way to much of importance.
>
>  
>
>tell me, does a write of 20479 bytes work?
>  
>

No,  but 20473 works. The next call to kevent returns the constans 20480 
again and the following NgSendData fails with the error above.

>
>  
>
>>Now I understand that there are some overhead in the NgSendData. It's 
>>not just my data that are written through the socket. The addressing 
>>data adds some data when NgSendData calls sendto. Right?
>>
>>    
>>
>
>nope.
>that is out of band data.. I don't count that.. (I don't count anything
>really.).
>
>
>  
>
>>But, how do I calculate the true amount of remaining buffer space 
>>available for me when I call NgSendData?
>>    
>>
>
>you can't.. there is no transmit buffer.. that is a reponsibility of the
>node that eventually decides to queue the data (maybe never).
>
>  
>
>>And, why does kevent EVFILT_WRITE always say 20480 on repeated calls to 
>>kevent on a netgraph-socket, even if I have successfully written some 
>>data between the calls to kevent?
>>    
>>
>
>probably some default value.
>  
>
It seems to get it's value in kern/uipc_socket.c:filt_sowrite: ( -stable)

 kn->kn_data = sbspace(&so->so_snd);

>
>  
>
>>The netgraph-node the programming is talking to is a echo-node set up with:
>>
>>#ngctl mkpeer echo dummy foo
>>
>>    
>>
>
>I suggest 'following' the data in the source code...
>
>starting in ng_socket.c
>start at:
> http://snapshots.jp.freebsd.org/tour/current/kernel/S/3328.html#338
>for -current and:
> http://snapshots.jp.freebsd.org/tour/releng4/kernel/S/2566.html#182
>for -stable.
>  
>

Ok, I will do that.

Isn't it kern/uipc_socket .c in sosend who is responsible for returning 
ENOBUFS in the first place when using the sendto that NgSendData uses?

/j

>
>
>
>  
>
>>Regards,
>>	Jonas
>>_______________________________________________
>>freebsd-net at freebsd.org mailing list
>>http://lists.freebsd.org/mailman/listinfo/freebsd-net
>>To unsubscribe, send any mail to "freebsd-net-unsubscribe at freebsd.org"
>>
>>    
>>
>
>  
>


More information about the freebsd-net mailing list