now , I see . Subject: RE: struct sock->inet_sock convert question Date: Thu, 2 Feb 2012 10:36:03 -0800 From: jharan@xxxxxxxxxxxxxx To: duanshuidao@xxxxxxxxxxx; kernelnewbies@xxxxxxxxxxxxxxxxx
From: kernelnewbies-bounces@xxxxxxxxxxxxxxxxx [mailto:kernelnewbies-bounces@xxxxxxxxxxxxxxxxx] On Behalf Of hu jun
in kernel linux-2.6.16.60-0.54.5 code:
static int inet_create(struct socket *sock, int protocol) { struct sock *sk; struct inet_sock *inet; ....
sk = sk_alloc(PF_INET, GFP_KERNEL, answer_prot, 1); if (sk == NULL) goto out;
inet = inet_sk(sk); inet->is_icsk = (INET_PROTOSW_ICSK & answer_flags) == INET_PROTOSW_ICSK;
if (SOCK_RAW == sock->type) { inet->num = protocol; if (IPPROTO_RAW == protocol) inet->hdrincl = 1; }
if (ipv4_config.no_pmtu_disc) inet->pmtudisc = IP_PMTUDISC_DONT; else inet->pmtudisc = IP_PMTUDISC_WANT;
inet->id = 0; .... }
my question is in the red line , why can convert like that?
thanks!
I am not sure I understand your question, but inet_sk() is just a type cast:
static inline struct inet_sock *inet_sk(const struct sock *sk) { return (struct inet_sock *)sk; }
Which is valid since the first member of struct inet_sock is a struct sock:
struct inet_sock { /* sk and pinet6 has to be the first two members of inet_sock */ struct sock sk; ...
I haven't dived into the bowels of sk_alloc(), but I assume it allocates a big enough memory block so that after the type cast, the resultant pointer points to memory big enough to store an struct inet_sock or any other *_sock structures that get cast to struct sock.
Jeff Haran
_______________________________________________ Kernelnewbies mailing list Kernelnewbies@xxxxxxxxxxxxxxxxx http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies |
_______________________________________________ Kernelnewbies mailing list Kernelnewbies@xxxxxxxxxxxxxxxxx http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies