Include join_mcast() into os_socket_set_olsr_options()
authorHenning Rogge <henning.rogge@fkie.fraunhofer.de>
Wed, 13 Oct 2010 09:11:28 +0000 (11:11 +0200)
committerHenning Rogge <henning.rogge@fkie.fraunhofer.de>
Wed, 13 Oct 2010 09:11:28 +0000 (11:11 +0200)
src/interfaces.c
src/linux/linux_net.h
src/linux/net.c
src/os_net.h
src/unix/ifnet.c
src/win32/ifnet.c
src/win32/net.c

index ed9188b..75f386b 100644 (file)
@@ -200,8 +200,8 @@ add_interface(struct olsr_if_config *iface) {
   add_olsr_socket(ifp->olsr_socket, &olsr_input, NULL, NULL, SP_PR_READ);
   add_olsr_socket(ifp->send_socket, &olsr_input, NULL, NULL, SP_PR_READ);
 
-  os_socket_set_olsr_options(ifp->olsr_socket);
-  os_socket_set_olsr_options(ifp->send_socket);
+  os_socket_set_olsr_options(ifp, ifp->olsr_socket);
+  os_socket_set_olsr_options(ifp, ifp->send_socket);
 
   /*
    *Initialize packet sequencenumber as a random 16bit value
index 85074de..61921ce 100644 (file)
@@ -18,6 +18,4 @@
 void net_os_restore_ifoption(struct interface *ifs);
 int net_os_set_ifoptions(const char *if_name, struct interface *iface);
 
-int join_mcast(struct interface *, int);
-
 #endif /* LINUX_NET_H_ */
index c3e13ad..81f5a9c 100644 (file)
@@ -484,20 +484,8 @@ os_getsocket6(int bufspace, struct interface *ifp, bool bind_to_unicast, uint16_
   return sock;
 }
 
-void
-os_socket_set_olsr_options(int sock) {
-  /* Set TOS */
-  int data = IPTOS_PREC(olsr_cnf->tos);
-  if (setsockopt(sock, SOL_SOCKET, SO_PRIORITY, (char *)&data, sizeof(data)) < 0) {
-    OLSR_WARN(LOG_INTERFACE, "setsockopt(SO_PRIORITY) error %s", strerror(errno));
-  }
-  data = IPTOS_TOS(olsr_cnf->tos);
-  if (setsockopt(sock, SOL_IP, IP_TOS, (char *)&data, sizeof(data)) < 0) {
-    OLSR_WARN(LOG_INTERFACE, "setsockopt(IP_TOS) error %s", strerror(errno));
-  }
-}
 
-int
+static int
 join_mcast(struct interface *ifs, int sock)
 {
   /* See linux/in6.h */
@@ -542,6 +530,21 @@ join_mcast(struct interface *ifs, int sock)
   return 0;
 }
 
+void
+os_socket_set_olsr_options(struct interface * ifs, int sock) {
+  /* Set TOS */
+  int data = IPTOS_PREC(olsr_cnf->tos);
+  if (setsockopt(sock, SOL_SOCKET, SO_PRIORITY, (char *)&data, sizeof(data)) < 0) {
+    OLSR_WARN(LOG_INTERFACE, "setsockopt(SO_PRIORITY) error %s", strerror(errno));
+  }
+  data = IPTOS_TOS(olsr_cnf->tos);
+  if (setsockopt(sock, SOL_IP, IP_TOS, (char *)&data, sizeof(data)) < 0) {
+    OLSR_WARN(LOG_INTERFACE, "setsockopt(IP_TOS) error %s", strerror(errno));
+  }
+
+  join_mcast(ifs, sock);
+}
+
 /*
  *From net-tools lib/interface.c
  *
index 422c9ce..f66bdf3 100644 (file)
@@ -83,7 +83,7 @@ int EXPORT(os_interface_set_state)(const char *dev, bool up);
 void ListInterfaces(void);
 #endif
 
-void os_socket_set_olsr_options(int socket);
+void os_socket_set_olsr_options(struct interface *ifs, int socket);
 
 int get_ipv6_address(char *, struct sockaddr_in6 *, int);
 
index 990a921..1beb8b5 100644 (file)
@@ -455,10 +455,6 @@ os_init_interface(struct interface *ifp, struct olsr_if_config *iface)
    */
   ifp->int_name = olsr_strdup(ifr_basename);
 
-  if (olsr_cnf->ip_version == AF_INET6) {
-    join_mcast(ifp, ifp->olsr_socket);
-    join_mcast(ifp, ifp->send_socket);
-  }
   /* Set interface options */
 #ifdef linux
   net_os_set_ifoptions(ifr_basename, ifp);
index 4e226bb..d59dc07 100644 (file)
@@ -502,50 +502,6 @@ chk_if_changed(struct olsr_if_config *olsr_if)
   return Res;
 }
 
