linux/include/net/route.h
<<
>>
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 router.
   7 *
   8 * Version:     @(#)route.h     1.0.4   05/27/93
   9 *
  10 * Authors:     Ross Biro
  11 *              Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
  12 * Fixes:
  13 *              Alan Cox        :       Reformatted. Added ip_rt_local()
  14 *              Alan Cox        :       Support for TCP parameters.
  15 *              Alexey Kuznetsov:       Major changes for new routing code.
  16 *              Mike McLagan    :       Routing by source
  17 *              Robert Olsson   :       Added rt_cache statistics
  18 *
  19 *              This program is free software; you can redistribute it and/or
  20 *              modify it under the terms of the GNU General Public License
  21 *              as published by the Free Software Foundation; either version
  22 *              2 of the License, or (at your option) any later version.
  23 */
  24#ifndef _ROUTE_H
  25#define _ROUTE_H
  26
  27#include <net/dst.h>
  28#include <net/inetpeer.h>
  29#include <net/flow.h>
  30#include <net/inet_sock.h>
  31#include <linux/in_route.h>
  32#include <linux/rtnetlink.h>
  33#include <linux/route.h>
  34#include <linux/ip.h>
  35#include <linux/cache.h>
  36#include <linux/security.h>
  37
  38#ifndef __KERNEL__
  39#warning This file is not supposed to be used outside of kernel.
  40#endif
  41
  42#define RTO_ONLINK      0x01
  43
  44#define RTO_CONN        0
  45/* RTO_CONN is not used (being alias for 0), but preserved not to break
  46 * some modules referring to it. */
  47
  48#define RT_CONN_FLAGS(sk)   (RT_TOS(inet_sk(sk)->tos) | sock_flag(sk, SOCK_LOCALROUTE))
  49
  50struct fib_nh;
  51struct inet_peer;
  52struct rtable {
  53        union {
  54                struct dst_entry        dst;
  55        } u;
  56
  57        /* Cache lookup keys */
  58        struct flowi            fl;
  59
  60        struct in_device        *idev;
  61        
  62        int                     rt_genid;
  63        unsigned                rt_flags;
  64        __u16                   rt_type;
  65
  66        __be32                  rt_dst; /* Path destination     */
  67        __be32                  rt_src; /* Path source          */
  68        int                     rt_iif;
  69
  70        /* Info on neighbour */
  71        __be32                  rt_gateway;
  72
  73        /* Miscellaneous cached information */
  74        __be32                  rt_spec_dst; /* RFC1122 specific destination */
  75        struct inet_peer        *peer; /* long-living peer info */
  76};
  77
  78struct ip_rt_acct {
  79        __u32   o_bytes;
  80        __u32   o_packets;
  81        __u32   i_bytes;
  82        __u32   i_packets;
  83};
  84
  85struct rt_cache_stat {
  86        unsigned int in_hit;
  87        unsigned int in_slow_tot;
  88        unsigned int in_slow_mc;
  89        unsigned int in_no_route;
  90        unsigned int in_brd;
  91        unsigned int in_martian_dst;
  92        unsigned int in_martian_src;
  93        unsigned int out_hit;
  94        unsigned int out_slow_tot;
  95        unsigned int out_slow_mc;
  96        unsigned int gc_total;
  97        unsigned int gc_ignored;
  98        unsigned int gc_goal_miss;
  99        unsigned int gc_dst_overflow;
 100        unsigned int in_hlist_search;
 101        unsigned int out_hlist_search;
 102};
 103
 104extern struct ip_rt_acct *ip_rt_acct;
 105
 106struct in_device;
 107extern int              ip_rt_init(void);
 108extern void             ip_rt_redirect(__be32 old_gw, __be32 dst, __be32 new_gw,
 109                                       __be32 src, struct net_device *dev);
 110extern void             rt_cache_flush(struct net *net, int how);
 111extern void             rt_cache_flush_batch(void);
 112extern int              __ip_route_output_key(struct net *, struct rtable **, const struct flowi *flp);
 113extern int              ip_route_output_key(struct net *, struct rtable **, struct flowi *flp);
 114extern int              ip_route_output_flow(struct net *, struct rtable **rp, struct flowi *flp, struct sock *sk, int flags);
 115extern int              ip_route_input(struct sk_buff*, __be32 dst, __be32 src, u8 tos, struct net_device *devin);
 116extern unsigned short   ip_rt_frag_needed(struct net *net, struct iphdr *iph, unsigned short new_mtu, struct net_device *dev);
 117extern void             ip_rt_send_redirect(struct sk_buff *skb);
 118
 119extern unsigned         inet_addr_type(struct net *net, __be32 addr);
 120extern unsigned         inet_dev_addr_type(struct net *net, const struct net_device *dev, __be32 addr);
 121extern void             ip_rt_multicast_event(struct in_device *);
 122extern int              ip_rt_ioctl(struct net *, unsigned int cmd, void __user *arg);
 123extern void             ip_rt_get_source(u8 *src, struct rtable *rt);
 124extern int              ip_rt_dump(struct sk_buff *skb,  struct netlink_callback *cb);
 125
 126struct in_ifaddr;
 127extern void fib_add_ifaddr(struct in_ifaddr *);
 128
 129static inline void ip_rt_put(struct rtable * rt)
 130{
 131        if (rt)
 132                dst_release(&rt->u.dst);
 133}
 134
 135#define IPTOS_RT_MASK   (IPTOS_TOS_MASK & ~3)
 136
 137extern const __u8 ip_tos2prio[16];
 138
 139static inline char rt_tos2priority(u8 tos)
 140{
 141        return ip_tos2prio[IPTOS_TOS(tos)>>1];
 142}
 143
 144static inline int ip_route_connect(struct rtable **rp, __be32 dst,
 145                                   __be32 src, u32 tos, int oif, u8 protocol,
 146                                   __be16 sport, __be16 dport, struct sock *sk,
 147                                   int flags)
 148{
 149        struct flowi fl = { .oif = oif,
 150                            .mark = sk->sk_mark,
 151                            .nl_u = { .ip4_u = { .daddr = dst,
 152                                                 .saddr = src,
 153                                                 .tos   = tos } },
 154                            .proto = protocol,
 155                            .uli_u = { .ports =
 156                                       { .sport = sport,
 157                                         .dport = dport } } };
 158
 159        int err;
 160        struct net *net = sock_net(sk);
 161
 162        if (inet_sk(sk)->transparent)
 163                fl.flags |= FLOWI_FLAG_ANYSRC;
 164
 165        if (!dst || !src) {
 166                err = __ip_route_output_key(net, rp, &fl);
 167                if (err)
 168                        return err;
 169                fl.fl4_dst = (*rp)->rt_dst;
 170                fl.fl4_src = (*rp)->rt_src;
 171                ip_rt_put(*rp);
 172                *rp = NULL;
 173        }
 174        security_sk_classify_flow(sk, &fl);
 175        return ip_route_output_flow(net, rp, &fl, sk, flags);
 176}
 177
 178static inline int ip_route_newports(struct rtable **rp, u8 protocol,
 179                                    __be16 sport, __be16 dport, struct sock *sk)
 180{
 181        if (sport != (*rp)->fl.fl_ip_sport ||
 182            dport != (*rp)->fl.fl_ip_dport) {
 183                struct flowi fl;
 184
 185                memcpy(&fl, &(*rp)->fl, sizeof(fl));
 186                fl.fl_ip_sport = sport;
 187                fl.fl_ip_dport = dport;
 188                fl.proto = protocol;
 189                ip_rt_put(*rp);
 190                *rp = NULL;
 191                security_sk_classify_flow(sk, &fl);
 192                return ip_route_output_flow(sock_net(sk), rp, &fl, sk, 0);
 193        }
 194        return 0;
 195}
 196
 197extern void rt_bind_peer(struct rtable *rt, int create);
 198
 199static inline struct inet_peer *rt_get_peer(struct rtable *rt)
 200{
 201        if (rt->peer)
 202                return rt->peer;
 203
 204        rt_bind_peer(rt, 0);
 205        return rt->peer;
 206}
 207
 208static inline int inet_iif(const struct sk_buff *skb)
 209{
 210        return skb_rtable(skb)->rt_iif;
 211}
 212
 213#endif  /* _ROUTE_H */
 214
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.