1. 程式人生 > >幾個重要資料結構的關係

幾個重要資料結構的關係

這幾個資料結構關聯在一起:

tcp_sock --> inet_connection_sock --> inet_sock --> sock --> sock_common


struct tcp_sock {
	/* inet_connection_sock has to be the first member of tcp_sock */
	struct inet_connection_sock	inet_conn;
	u16	tcp_header_len;	/* Bytes of tcp header to send		*/
	u16	gso_segs;	/* Max number of segs per GSO packet	*/
}

 

struct inet_connection_sock {
	/* inet_sock has to be the first member! */
	struct inet_sock	  icsk_inet;

 	struct timer_list	  icsk_retransmit_timer; // timer
 	struct timer_list	  icsk_delack_timer;
}

 


struct inet_sock {
	/* sk and pinet6 has to be the first two members of inet_sock */
	struct sock		sk;

	__be32			inet_saddr;      // IP地址   
	__s16			uc_ttl;
	__u16			cmsg_flags;
	__be16			inet_sport;      // 埠號
	__u16			inet_id;         
}

 

struct sock {
	/*
	 * Now struct inet_timewait_sock also uses sock_common, so please just
	 * don't add nothing before this first member (__sk_common) --acme
	 */
	struct sock_common	__sk_common;

	struct sk_buff_head	sk_receive_queue;
    
	struct {
		atomic_t	rmem_alloc;
		int		len;
		struct sk_buff	*head;
		struct sk_buff	*tail;
	} sk_backlog;

	struct sk_buff_head	sk_write_queue;
}

 

struct sock_common {
	/* skc_daddr and skc_rcv_saddr must be grouped on a 8 bytes aligned
	 * address on 64bit arches : cf INET_MATCH()
	 */
	union {
		__addrpair	skc_addrpair;
		struct {
			__be32	skc_daddr;
			__be32	skc_rcv_saddr;
		};
	};
	union  {
		unsigned int	skc_hash;
		__u16		skc_u16hashes[2];
	};
	/* skc_dport && skc_num must be grouped as well */
	union {
		__portpair	skc_portpair;
		struct {
			__be16	skc_dport;
			__u16	skc_num;
		};
	};

}