Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 1 Nov 2008 21:21:23 -0400 (EDT)
From:      Joe Pellegrino <jdp@elvis.rowan.edu>
To:        Julian Elischer <julian@elischer.org>
Cc:        freebsd-net@freebsd.org
Subject:   Re: A netgraph question.
Message-ID:  <Pine.GSO.4.64.0811012107200.7887@elvis.rowan.edu>
In-Reply-To: <490CEF11.4010007@elischer.org>
References:  <Pine.GSO.4.64.0811011759200.4676@elvis.rowan.edu> <490CEF11.4010007@elischer.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sat, 1 Nov 2008, Julian Elischer wrote:

> I'll try answer your questions..
>
> Hooks are created on demand..
> you need to send a 'connect' or 'mkpeer' message to the node(s)
> on which you want t script level, you just use the ngctl program
> to do it for you.
>
> Hooks are always made in pairs. so you need two nodes to connect.
> The mkpeer message does this for you, and creates a new node and connects 
> them together by two hooks of the names you specify.
>
> Have you looked at the sample netgraph scripts in 
> /usr/share/examples/netgraph?
>

Yep, I've looked at those but if I recall they are all scripts. I am 
looking for some C or C++ example. Basically on the userland side I have 
something like:

#include <..>
#include <netgraph/ng_socket.h>

int main () {
   int s1 = socket (PF_NETGRAPH, SOCK_DGRAM, NG_CONTROL)
   int s2 = socket (PF_NETGRAPH, SOCK_DGRAM, NG_DATA)
   bind(...);

}

This gives me a node with a name, set with bind, of type socket and no 
hooks.

The kernel module I don't have any netgraph code yet but I figure it will 
involve a set of calls similar to the userland program. So if I want to 
interact with the socket the userland program created, what kind of node 
do I create in the module? Another ng_socket or a ng_ksocket or something 
different. Then how do I go about connecting the two hooks?

>> Of course I realize that I proabably need to create a node on the kernel 
>> side so which type of netgraph node would be suggested? How is it created 
>> and then hooked to the ng_socket? 
>
> for fun you could use the ng_echo node type which would send everything you 
> want back to you..
>
> Alternatively when you kldload the ng-ether node type, then all the ethernets 
> will grow nodes to match them so you can connect to them directly.
>
> You could connect an ng_bpf (packet filter) node to the ng_ether node
> and pass specific packets only on to the socket.
>

I'll look into this for the other half of what I am playing with. I looked 
at bpf by itself and it seemed to me it made a copy of the packet, with 
the original continuing up the stack rather than diverting the packet. But 
I am getting ahead of myself. I'd like to get the userland <-> module part 
together first. :) And all the example code are scripts. Am I missing 
someting?

>> pages and can't seem to find a lot of good documentation or example code so 
>> I am hoping to get some pointers here. BTW If this is the wrong list please 
>> directly to the right place to ask. Thanks in advance.
>
> not sure what netlink does..
> (will look on google :-)
>

Thanks for your help, there is a reasonable entry in the wiki about it.

---jdp



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.GSO.4.64.0811012107200.7887>