Main index | Section 4 | Options |
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet6/send.h>
To load the driver as a module at boot time, place the following line in loader.conf(5):
send_load="YES"
Kernel side support for SeND consists of a kernel module with hooks that divert relevant packets (Neighbor Solicitations, Neighbor Advertisements, Router Solicitations, Router Advertisements and Redirects) from the NDP stack, send them to user space on a dedicated socket and reinject them back for further processing. Hooks are triggered only if the send module is loaded.
The native SeND socket is similar to a raw IP socket, but with its own, internal pseudo-protocol (IPPROTO_SEND). Struct sockaddr_send is defined in <netinet6/send.h>. It defines the total length of the structure, the address family, packet's incoming or outgoing direction from the interface's point of view, and the interface index.
struct sockaddr_send { unsigned char send_len; /* total length */ sa_family_t send_family; /* address family */ int send_direction; int send_ifidx; char send_zero[8]; };
The address family is always AF_INET6. The send_direction variable denotes the direction of the packet from the interface's point of view and has either the value SND_IN or SND_OUT. The send_ifidx variable is the interface index of the receiving or sending interface. The send_zero variable is padding and must always be zero.
In case that no user space application is connected to the send socket, processing continues normally as if the module was not loaded.
kernelspace ( userspace ) incoming SeND/ND packet ( | ) v ( SND_IN ) ( icmp6_input() -> send_input_hook ---> send socket ----+ : ) | : # # ( | normal : # # ) v processing : # send.ko # ( SeND application path : # # ) | : # # ( | v ) | icmp6/nd6_??_input() <- protocol switch <--- send socket <---+ | structure (IPPPROTO_SEND) ) | ( SND_IN ) ( v ) continue normal ND processing (
kernelspace ( userspace ) nd6_na_input() ( +PACKET_TAG_ND_OUTGOING ) | ) | outgoing packet ( | | ) | v ( | icmp6_redirect_output() ) | nd6_ns_output() ( | nd6_na_output() ) | +PACKET_TAG_ND_OUTGOING ( | | ) | +-----------<- rip6_output() <----------)----- rtsol/rtadvd/.. | | +PACKET_TAG_ND_OUTGOING ( | v ) | ip6_output() ( | | ) +-------->-+ ( | ) v ( SND_OUT ) ( nd6_output_lle() -> send_input_hook ---> send socket ----+ -PACKET_TAG_ND_OUTGOING ) | : # # ( | normal : # # ) v processing : # send.ko # ( SeND application path : # # ) | : # # ( | v ) | (*ifp->if_output)() <- protocol switch <--- send socket <---+ | structure (IPPPROTO_SEND) ) | ( SND_OUT ) ( v ) continue with normal packet output (
[EEXIST] | |
Another user space SeND application is bound to the socket. | |
[ENOBUFS] | |
Shortage of space to receive the incoming (SeND-protected) or outgoing (SeND-validated) packet from the SeND application. | |
[ENOSYS] | |
A packet received from user space and passed to the NDP stack for further processing is neither Neighbor Solicitation, Neighbor Advertisement, Router Solicitation, Router Advertisement nor Redirect. | |
[ENOENT] | |
Occurs if interface output routines fail to send the packet out of the interface. | |
SEND (4) | September 19, 2010 |
Main index | Section 4 | Options |
Please direct any comments about this manual page service to Ben Bullock. Privacy policy.
“ | A computer would deserve to be called intelligent if it could deceive a human into believing that it was human. | ” |
— Alan Turing |