/** @file netlink-u2k.c * * @author marco corvi * @date feb 2005 * * @brief test program for user to kernel netlink communication */ #include #include #include // socket, getpid, bind #include // socket, bind #include // getpid #include #include // this value is not used in knetlink.c #define KNETLINK 17 #define PAYLOAD_SIZE 1024 int main( int argc, char ** argv ) { int sock; int i, j; unsigned char payload[PAYLOAD_SIZE]; // payload unsigned char rpayload[PAYLOAD_SIZE]; // payload struct msghdr msg; // message-header struct sockaddr_nl addr; // my netlink address struct sockaddr_nl peer; // peer address struct nlmsghdr nlh; // netlink message header struct iovec iov[2]; // iovec array sock = socket( AF_NETLINK, SOCK_DGRAM, KNETLINK /* NETLINK_ARPD */ ); if ( sock < 0 ) { perror("Socket error"); exit(1); } memset( &addr, 0, sizeof(addr) ); addr.nl_family = AF_NETLINK; addr.nl_pad = 0; addr.nl_pid = getpid(); addr.nl_groups = 0; { //**************** sender ***************************** printf("Sender: my pid %d\n", getpid() ); memset( &peer, 0, sizeof(peer) ); peer.nl_family = AF_NETLINK; peer.nl_pad = 0; peer.nl_pid = 0; // peer is the kernel peer.nl_groups = 0; // unicast printf(" server pid %d\n", peer.nl_pid); nlh.nlmsg_len = sizeof(nlh) + PAYLOAD_SIZE; nlh.nlmsg_type = 5; nlh.nlmsg_flags = 0; nlh.nlmsg_seq = 1; nlh.nlmsg_pid = getpid(); iov[0].iov_base = (void *)&nlh; iov[0].iov_len = sizeof(nlh); iov[1].iov_base = (void *)payload; iov[1].iov_len = PAYLOAD_SIZE; for (i=0; i