Calculate ipv6_pinfo offset from struct proto->slab_obj_size
Subsystems (6)
PATCH 1/1 Calculate ipv6_pinfo offset from struct proto->slab_obj_size
Hi David,
Please pull from:
bk://kernel.bkbits.net/acme/net-2.6
Best Regards,
- Arnaldo
===================================================================
[email protected], 2004-09-19 15:26:01-03:00, [email protected]
[NET] Calculate ipv6_pinfo offset from struct proto->slab_obj_size
With a new rule for the struct sock hierarchy descendants layout, that states that the struct ipv6_pinfo member should be last one in the struct layout (see tcp6_sock, udp6_sock, sctp6_sock, etc), we can calculate the ipv6_pinfo member offset by using struct proto->slab_obj_size.
So ditch struct ipv6_sk_offset and struct proto->af_specific.
Signed-off-by Arnaldo Carvalho de Melo <[email protected]>
Signed-off-by David S. Miller <[email protected]>
include/linux/ipv6.h | 15 +++++++++------ include/net/sock.h | 1 - net/ipv6/af_inet6.c | 4 ++-- net/ipv6/raw.c | 5 ----- net/ipv6/tcp_ipv6.c | 5 ----- net/ipv6/udp.c | 5 ----- net/sctp/socket.c | 5 ----- 7 files changed, 11 insertions(+), 29 deletions(-)
include/linux/ipv6.h +9 -6
@@ -182,8 +182,7 @@as offsets from skb->nh. */ -struct inet6_skb_parm -{ +struct inet6_skb_parm {int iif;__u16 ra;__u16 hop;
@@ -194,6 +193,14 @@#define IP6CB (skb) ((struct inet6_skb_parm*)((skb)->cb)) +/** +* struct ipv6_pinfo - ipv6 private area +* +* In the struct sock hierarchy (tcp6_sock, upd6_sock, etc) +* this _must_ be the last member, so that inet6_sk_generic +* is able to calculate its offset from the base struct sock +* by using the struct proto->slab_obj_size member. -acme +*/ struct ipv6_pinfo {struct in6_addr saddr;struct in6_addr rcv_saddr;
@@ -281,10 +288,6 @@ {return &((struct raw6_sock *)__sk)->raw6; } - -struct ipv6_sk_offset { -int offset; -};#if defined(CONFIG_IPV6 ) || defined(CONFIG_IPV6_MODULE )#define __ipv6_only_sock (sk) (inet6_sk(sk)->ipv6only)
include/net/sock.h +0 -1
@@ -557,7 +557,6 @@kmem_cache_t *slab;int slab_obj_size; -void *af_specific;char name[32 ];
net/ipv6/af_inet6.c +2 -2
@@ -107,9 +107,9 @@static __inline__struct ipv6_pinfo *inet6_sk_generic (struct sock *sk) { -const struct ipv6_sk_offset *offset = sk->sk_prot->af_specific; +const int offset = sk->sk_prot->slab_obj_size -sizeof (struct ipv6_pinfo ); -return (struct ipv6_pinfo *)(((u8 *)sk) + offset->offset); +return (struct ipv6_pinfo *)(((u8 *)sk) + offset); }static int inet6_create (struct socket *sock,int protocol)
net/ipv6/raw.c +0 -5
@@ -973,10 +973,6 @@return (0 ); } -struct ipv6_sk_offset raw_sock_offset = { - .offset = offsetof(struct raw6_sock , inet6), -}; -struct proto rawv6_prot = { .name ="RAW" , .close = rawv6_close,
@@ -994,7 +990,6 @@ .hash = raw_v6_hash, .unhash = raw_v6_unhash, .slab_obj_size = sizeof(struct raw6_sock), - .af_specific = &raw_sock_offset, };#ifdef CONFIG_PROC_FS
net/ipv6/tcp_ipv6.c +0 -5
@@ -2120,10 +2120,6 @@ }#endif -struct ipv6_sk_offset tcp_sock_offset = { - .offset = offsetof(struct tcp6_sock , inet6), -}; -struct proto tcpv6_prot = { .name ="TCPv6" , .close = tcp_close,
@@ -2151,7 +2147,6 @@ .sysctl_rmem = sysctl_tcp_rmem, .max_header = MAX_TCP_HEADER, .slab_obj_size = sizeof(struct tcp6_sock), - .af_specific = &tcp_sock_offset, };static struct inet6_protocol tcpv6_protocol = {
net/ipv6/udp.c +0 -5
@@ -1031,10 +1031,6 @@/* ------------------------------------------------------------------------ */ -struct ipv6_sk_offset udp_sock_offset = { - .offset = offsetof(struct udp6_sock , inet6), -}; -struct proto udpv6_prot = { .name ="UDP" , .close = udpv6_close,
@@ -1051,7 +1047,6 @@ .unhash = udp_v6_unhash, .get_port = udp_v6_get_port, .slab_obj_size = sizeof(struct udp6_sock), - .af_specific = &udp_sock_offset, };extern struct proto_ops inet6_dgram_ops;
net/sctp/socket.c +0 -5
@@ -4626,10 +4626,6 @@ };#if defined(CONFIG_IPV6 ) || defined(CONFIG_IPV6_MODULE ) -struct ipv6_sk_offset sctp_sock_offset = { - .offset = offsetof(struct sctp6_sock , inet6), -}; -struct proto sctpv6_prot = { .name ="SCTPv6" , .close = sctp_close,
@@ -4650,6 +4646,5 @@ .unhash = sctp_unhash, .get_port = sctp_get_port, .slab_obj_size = sizeof(struct sctp6_sock), - .af_specific = &sctp_sock_offset, };#endif /* defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) */