lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:	Wed, 11 Jun 2008 19:11:45 +0200
From:	"Julius R. Volz" <juliusv@...gle.com>
To:	lvs-devel@...r.kernel.org, netdev@...r.kernel.org
Cc:	horms@...ge.net.au, davem@...emloft.net, vbusam@...gle.com
Subject: [PATCH 02/26] IPVS: Change IPVS data structures to support IPv6 addresses.

From: Vince Busam <vbusam@...gle.com>

Introduce new 'af' fields into IPVS structures for specifying an entry's
address family. Make IP addresses a union holding both an IPv4 and an IPv6
address. In kernel-internal structs, have the union only hold IPv4
addresses if no IPv6 support is enabled to save some space.

Bump IPVS version to 0x020000 because of this change.

Signed-off-by: Vince Busam <vbusam@...gle.com>

 1 files changed, 39 insertions(+), 12 deletions(-)

diff --git a/include/net/ip_vs.h b/include/net/ip_vs.h
index 9a51eba..b7b181e 100644
--- a/include/net/ip_vs.h
+++ b/include/net/ip_vs.h
@@ -11,7 +11,12 @@
 
 #include <linux/sysctl.h>	/* For ctl_path */
 
-#define IP_VS_VERSION_CODE	0x010201
+#ifdef __KERNEL__
+#include <linux/in6.h>		/* For struct in6_addr */
+#include <linux/ipv6.h>		/* For struct ipv6hdr */
+#endif	/* __KERNEL */
+
+#define IP_VS_VERSION_CODE	0x020000
 #define NVERSION(version)			\
 	(version >> 16) & 0xFF,			\
 	(version >> 8) & 0xFF,			\
@@ -95,6 +100,20 @@
 #define IP_VS_SCHEDNAME_MAXLEN	16
 #define IP_VS_IFNAME_MAXLEN	16
 
+union ip_vs_addr_user {
+	__be32			v4;
+	struct in6_addr		v6;
+};
+
+#ifdef CONFIG_IP_VS_IPV6
+#define ip_vs_addr		ip_vs_addr_user
+#define ip_vs_copy_addr(a, b)	do { (a) = (b); } while (0)
+#else
+union ip_vs_addr {
+	__be32			v4;
+};
+#define ip_vs_copy_addr(a, b)	do { (a).v4 = (b).v4; } while (0)
+#endif
 
 /*
  *	The struct ip_vs_service_user and struct ip_vs_dest_user are
@@ -102,8 +121,9 @@
  */
 struct ip_vs_service_user {
 	/* virtual service addresses */
+	u_int16_t		af;
 	u_int16_t		protocol;
-	__be32			addr;		/* virtual ip address */
+	union ip_vs_addr_user	addr;		/* virtual ip address */
 	__be16			port;
 	u_int32_t		fwmark;		/* firwall mark of service */
 
@@ -117,7 +137,8 @@ struct ip_vs_service_user {
 
 struct ip_vs_dest_user {
 	/* destination server address */
-	__be32			addr;
+	u_int16_t		af;
+	union ip_vs_addr_user	addr;
 	__be16			port;
 
 	/* real server options */
@@ -165,8 +186,9 @@ struct ip_vs_getinfo {
 /* The argument to IP_VS_SO_GET_SERVICE */
 struct ip_vs_service_entry {
 	/* which service: user fills in these */
+	u_int16_t		af;
 	u_int16_t		protocol;
-	__be32			addr;		/* virtual address */
+	union ip_vs_addr_user	addr;		/* virtual address */
 	__be16			port;
 	u_int32_t		fwmark;		/* firwall mark of service */
 
@@ -185,7 +207,8 @@ struct ip_vs_service_entry {
 
 
 struct ip_vs_dest_entry {
-	__be32			addr;		/* destination address */
+	u_int16_t		af;
+	union ip_vs_addr_user	addr;		/* destination address */
 	__be16			port;
 	unsigned		conn_flags;	/* connection flags */
 	int			weight;		/* destination weight */
@@ -205,8 +228,9 @@ struct ip_vs_dest_entry {
 /* The argument to IP_VS_SO_GET_DESTS */
 struct ip_vs_get_dests {
 	/* which service: user fills in these */
+	u_int16_t		af;
 	u_int16_t		protocol;
-	__be32			addr;		/* virtual address */
+	union ip_vs_addr_user	addr;		/* virtual address */
 	__be16			port;
 	u_int32_t		fwmark;		/* firwall mark of service */
 
@@ -472,9 +496,10 @@ struct ip_vs_conn {
 	struct list_head        c_list;         /* hashed list heads */
 
 	/* Protocol, addresses and port numbers */
-	__be32                   caddr;          /* client address */
-	__be32                   vaddr;          /* virtual address */
-	__be32                   daddr;          /* destination address */
+	u_int16_t               af;		/* address family */
+	union ip_vs_addr         caddr;          /* client address */
+	union ip_vs_addr         vaddr;          /* virtual address */
+	union ip_vs_addr         daddr;          /* destination address */
 	__be16                   cport;
 	__be16                   vport;
 	__be16                   dport;
@@ -527,8 +552,9 @@ struct ip_vs_service {
 	atomic_t		refcnt;   /* reference counter */
 	atomic_t		usecnt;   /* use counter */
 
+	u_int16_t               af;       /* address family */
 	__u16			protocol; /* which protocol (TCP/UDP) */
-	__be32			addr;	  /* IP address for virtual service */
+	union ip_vs_addr	addr;	  /* IP address for virtual service */
 	__be16			port;	  /* port number for the service */
 	__u32                   fwmark;   /* firewall mark of the service */
 	unsigned		flags;	  /* service status flags */
@@ -555,7 +581,8 @@ struct ip_vs_dest {
 	struct list_head	n_list;   /* for the dests in the service */
 	struct list_head	d_list;   /* for table with all the dests */
 
-	__be32			addr;		/* IP address of the server */
+	u_int16_t		af;		/* address family */
+	union ip_vs_addr	addr;		/* IP address of the server */
 	__be16			port;		/* port number of the server */
 	volatile unsigned	flags;		/* dest status flags */
 	atomic_t		conn_flags;	/* flags to copy to conn */
@@ -579,7 +606,7 @@ struct ip_vs_dest {
 	/* for virtual service */
 	struct ip_vs_service	*svc;		/* service it belongs to */
 	__u16			protocol;	/* which protocol (TCP/UDP) */
-	__be32			vaddr;		/* virtual IP address */
+	union ip_vs_addr	vaddr;		/* virtual IP address */
 	__be16			vport;		/* virtual port number */
 	__u32			vfwmark;	/* firewall mark of service */
 };
-- 
1.5.3.6

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