[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: default avatarArnaldo Carvalho de Melo <acme@conectiva.com.br>
Signed-off-by: default avatarDavid S. Miller <davem@redhat.com>
parent 6e544044
...@@ -182,8 +182,7 @@ enum { ...@@ -182,8 +182,7 @@ enum {
as offsets from skb->nh. as offsets from skb->nh.
*/ */
struct inet6_skb_parm struct inet6_skb_parm {
{
int iif; int iif;
__u16 ra; __u16 ra;
__u16 hop; __u16 hop;
...@@ -194,6 +193,14 @@ struct inet6_skb_parm ...@@ -194,6 +193,14 @@ struct inet6_skb_parm
#define IP6CB(skb) ((struct inet6_skb_parm*)((skb)->cb)) #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 ipv6_pinfo {
struct in6_addr saddr; struct in6_addr saddr;
struct in6_addr rcv_saddr; struct in6_addr rcv_saddr;
...@@ -282,10 +289,6 @@ static inline struct raw6_opt * raw6_sk(const struct sock *__sk) ...@@ -282,10 +289,6 @@ static inline struct raw6_opt * raw6_sk(const struct sock *__sk)
return &((struct raw6_sock *)__sk)->raw6; return &((struct raw6_sock *)__sk)->raw6;
} }
struct ipv6_sk_offset {
int offset;
};
#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
#define __ipv6_only_sock(sk) (inet6_sk(sk)->ipv6only) #define __ipv6_only_sock(sk) (inet6_sk(sk)->ipv6only)
#define ipv6_only_sock(sk) ((sk)->sk_family == PF_INET6 && __ipv6_only_sock(sk)) #define ipv6_only_sock(sk) ((sk)->sk_family == PF_INET6 && __ipv6_only_sock(sk))
......
...@@ -557,7 +557,6 @@ struct proto { ...@@ -557,7 +557,6 @@ struct proto {
kmem_cache_t *slab; kmem_cache_t *slab;
int slab_obj_size; int slab_obj_size;
void *af_specific;
char name[32]; char name[32];
......
...@@ -107,9 +107,9 @@ static void inet6_sock_destruct(struct sock *sk) ...@@ -107,9 +107,9 @@ static void inet6_sock_destruct(struct sock *sk)
static __inline__ struct ipv6_pinfo *inet6_sk_generic(struct sock *sk) 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) static int inet6_create(struct socket *sock, int protocol)
......
...@@ -973,10 +973,6 @@ static int rawv6_init_sk(struct sock *sk) ...@@ -973,10 +973,6 @@ static int rawv6_init_sk(struct sock *sk)
return(0); return(0);
} }
struct ipv6_sk_offset raw_sock_offset = {
.offset = offsetof(struct raw6_sock, inet6),
};
struct proto rawv6_prot = { struct proto rawv6_prot = {
.name = "RAW", .name = "RAW",
.close = rawv6_close, .close = rawv6_close,
...@@ -994,7 +990,6 @@ struct proto rawv6_prot = { ...@@ -994,7 +990,6 @@ struct proto rawv6_prot = {
.hash = raw_v6_hash, .hash = raw_v6_hash,
.unhash = raw_v6_unhash, .unhash = raw_v6_unhash,
.slab_obj_size = sizeof(struct raw6_sock), .slab_obj_size = sizeof(struct raw6_sock),
.af_specific = &raw_sock_offset,
}; };
#ifdef CONFIG_PROC_FS #ifdef CONFIG_PROC_FS
......
...@@ -2120,10 +2120,6 @@ void tcp6_proc_exit(void) ...@@ -2120,10 +2120,6 @@ void tcp6_proc_exit(void)
} }
#endif #endif
struct ipv6_sk_offset tcp_sock_offset = {
.offset = offsetof(struct tcp6_sock, inet6),
};
struct proto tcpv6_prot = { struct proto tcpv6_prot = {
.name = "TCPv6", .name = "TCPv6",
.close = tcp_close, .close = tcp_close,
...@@ -2151,7 +2147,6 @@ struct proto tcpv6_prot = { ...@@ -2151,7 +2147,6 @@ struct proto tcpv6_prot = {
.sysctl_rmem = sysctl_tcp_rmem, .sysctl_rmem = sysctl_tcp_rmem,
.max_header = MAX_TCP_HEADER, .max_header = MAX_TCP_HEADER,
.slab_obj_size = sizeof(struct tcp6_sock), .slab_obj_size = sizeof(struct tcp6_sock),
.af_specific = &tcp_sock_offset,
}; };
static struct inet6_protocol tcpv6_protocol = { static struct inet6_protocol tcpv6_protocol = {
......
...@@ -1031,10 +1031,6 @@ void udp6_proc_exit(void) { ...@@ -1031,10 +1031,6 @@ void udp6_proc_exit(void) {
/* ------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------ */
struct ipv6_sk_offset udp_sock_offset = {
.offset = offsetof(struct udp6_sock, inet6),
};
struct proto udpv6_prot = { struct proto udpv6_prot = {
.name = "UDP", .name = "UDP",
.close = udpv6_close, .close = udpv6_close,
...@@ -1051,7 +1047,6 @@ struct proto udpv6_prot = { ...@@ -1051,7 +1047,6 @@ struct proto udpv6_prot = {
.unhash = udp_v6_unhash, .unhash = udp_v6_unhash,
.get_port = udp_v6_get_port, .get_port = udp_v6_get_port,
.slab_obj_size = sizeof(struct udp6_sock), .slab_obj_size = sizeof(struct udp6_sock),
.af_specific = &udp_sock_offset,
}; };
extern struct proto_ops inet6_dgram_ops; extern struct proto_ops inet6_dgram_ops;
......
...@@ -4626,10 +4626,6 @@ struct proto sctp_prot = { ...@@ -4626,10 +4626,6 @@ struct proto sctp_prot = {
}; };
#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) #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 = { struct proto sctpv6_prot = {
.name = "SCTPv6", .name = "SCTPv6",
.close = sctp_close, .close = sctp_close,
...@@ -4650,6 +4646,5 @@ struct proto sctpv6_prot = { ...@@ -4650,6 +4646,5 @@ struct proto sctpv6_prot = {
.unhash = sctp_unhash, .unhash = sctp_unhash,
.get_port = sctp_get_port, .get_port = sctp_get_port,
.slab_obj_size = sizeof(struct sctp6_sock), .slab_obj_size = sizeof(struct sctp6_sock),
.af_specific = &sctp_sock_offset,
}; };
#endif /* defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) */ #endif /* defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment