home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / src / linux-headers-2.6.17-6 / include / net / inet_sock.h < prev    next >
Encoding:
C/C++ Source or Header  |  2006-08-11  |  4.8 KB  |  193 lines

  1. /*
  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.
  5.  *
  6.  *        Definitions for inet_sock
  7.  *
  8.  * Authors:    Many, reorganised here by
  9.  *         Arnaldo Carvalho de Melo <acme@mandriva.com>
  10.  *
  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.
  15.  */
  16. #ifndef _INET_SOCK_H
  17. #define _INET_SOCK_H
  18.  
  19.  
  20. #include <linux/string.h>
  21. #include <linux/types.h>
  22.  
  23. #include <net/flow.h>
  24. #include <net/sock.h>
  25. #include <net/request_sock.h>
  26.  
  27. /** struct ip_options - IP Options
  28.  *
  29.  * @faddr - Saved first hop address
  30.  * @is_setbyuser - Set by setsockopt?
  31.  * @is_data - Options in __data, rather than skb
  32.  * @is_strictroute - Strict source route
  33.  * @srr_is_hit - Packet destination addr was our one
  34.  * @is_changed - IP checksum more not valid
  35.  * @rr_needaddr - Need to record addr of outgoing dev
  36.  * @ts_needtime - Need to record timestamp
  37.  * @ts_needaddr - Need to record addr of outgoing dev
  38.  */
  39. struct ip_options {
  40.     __u32        faddr;
  41.     unsigned char    optlen;
  42.     unsigned char    srr;
  43.     unsigned char    rr;
  44.     unsigned char    ts;
  45.     unsigned char    is_setbyuser:1,
  46.             is_data:1,
  47.             is_strictroute:1,
  48.             srr_is_hit:1,
  49.             is_changed:1,
  50.             rr_needaddr:1,
  51.             ts_needtime:1,
  52.             ts_needaddr:1;
  53.     unsigned char    router_alert;
  54.     unsigned char    __pad1;
  55.     unsigned char    __pad2;
  56.     unsigned char    __data[0];
  57. };
  58.  
  59. #define optlength(opt) (sizeof(struct ip_options) + opt->optlen)
  60.  
  61. struct inet_request_sock {
  62.     struct request_sock    req;
  63. #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
  64.     u16            inet6_rsk_offset;
  65.     /* 2 bytes hole, try to pack */
  66. #endif
  67.     u32            loc_addr;
  68.     u32            rmt_addr;
  69.     u16            rmt_port;
  70.     u16            snd_wscale : 4, 
  71.                 rcv_wscale : 4, 
  72.                 tstamp_ok  : 1,
  73.                 sack_ok       : 1,
  74.                 wscale_ok  : 1,
  75.                 ecn_ok       : 1,
  76.                 acked       : 1;
  77.     struct ip_options    *opt;
  78. };
  79.  
  80. static inline struct inet_request_sock *inet_rsk(const struct request_sock *sk)
  81. {
  82.     return (struct inet_request_sock *)sk;
  83. }
  84.  
  85. struct ip_mc_socklist;
  86. struct ipv6_pinfo;
  87. struct rtable;
  88.  
  89. /** struct inet_sock - representation of INET sockets
  90.  *
  91.  * @sk - ancestor class
  92.  * @pinet6 - pointer to IPv6 control block
  93.  * @daddr - Foreign IPv4 addr
  94.  * @rcv_saddr - Bound local IPv4 addr
  95.  * @dport - Destination port
  96.  * @num - Local port
  97.  * @saddr - Sending source
  98.  * @uc_ttl - Unicast TTL
  99.  * @sport - Source port
  100.  * @id - ID counter for DF pkts
  101.  * @tos - TOS
  102.  * @mc_ttl - Multicasting TTL
  103.  * @is_icsk - is this an inet_connection_sock?
  104.  * @mc_index - Multicast device index
  105.  * @mc_list - Group array
  106.  * @cork - info to build ip hdr on each ip frag while socket is corked
  107.  */
  108. struct inet_sock {
  109.     /* sk and pinet6 has to be the first two members of inet_sock */
  110.     struct sock        sk;
  111. #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
  112.     struct ipv6_pinfo    *pinet6;
  113. #endif
  114.     /* Socket demultiplex comparisons on incoming packets. */
  115.     __u32            daddr;
  116.     __u32            rcv_saddr;
  117.     __u16            dport;
  118.     __u16            num;
  119.     __u32            saddr;
  120.     __s16            uc_ttl;
  121.     __u16            cmsg_flags;
  122.     struct ip_options    *opt;
  123.     __u16            sport;
  124.     __u16            id;
  125.     __u8            tos;
  126.     __u8            mc_ttl;
  127.     __u8            pmtudisc;
  128.     __u8            recverr:1,
  129.                 is_icsk:1,
  130.                 freebind:1,
  131.                 hdrincl:1,
  132.                 mc_loop:1;
  133.     int            mc_index;
  134.     __u32            mc_addr;
  135.     struct ip_mc_socklist    *mc_list;
  136.     struct {
  137.         unsigned int        flags;
  138.         unsigned int        fragsize;
  139.         struct ip_options    *opt;
  140.         struct rtable        *rt;
  141.         int            length; /* Total length of all frames */
  142.         u32            addr;
  143.         struct flowi        fl;
  144.     } cork;
  145. };
  146.  
  147. #define IPCORK_OPT    1    /* ip-options has been held in ipcork.opt */
  148. #define IPCORK_ALLFRAG    2    /* always fragment (for ipv6 for now) */
  149.  
  150. static inline struct inet_sock *inet_sk(const struct sock *sk)
  151. {
  152.     return (struct inet_sock *)sk;
  153. }
  154.  
  155. static inline void __inet_sk_copy_descendant(struct sock *sk_to,
  156.                          const struct sock *sk_from,
  157.                          const int ancestor_size)
  158. {
  159.     memcpy(inet_sk(sk_to) + 1, inet_sk(sk_from) + 1,
  160.            sk_from->sk_prot->obj_size - ancestor_size);
  161. }
  162. #if !(defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE))
  163. static inline void inet_sk_copy_descendant(struct sock *sk_to,
  164.                        const struct sock *sk_from)
  165. {
  166.     __inet_sk_copy_descendant(sk_to, sk_from, sizeof(struct inet_sock));
  167. }
  168. #endif
  169.  
  170. extern int inet_sk_rebuild_header(struct sock *sk);
  171.  
  172. static inline unsigned int inet_ehashfn(const __u32 laddr, const __u16 lport,
  173.                     const __u32 faddr, const __u16 fport)
  174. {
  175.     unsigned int h = (laddr ^ lport) ^ (faddr ^ fport);
  176.     h ^= h >> 16;
  177.     h ^= h >> 8;
  178.     return h;
  179. }
  180.  
  181. static inline int inet_sk_ehashfn(const struct sock *sk)
  182. {
  183.     const struct inet_sock *inet = inet_sk(sk);
  184.     const __u32 laddr = inet->rcv_saddr;
  185.     const __u16 lport = inet->num;
  186.     const __u32 faddr = inet->daddr;
  187.     const __u16 fport = inet->dport;
  188.  
  189.     return inet_ehashfn(laddr, lport, faddr, fport);
  190. }
  191.  
  192. #endif    /* _INET_SOCK_H */
  193.