Penguin
Diff: LinuxNetlinkSocketExample
EditPageHistoryDiffInfoLikePages

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;