linux-bk/include/net/ip.h History
<<
>>
Prefs
   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 the IP module.
   7 *
   8 * Version:     @(#)ip.h        1.0.2   05/07/93
   9 *
  10 * Authors:     Ross Biro, <bir7@leland.Stanford.Edu>
  11 *              Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
  12 *              Alan Cox, <gw4pts@gw4pts.ampr.org>
  13 *
  14 * Changes:
  15 *              Mike McLagan    :       Routing by source
  16 *
  17 *              This program is free software; you can redistribute it and/or
  18 *              modify it under the terms of the GNU General Public License
  19 *              as published by the Free Software Foundation; either version
  20 *              2 of the License, or (at your option) any later version.
  21 */
  22#ifndef _IP_H
  23#define _IP_H
  24
  25#include <linux/config.h>
  26#include <linux/types.h>
  27#include <linux/socket.h>
  28#include <linux/ip.h>
  29#include <linux/in.h>
  30#include <linux/netdevice.h>
  31#include <linux/inetdevice.h>
  32#include <linux/in_route.h>
  33#include <net/route.h>
  34#include <net/arp.h>
  35
  36#ifndef _SNMP_H
  37#include <net/snmp.h>
  38#endif
  39
  40#include <net/sock.h>   /* struct sock */
  41
  42struct inet_skb_parm
  43{
  44        struct ip_options       opt;            /* Compiled IP options          */
  45        unsigned char           flags;
  46
  47#define IPSKB_MASQUERADED       1
  48#define IPSKB_TRANSLATED        2
  49#define IPSKB_FORWARDED         4
  50#define IPSKB_XFRM_TUNNEL_SIZE  8
  51};
  52
  53struct ipcm_cookie
  54{
  55        u32                     addr;
  56        int                     oif;
  57        struct ip_options       *opt;
  58};
  59
  60#define IPCB(skb) ((struct inet_skb_parm*)((skb)->cb))
  61
  62struct ip_ra_chain
  63{
  64        struct ip_ra_chain      *next;
  65        struct sock             *sk;
  66        void                    (*destructor)(struct sock *);
  67};
  68
  69extern struct ip_ra_chain *ip_ra_chain;
  70extern rwlock_t ip_ra_lock;
  71
  72/* IP flags. */
  73#define IP_CE           0x8000          /* Flag: "Congestion"           */
  74#define IP_DF           0x4000          /* Flag: "Don't Fragment"       */
  75#define IP_MF           0x2000          /* Flag: "More Fragments"       */
  76#define IP_OFFSET       0x1FFF          /* "Fragment Offset" part       */
  77
  78#define IP_FRAG_TIME    (30 * HZ)               /* fragment lifetime    */
  79
  80extern void             ip_mc_dropsocket(struct sock *);
  81extern void             ip_mc_dropdevice(struct net_device *dev);
  82extern int              igmp_mc_proc_init(void);
  83
  84/*
  85 *      Functions provided by ip.c
  86 */
  87
  88extern int              ip_build_and_send_pkt(struct sk_buff *skb, struct sock *sk,
  89                                              u32 saddr, u32 daddr,
  90                                              struct ip_options *opt);
  91extern int              ip_rcv(struct sk_buff *skb, struct net_device *dev,
  92                               struct packet_type *pt);
  93extern int              ip_local_deliver(struct sk_buff *skb);
  94extern int              ip_mr_input(struct sk_buff *skb);
  95extern int              ip_output(struct sk_buff *skb);
  96extern int              ip_mc_output(struct sk_buff *skb);
  97extern int              ip_fragment(struct sk_buff *skb, int (*out)(struct sk_buff*));
  98extern int              ip_do_nat(struct sk_buff *skb);
  99extern void             ip_send_check(struct iphdr *ip);
 100extern int              ip_queue_xmit(struct sk_buff *skb, int ipfragok);
 101extern void             ip_init(void);
 102extern int              ip_append_data(struct sock *sk,
 103                                       int getfrag(void *from, char *to, int offset, int len,
 104                                                   int odd, struct sk_buff *skb),
 105                                void *from, int len, int protolen,
 106                                struct ipcm_cookie *ipc,
 107                                struct rtable *rt,
 108                                unsigned int flags);
 109extern int              ip_generic_getfrag(void *from, char *to, int offset, int len, int odd, struct sk_buff *skb);
 110extern ssize_t          ip_append_page(struct sock *sk, struct page *page,
 111                                int offset, size_t size, int flags);
 112extern int              ip_push_pending_frames(struct sock *sk);
 113extern void             ip_flush_pending_frames(struct sock *sk);
 114
 115
 116/*
 117 *      Map a multicast IP onto multicast MAC for type Token Ring.
 118 *      This conforms to RFC1469 Option 2 Multicasting i.e.
 119 *      using a functional address to transmit / receive 
 120 *      multicast packets.
 121 */
 122
 123static inline void ip_tr_mc_map(u32 addr, char *buf)
 124{
 125        buf[0]=0xC0;
 126        buf[1]=0x00;
 127        buf[2]=0x00;
 128        buf[3]=0x04;
 129        buf[4]=0x00;
 130        buf[5]=0x00;
 131}
 132
 133struct ip_reply_arg {
 134        struct iovec iov[1];   
 135        u32          csum; 
 136        int          csumoffset; /* u16 offset of csum in iov[0].iov_base */
 137                                 /* -1 if not needed */ 
 138}; 
 139
 140void ip_send_reply(struct sock *sk, struct sk_buff *skb, struct ip_reply_arg *arg,
 141                   unsigned int len); 
 142
 143extern int ip_finish_output(struct sk_buff *skb);
 144
 145struct ipv4_config
 146{
 147        int     log_martians;
 148        int     autoconfig;
 149        int     no_pmtu_disc;
 150};
 151
 152extern struct ipv4_config ipv4_config;
 153DECLARE_SNMP_STAT(struct ip_mib, ip_statistics);
 154#define IP_INC_STATS(field)             SNMP_INC_STATS(ip_statistics, field)
 155#define IP_INC_STATS_BH(field)          SNMP_INC_STATS_BH(ip_statistics, field)
 156#define IP_INC_STATS_USER(field)        SNMP_INC_STATS_USER(ip_statistics, field)
 157DECLARE_SNMP_STAT(struct linux_mib, net_statistics);
 158#define NET_INC_STATS(field)            SNMP_INC_STATS(net_statistics, field)
 159#define NET_INC_STATS_BH(field)         SNMP_INC_STATS_BH(net_statistics, field)
 160#define NET_INC_STATS_USER(field)       SNMP_INC_STATS_USER(net_statistics, field)
 161#define NET_ADD_STATS_BH(field, adnd)   SNMP_ADD_STATS_BH(net_statistics, field, adnd)
 162#define NET_ADD_STATS_USER(field, adnd) SNMP_ADD_STATS_USER(net_statistics, field, adnd)
 163
 164extern int sysctl_local_port_range[2];
 165extern int sysctl_ip_default_ttl;
 166
 167#ifdef CONFIG_INET
 168/* The function in 2.2 was invalid, producing wrong result for
 169 * check=0xFEFF. It was noticed by Arthur Skawina _year_ ago. --ANK(000625) */
 170static inline
 171int ip_decrease_ttl(struct iphdr *iph)
 172{
 173        u32 check = iph->check;
 174        check += htons(0x0100);
 175        iph->check = check + (check>=0xFFFF);
 176        return --iph->ttl;
 177}
 178
 179static inline
 180int ip_dont_fragment(struct sock *sk, struct dst_entry *dst)
 181{
 182        return (inet_sk(sk)->pmtudisc == IP_PMTUDISC_DO ||
 183                (inet_sk(sk)->pmtudisc == IP_PMTUDISC_WANT &&
 184                 !(dst_metric(dst, RTAX_LOCK)&(1<<RTAX_MTU))));
 185}
 186
 187extern void __ip_select_ident(struct iphdr *iph, struct dst_entry *dst, int more);
 188
 189static inline void ip_select_ident(struct iphdr *iph, struct dst_entry *dst, struct sock *sk)
 190{
 191        if (iph->frag_off & htons(IP_DF)) {
 192                /* This is only to work around buggy Windows95/2000
 193                 * VJ compression implementations.  If the ID field
 194                 * does not change, they drop every other packet in
 195                 * a TCP stream using header compression.
 196                 */
 197                iph->id = (sk && inet_sk(sk)->daddr) ?
 198                                        htons(inet_sk(sk)->id++) : 0;
 199        } else
 200                __ip_select_ident(iph, dst, 0);
 201}
 202
 203static inline void ip_select_ident_more(struct iphdr *iph, struct dst_entry *dst, struct sock *sk, int more)
 204{
 205        if (iph->frag_off & htons(IP_DF)) {
 206                if (sk && inet_sk(sk)->daddr) {
 207                        iph->id = htons(inet_sk(sk)->id);
 208                        inet_sk(sk)->id += 1 + more;
 209                } else
 210                        iph->id = 0;
 211        } else
 212                __ip_select_ident(iph, dst, more);
 213}
 214
 215/*
 216 *      Map a multicast IP onto multicast MAC for type ethernet.
 217 */
 218
 219static inline void ip_eth_mc_map(u32 addr, char *buf)
 220{
 221        addr=ntohl(addr);
 222        buf[0]=0x01;
 223        buf[1]=0x00;
 224        buf[2]=0x5e;
 225        buf[5]=addr&0xFF;
 226        addr>>=8;
 227        buf[4]=addr&0xFF;
 228        addr>>=8;
 229        buf[3]=addr&0x7F;
 230}
 231
 232#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
 233#include <linux/ipv6.h>
 234#endif
 235
 236static __inline__ void inet_reset_saddr(struct sock *sk)
 237{
 238        inet_sk(sk)->rcv_saddr = inet_sk(sk)->saddr = 0;
 239#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
 240        if (sk->sk_family == PF_INET6) {
 241                struct ipv6_pinfo *np = inet6_sk(sk);
 242
 243                memset(&np->saddr, 0, sizeof(np->saddr));
 244                memset(&np->rcv_saddr, 0, sizeof(np->rcv_saddr));
 245        }
 246#endif
 247}
 248
 249#endif
 250
 251extern int      ip_call_ra_chain(struct sk_buff *skb);
 252
 253/*
 254 *      Functions provided by ip_fragment.o
 255 */
 256 
 257struct sk_buff *ip_defrag(struct sk_buff *skb);
 258extern int ip_frag_nqueues;
 259extern atomic_t ip_frag_mem;
 260
 261/*
 262 *      Functions provided by ip_forward.c
 263 */
 264 
 265extern int ip_forward(struct sk_buff *skb);
 266extern int ip_net_unreachable(struct sk_buff *skb);
 267 
 268/*
 269 *      Functions provided by ip_options.c
 270 */
 271 
 272extern void ip_options_build(struct sk_buff *skb, struct ip_options *opt, u32 daddr, struct rtable *rt, int is_frag);
 273extern int ip_options_echo(struct ip_options *dopt, struct sk_buff *skb);
 274extern void ip_options_fragment(struct sk_buff *skb);
 275extern int ip_options_compile(struct ip_options *opt, struct sk_buff *skb);
 276extern int ip_options_get(struct ip_options **optp, unsigned char *data, int optlen, int user);
 277extern void ip_options_undo(struct ip_options * opt);
 278extern void ip_forward_options(struct sk_buff *skb);
 279extern int ip_options_rcv_srr(struct sk_buff *skb);
 280
 281/*
 282 *      Functions provided by ip_sockglue.c
 283 */
 284
 285extern void     ip_cmsg_recv(struct msghdr *msg, struct sk_buff *skb);
 286extern int      ip_cmsg_send(struct msghdr *msg, struct ipcm_cookie *ipc);
 287extern int      ip_setsockopt(struct sock *sk, int level, int optname, char *optval, int optlen);
 288extern int      ip_getsockopt(struct sock *sk, int level, int optname, char *optval, int *optlen);
 289extern int      ip_ra_control(struct sock *sk, unsigned char on, void (*destructor)(struct sock *));
 290
 291extern int      ip_recv_error(struct sock *sk, struct msghdr *msg, int len);
 292extern void     ip_icmp_error(struct sock *sk, struct sk_buff *skb, int err, 
 293                              u16 port, u32 info, u8 *payload);
 294extern void     ip_local_error(struct sock *sk, int err, u32 daddr, u16 dport,
 295                               u32 info);
 296
 297extern int ipv4_proc_init(void);
 298
 299/* sysctl helpers - any sysctl which holds a value that ends up being
 300 * fed into the routing cache should use these handlers.
 301 */
 302int ipv4_doint_and_flush(ctl_table *ctl, int write,
 303                         struct file* filp, void *buffer,
 304                         size_t *lenp);
 305int ipv4_doint_and_flush_strategy(ctl_table *table, int *name, int nlen,
 306                                  void *oldval, size_t *oldlenp,
 307                                  void *newval, size_t newlen, 
 308                                  void **context);
 309
 310#endif  /* _IP_H */
 311
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.