Differences between version 5 and revision by previous author of LinuxNetlinkSocketExample.
Other diffs: Previous Major Revision, Previous Revision, or view the Annotated Edit History
Newer page: | version 5 | Last edited on Thursday, September 22, 2005 2:35:44 am | by CamiloMesias | Revert |
Older page: | version 3 | Last edited on Thursday, August 11, 2005 11:19:39 am | by IanMcDonald | Revert |
@@ -5,8 +5,10 @@
See LinuxNetlinkSockets
----
<verbatim>
+#include <asm/types.h>
+
#include <sys/socket.h>
#include <unistd.h>
#include <err.h>
#include <stdio.h>
@@ -15,13 +17,16 @@
#include <linux/netlink.h>
#include <linux/rtnetlink.h>
#if 0
-#define FOO
NETLINK_ARPD
-#define FOOMGRP
RTMGRP_NEIGH
+//
#define MYPROTO
NETLINK_ARPD
+#define MYMGRP
RTMGRP_NEIGH
+// if you want the above you'll find that the kernel must be compiled with CONFIG_ARPD, and
+// that you need MYPROTO=NETLINK_ROUTE, since the kernel arp code {re,ab}uses rtnl (NETLINK_ROUTE)
+
#else
-#define FOO
NETLINK_ROUTE
-#define FOOMGRP
RTMGRP_IPV4_ROUTE
+#define MYPROTO
NETLINK_ROUTE
+#define MYMGRP
RTMGRP_IPV4_ROUTE
#endif
struct msgnames_t {
int id;
@@ -51,15 +56,18 @@
}
int open_netlink()
{
- int sock = socket(AF_NETLINK,SOCK_DGRAM
,FOO
);
+ int sock = socket(AF_NETLINK,SOCK_RAW
,MYPROTO
);
struct sockaddr_nl addr;
+
+ memset((void *)&addr, 0, sizeof(addr));
+
if (sock<0)
return sock;
addr.nl_family = AF_NETLINK;
addr.nl_pid = getpid();
- addr.nl_groups = FOOMGRP
;
+ addr.nl_groups = MYMGRP
;
if (bind(sock,(struct sockaddr *)&addr,sizeof(addr))<0)
return -1;
return sock;
}