[netfilter-cvslog] r3768 - branches/netfilter-ha/linux-2.6-actact/ct_sync

laforge at netfilter.org laforge at netfilter.org
Mon Mar 7 16:08:06 CET 2005


Author: laforge at netfilter.org
Date: 2005-03-07 16:08:05 +0100 (Mon, 07 Mar 2005)
New Revision: 3768

Modified:
   branches/netfilter-ha/linux-2.6-actact/ct_sync/ct_sync_sock.c
   branches/netfilter-ha/linux-2.6-actact/ct_sync/ct_sync_sock.h
Log:
- add ipv6 sync protocol support
- provide sendto / recvfrom instead of send/recv


Modified: branches/netfilter-ha/linux-2.6-actact/ct_sync/ct_sync_sock.c
===================================================================
--- branches/netfilter-ha/linux-2.6-actact/ct_sync/ct_sync_sock.c	2005-03-07 14:35:31 UTC (rev 3767)
+++ branches/netfilter-ha/linux-2.6-actact/ct_sync/ct_sync_sock.c	2005-03-07 15:08:05 UTC (rev 3768)
@@ -34,36 +34,44 @@
 #include <linux/inetdevice.h>
 #include <linux/igmp.h>
 #include <linux/ip.h>
+#include <linux/ip6.h>
 
 #include <asm/uaccess.h>
 
 #include <linux/netfilter_ipv4/ct_sync.h>
 
-/*
- *      Setup loopback of outgoing multicasts on a sending socket
- */
+/* Setup loopback of outgoing multicasts on a sending socket */
 static void
 set_mcast_loop(struct sock *sk, u_char loop)
 {
         /* setsockopt(sock, SOL_IP, IP_MULTICAST_LOOP, &loop, sizeof(loop)); */
+        /* setsockopt(sock, SOL_IP6, IPV6_MULTICAST_LOOP, &loop, sizeof(loop)); */
         lock_sock(sk);
-        inet_sk(sk)->mc_loop = loop ? 1 : 0;
+	if (sk->sk_family == AF_INET)
+	        inet_sk(sk)->mc_loop = loop ? 1 : 0;
+	else
+		inet6_sk(sk)->mc_loop = lpp ? 1 : 0;
         release_sock(sk);
 }
 
-/*
- *      Specify TTL for outgoing multicasts on a sending socket
- */
+/* Specify TTL for outgoing multicasts on a sending socket */
 static void 
 set_mcast_ttl(struct sock *sk, u_char ttl)
 {
         /* setsockopt(sock, SOL_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl)); */
+        /* setsockopt(sock, SOL_IP6, IPV6_MULTICAST_HOPS, &ttl, sizeof(ttl)); */
+
         lock_sock(sk);
-        inet_sk(sk)->mc_ttl = ttl;
+	if (sk->sk_family == AF_INET);
+        	inet_sk(sk)->mc_ttl = ttl;
+	else
+		inet6_sk(sk)->hop_limit = ttl;
+
         release_sock(sk);
 }
 
 
+/* kernel equivalent to SO_BINDTODEVICE */
 static int 
 set_mcast_if(struct sock *sk, char *ifname)
 {
@@ -76,8 +84,13 @@
                 return -EINVAL;
 
         lock_sock(sk);
-        inet_sk(sk)->mc_index = dev->ifindex;
-        /*  inet_sk(sk)->mc_addr  = 0; */
+	if (sk->sk_family == AF_INET) {
+        	inet_sk(sk)->mc_index = dev->ifindex;
+        	/*  inet_sk(sk)->mc_addr  = 0; */
+	} else
+		inet6_sk(sk)->mcast_oif = dev->ifindex;
+
+
         release_sock(sk);
 
         return 0;
@@ -115,36 +128,46 @@
  *      in the in_addr structure passed in as a parameter.
  */
 static int
-join_mcast_group(struct sock *sk, struct in_addr *addr, char *ifname)
+join_mcast_group(struct sock *sk, struct sockaddr_storage *addr, char *ifname)
 {
-        struct ip_mreqn mreq;
         struct net_device *dev;
         int ret;
 
-        memset(&mreq, 0, sizeof(mreq));
-        memcpy(&mreq.imr_multiaddr, addr, sizeof(struct in_addr));
-
         if ((dev = __dev_get_by_name(ifname)) == NULL)
                 return -ENODEV;
         if (sk->sk_bound_dev_if && dev->ifindex != sk->sk_bound_dev_if)
                 return -EINVAL;
 
-        mreq.imr_ifindex = dev->ifindex;
-
         lock_sock(sk);
+	if (sk->sk_family == AF_INET) {
+        	struct ip_mreqn mreq;
+        	memset(&mreq, 0, sizeof(mreq));
+	        memcpy(&mreq.imr_multiaddr,
+			&(struct sockaddr_in *)addr->sin_addr, 
+			sizeof(struct in_addr));
+        	mreq.imr_ifindex = dev->ifindex;
 
-        ret = ip_mc_join_group(sk, &mreq);
+        	ret = ip_mc_join_group(sk, &mreq);
+	} else
+		ret = ipv6_sock_mc_join(sk, dev->ifindex,
+					&(struct sockaddr_in *)addr->sin6_addr);
         release_sock(sk);
 
         return ret;
 }
 
 struct socket *
-cts_sock_server_init(char *devname, const struct sockaddr_in *addr)
+cts_sock_server_init(char *devname, const struct sockaddr_in *addr, int ipv6)
 {
 	struct socket *sock;
+	int pf;
 
-	if (sock_create(PF_INET, SOCK_DGRAM, IPPROTO_UDP, &sock) < 0) {
+	if (ipv6)
+		pf = PF_INET6;
+	else
+		pf = PF_INET;
+
+	if (sock_create(pf, SOCK_DGRAM, IPPROTO_UDP, &sock) < 0) {
 		CT_SYNC_ERR("Socket creation failed.\n");
 		return NULL;
 	}
@@ -162,7 +185,8 @@
 		goto error;
 	}
 
-	if (sock->ops->connect(sock, (struct sockaddr *)addr, sizeof(struct sockaddr), 0) < 0) {
+	if (sock->ops->connect(sock, (struct sockaddr *)addr,
+			       sizeof(struct sockaddr), 0) < 0) {
 		CT_SYNC_ERR("Error connecting to the multicast address.\n");
 		goto error;
 	}
@@ -175,23 +199,32 @@
 }
 
 struct socket *
-cts_sock_client_init(char *devname, const struct sockaddr_in *addr)
+cts_sock_client_init(char *devname, const struct sockaddr_storage *addr, 
+		     int ipv6)
 {
 	struct socket *sock;
+	int pf;
 
-	if (sock_create(PF_INET, SOCK_DGRAM, IPPROTO_UDP, &sock) < 0) {
+	if (ipv6)
+		pf = PF_INET6;
+	else
+		pf = PF_INET
+
+	if (sock_create(pf, SOCK_DGRAM, IPPROTO_UDP, &sock) < 0) {
 		CT_SYNC_ERR("Error during creation of client socket.\n");
 		return NULL;
 	}
 
 	sock->sk->sk_reuse = 1;
 
-	if (sock->ops->bind(sock, (struct sockaddr *)addr, sizeof(struct sockaddr)) < 0) {
+	if (sock->ops->bind(sock, (struct sockaddr *)addr, 
+			    sizeof(struct sockaddr)) < 0) {
 		CT_SYNC_ERR("Error binding to the multicast addr.\n");
 		goto error;
 	}
 
-	if (join_mcast_group(sock->sk, (struct in_addr *)&addr->sin_addr, devname) < 0) {
+	if (join_mcast_group(sock->sk, (struct in_addr *)&addr->sin_addr, 
+			     devname) < 0) {
 		CT_SYNC_ERR("Error joining to the multicast group.\n");
 		goto error;
 	}
@@ -224,7 +257,8 @@
 
 
 ssize_t
-cts_sock_send(struct socket *sock, const char *buffer, const size_t length)
+cts_sock_sendto(struct socket *sock, const char *buffer, const size_t length,
+		struct sockaddr *addr, int addr_len)
 {
 	struct msghdr	msg;
 	mm_segment_t	oldfs;
@@ -243,6 +277,11 @@
 	msg.msg_controllen = 0;
 	msg.msg_flags	= MSG_DONTWAIT | MSG_NOSIGNAL;
 
+	if (addr) {
+		msg.msg_name = addr;
+		msg.msg_namelen = addr_len;
+	}
+
 	oldfs = get_fs(); set_fs(KERNEL_DS);
 	len = sock_sendmsg(sock, &msg, length);
 	set_fs(oldfs);
@@ -253,7 +292,8 @@
 }
 
 ssize_t
-cts_sock_recv(struct socket *sock, char *buffer, const size_t buflen)
+cts_sock_recvfrom(struct socket *sock, char *buffer, const size_t buflen,
+		  struct sockaddr *addr, int addr_len)
 {
 	struct msghdr	msg;
 	struct iovec	iov;
@@ -274,6 +314,11 @@
 	msg.msg_controllen = 0;
 	msg.msg_flags	= 0;
 
+	if (addr) {
+		msg.msg_name = addr;
+		msg.msg_namelen = addr_len;
+	}
+
 	oldfs = get_fs(); set_fs(KERNEL_DS);
 	len = sock_recvmsg(sock, &msg, buflen, 0);
 	set_fs(oldfs);

Modified: branches/netfilter-ha/linux-2.6-actact/ct_sync/ct_sync_sock.h
===================================================================
--- branches/netfilter-ha/linux-2.6-actact/ct_sync/ct_sync_sock.h	2005-03-07 14:35:31 UTC (rev 3767)
+++ branches/netfilter-ha/linux-2.6-actact/ct_sync/ct_sync_sock.h	2005-03-07 15:08:05 UTC (rev 3768)
@@ -1,9 +1,18 @@
 #ifndef _CT_SYNC_SOCK_H
 #define _CT_SYNC_SOCK_H
-ssize_t cts_sock_recv(struct socket *sock, char *buffer, const size_t buflen);
-ssize_t cts_sock_send(struct socket *sock, const char *buffer, const size_t length);
-ssize_t cts_sock_sendmsg(struct socket *sock, struct msghdr *msg, const size_t length);
+ssize_t cts_sock_recvfrom(struct socket *sock, char *buffer, 
+			  const size_t buflen, struct sockaddr *addr,
+			  int addr_len);
+ssize_t cts_sock_sendto(struct socket *sock, const char *buffer,
+			const size_t length, struct sockaddr *addr,
+			int addr_len);
+ssize_t cts_sock_sendmsg(struct socket *sock, struct msghdr *msg, 
+			 const size_t length);
 
-struct socket *cts_sock_client_init(char *devname, const struct sockaddr_in *addr);
-struct socket *cts_sock_server_init(char *devname, const struct sockaddr_in *addr);
+struct socket *cts_sock_client_init(char *devname,
+				    const struct sockaddr_storage *addr,
+				    int ipv6);
+struct socket *cts_sock_server_init(char *devname, 
+				    const struct sockaddr_storage *addr,
+				    int ipv6);
 #endif /* _CT_SYNC_SOCK_H */




More information about the netfilter-cvslog mailing list