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