[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