-static int
-join_mcast(struct interface *Nic, int Sock)
-{
-  /* See linux/in6.h */
-  struct ipaddr_str buf;
-  struct ipv6_mreq McastReq;
-
-  McastReq.ipv6mr_multiaddr = Nic->int_multicast.v6.sin6_addr;
-  McastReq.ipv6mr_interface = Nic->if_index;
-
-  OLSR_DEBUG(LOG_NETWORKING, "Interface %s joining multicast %s...", Nic->int_name,
-             olsr_ip_to_string(&buf, (union olsr_ip_addr *)&Nic->int_multicast.v6.sin6_addr));
-  /* Send multicast */
-  if (setsockopt(Sock, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, (char *)&McastReq, sizeof(struct ipv6_mreq))
-      < 0) {
-    OLSR_WARN(LOG_NETWORKING, "Join multicast: %s\n", strerror(errno));
-    return -1;
-  }
-
-  /* Old libc fix */
-#ifdef IPV6_JOIN_GROUP
-  /* Join reciever group */
-  if (setsockopt(Sock, IPPROTO_IPV6, IPV6_JOIN_GROUP, (char *)&McastReq, sizeof(struct ipv6_mreq))
-      < 0)
-#else
-  /* Join reciever group */
-  if (setsockopt(Sock, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, (char *)&McastReq, sizeof(struct ipv6_mreq))
-      < 0)
-#endif
-  {
-    OLSR_WARN(LOG_NETWORKING, "Join multicast send: %s\n", strerror(errno));
-    return -1;
-  }
-
-
-  if (setsockopt(Sock, IPPROTO_IPV6, IPV6_MULTICAST_IF, (char *)&McastReq.ipv6mr_interface, sizeof(McastReq.ipv6mr_interface))
-      < 0) {
-    OLSR_WARN(LOG_NETWORKING, "Join multicast if: %s\n", strerror(errno));
-    return -1;
-  }
-
-  return 0;
-}
-
 int
 os_init_interface(struct interface *ifp, struct olsr_if_config *IntConf)
 {
@@ -598,11 +554,6 @@ os_init_interface(struct interface *ifp, struct olsr_if_config *IntConf)
 
   ifp->if_index = if_info.Index;
 
-  if (olsr_cnf->ip_version == AF_INET6) {
-    join_mcast(ifp, ifp->olsr_socket);
-    join_mcast(ifp, ifp->send_socket);
-  }
-
   OLSR_INFO(LOG_NETWORKING, "\tKernel index: %08x\n", ifp->if_index);
   return 0;
 }
index 3711a97..a058301 100644 (file)
@@ -193,8 +193,53 @@ os_getsocket6(int bufspace, struct interface *ifp, bool bind_to_unicast, uint16_
   return Sock;
 }
 
+static int
+join_mcast(struct interface *Nic, int Sock)
+{
+  /* See linux/in6.h */
+  struct ipaddr_str buf;
+  struct ipv6_mreq McastReq;
+
+  McastReq.ipv6mr_multiaddr = Nic->int_multicast.v6.sin6_addr;
+  McastReq.ipv6mr_interface = Nic->if_index;
+
+  OLSR_DEBUG(LOG_NETWORKING, "Interface %s joining multicast %s...", Nic->int_name,
+             olsr_ip_to_string(&buf, (union olsr_ip_addr *)&Nic->int_multicast.v6.sin6_addr));
+  /* Send multicast */
+  if (setsockopt(Sock, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, (char *)&McastReq, sizeof(struct ipv6_mreq))
+      < 0) {
+    OLSR_WARN(LOG_NETWORKING, "Join multicast: %s\n", strerror(errno));
+    return -1;
+  }
+
+  /* Old libc fix */
+#ifdef IPV6_JOIN_GROUP
+  /* Join reciever group */
+  if (setsockopt(Sock, IPPROTO_IPV6, IPV6_JOIN_GROUP, (char *)&McastReq, sizeof(struct ipv6_mreq))
+      < 0)
+#else
+  /* Join reciever group */
+  if (setsockopt(Sock, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, (char *)&McastReq, sizeof(struct ipv6_mreq))
+      < 0)
+#endif
+  {
+    OLSR_WARN(LOG_NETWORKING, "Join multicast send: %s\n", strerror(errno));
+    return -1;
+  }
+
+
+  if (setsockopt(Sock, IPPROTO_IPV6, IPV6_MULTICAST_IF, (char *)&McastReq.ipv6mr_interface, sizeof(McastReq.ipv6mr_interface))
+      < 0) {
+    OLSR_WARN(LOG_NETWORKING, "Join multicast if: %s\n", strerror(errno));
+    return -1;
+  }
+
+  return 0;
+}
+
 void
-os_socket_set_olsr_options(int sock __attribute__ ((unused))) {
+os_socket_set_olsr_options(struct interface *ifp, int sock) {
+  join_mcast(ifp, sock);
 }
 
 static int