2 * INET An implementation of the TCP/IP protocol suite for the LINUX
3 * operating system. INET is implemented using the BSD Socket
4 * interface as the means of communication with the user level.
6 * Definitions for inet_sock
8 * Authors: Many, reorganised here by
9 * Arnaldo Carvalho de Melo <acme@mandriva.com>
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License
13 * as published by the Free Software Foundation; either version
14 * 2 of the License, or (at your option) any later version.
20 #include <linux/string.h>
21 #include <linux/types.h>
25 #include <net/request_sock.h>
27 /** struct ip_options - IP Options
29 * @faddr - Saved first hop address
30 * @is_data - Options in __data, rather than skb
31 * @is_strictroute - Strict source route
32 * @srr_is_hit - Packet destination addr was our one
33 * @is_changed - IP checksum more not valid
34 * @rr_needaddr - Need to record addr of outgoing dev
35 * @ts_needtime - Need to record timestamp
36 * @ts_needaddr - Need to record addr of outgoing dev
44 unsigned char is_data
:1,
51 unsigned char router_alert
;
54 unsigned char __data
[0];
57 #define optlength(opt) (sizeof(struct ip_options) + opt->optlen)
59 struct inet_request_sock
{
60 struct request_sock req
;
61 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
63 /* 2 bytes hole, try to pack */
75 struct ip_options
*opt
;
78 static inline struct inet_request_sock
*inet_rsk(const struct request_sock
*sk
)
80 return (struct inet_request_sock
*)sk
;
83 struct ip_mc_socklist
;
87 /** struct inet_sock - representation of INET sockets
89 * @sk - ancestor class
90 * @pinet6 - pointer to IPv6 control block
91 * @daddr - Foreign IPv4 addr
92 * @rcv_saddr - Bound local IPv4 addr
93 * @dport - Destination port
95 * @saddr - Sending source
96 * @uc_ttl - Unicast TTL
97 * @sport - Source port
98 * @id - ID counter for DF pkts
100 * @mc_ttl - Multicasting TTL
101 * @is_icsk - is this an inet_connection_sock?
102 * @mc_index - Multicast device index
103 * @mc_list - Group array
104 * @cork - info to build ip hdr on each ip frag while socket is corked
107 /* sk and pinet6 has to be the first two members of inet_sock */
109 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
110 struct ipv6_pinfo
*pinet6
;
112 /* Socket demultiplex comparisons on incoming packets. */
120 struct ip_options
*opt
;
133 struct ip_mc_socklist
*mc_list
;
136 unsigned int fragsize
;
137 struct ip_options
*opt
;
139 int length
; /* Total length of all frames */
145 #define IPCORK_OPT 1 /* ip-options has been held in ipcork.opt */
146 #define IPCORK_ALLFRAG 2 /* always fragment (for ipv6 for now) */
148 static inline struct inet_sock
*inet_sk(const struct sock
*sk
)
150 return (struct inet_sock
*)sk
;
153 static inline void __inet_sk_copy_descendant(struct sock
*sk_to
,
154 const struct sock
*sk_from
,
155 const int ancestor_size
)
157 memcpy(inet_sk(sk_to
) + 1, inet_sk(sk_from
) + 1,
158 sk_from
->sk_prot
->obj_size
- ancestor_size
);
160 #if !(defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE))
161 static inline void inet_sk_copy_descendant(struct sock
*sk_to
,
162 const struct sock
*sk_from
)
164 __inet_sk_copy_descendant(sk_to
, sk_from
, sizeof(struct inet_sock
));
168 extern int inet_sk_rebuild_header(struct sock
*sk
);
170 static inline unsigned int inet_ehashfn(const __be32 laddr
, const __u16 lport
,
171 const __be32 faddr
, const __be16 fport
)
173 unsigned int h
= ((__force __u32
)laddr
^ lport
) ^ ((__force __u32
)faddr
^ (__force __u32
)fport
);
179 static inline int inet_sk_ehashfn(const struct sock
*sk
)
181 const struct inet_sock
*inet
= inet_sk(sk
);
182 const __be32 laddr
= inet
->rcv_saddr
;
183 const __u16 lport
= inet
->num
;
184 const __be32 faddr
= inet
->daddr
;
185 const __be16 fport
= inet
->dport
;
187 return inet_ehashfn(laddr
, lport
, faddr
, fport
);
190 #endif /* _INET_SOCK_H */