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{
  54        union
  55        {
  56                struct dst_entry        dst;
  57        } u;
  58
  59        /* Cache lookup keys */
  60        struct flowi            fl;
  61
  62        struct in_device        *idev;
  63        
  64        int                     rt_genid;
  65        unsigned                rt_flags;
  66        __u16                   rt_type;
  67
  68        __be32                  rt_dst; /* Path destination     */
  69        __be32                  rt_src; /* Path source          */
  70        int                     rt_iif;
  71
  72        /* Info on neighbour */
  73        __be32                  rt_gateway;
  74
  75        /* Miscellaneous cached information */
  76        __be32                  rt_spec_dst; /* RFC1122 specific destination */
  77        struct inet_peer        *peer; /* long-living peer info */
  78};
  79
  80struct ip_rt_acct
  81{
  82        __u32   o_bytes;
  83        __u32   o_packets;
  84        __u32   i_bytes;
  85        __u32   i_packets;
  86};
  87
  88struct rt_cache_stat 
  89{
  90        unsigned int in_hit;
  91        unsigned int in_slow_tot;
  92        unsigned int in_slow_mc;
  93        unsigned int in_no_route;
  94        unsigned int in_brd;
  95        unsigned int in_martian_dst;
  96        unsigned int in_martian_src;
  97        unsigned int out_hit;
  98        unsigned int out_slow_tot;
  99        unsigned int out_slow_mc;
 100        unsigned int gc_total;
 101        unsigned int gc_ignored;
 102        unsigned int gc_goal_miss;
 103        unsigned int gc_dst_overflow;
 104        unsigned int in_hlist_search;
 105        unsigned int out_hlist_search;
 106};
 107
 108extern struct ip_rt_acct *ip_rt_acct;
 109
 110struct in_device;
 111extern int              ip_rt_init(void);
 112extern void             ip_rt_redirect(__be32 old_gw, __be32 dst, __be32 new_gw,
 113                                       __be32 src, struct net_device *dev);
 114extern void             rt_cache_flush(struct net *net, int how);
 115extern int              __ip_route_output_key(struct net *, struct rtable **, const struct flowi *flp);
 116extern int              ip_route_output_key(struct net *, struct rtable **, struct flowi *flp);
 117extern int              ip_route_output_flow(struct net *, struct rtable **rp, struct flowi *flp, struct sock *sk, int flags);
 118extern int              ip_route_input(struct sk_buff*, __be32 dst, __be32 src, u8 tos, struct net_device *devin);
 119extern unsigned short   ip_rt_frag_needed(struct net *net, struct iphdr *iph, unsigned short new_mtu, struct net_device *dev);
 120extern void             ip_rt_send_redirect(struct sk_buff *skb);
 121
 122extern unsigned         inet_addr_type(struct net *net, __be32 addr);
 123extern unsigned         inet_dev_addr_type(struct net *net, const struct net_device *dev, __be32 addr);
 124extern void             ip_rt_multicast_event(struct in_device *);
 125extern int              ip_rt_ioctl(struct net *, unsigned int cmd, void __user *arg);
 126extern void             ip_rt_get_source(u8 *src, struct rtable *rt);
 127extern int              ip_rt_dump(struct sk_buff *skb,  struct netlink_callback *cb);
 128
 129struct in_ifaddr;
 130extern void fib_add_ifaddr(struct in_ifaddr *);
 131
 132static inline void ip_rt_put(struct rtable * rt)
 133{
 134        if (rt)
 135                dst_release(&rt->u.dst);
 136}
 137
 138#define IPTOS_RT_MASK   (IPTOS_TOS_MASK & ~3)
 139
 140extern const __u8 ip_tos2prio[16];
 141
 142static inline char rt_tos2priority(u8 tos)
 143{
 144        return ip_tos2prio[IPTOS_TOS(tos)>>1];
 145}
 146
 147static inline int ip_route_connect(struct rtable **rp, __be32 dst,
 148                                   __be32 src, u32 tos, int oif, u8 protocol,
 149                                   __be16 sport, __be16 dport, struct sock *sk,
 150                                   int flags)
 151{
 152        struct flowi fl = { .oif = oif,
 153                            .mark = sk->sk_mark,
 154                            .nl_u = { .ip4_u = { .daddr = dst,
 155                                                 .saddr = src,
 156                                                 .tos   = tos } },
 157                            .proto = protocol,
 158                            .uli_u = { .ports =
 159                                       { .sport = sport,
 160                                         .dport = dport } } };
 161
 162        int err;
 163        struct net *net = sock_net(sk);
 164
 165        if (inet_sk(sk)->transparent)
 166                fl.flags |= FLOWI_FLAG_ANYSRC;
 167
 168        if (!dst || !src) {
 169                err = __ip_route_output_key(net, rp, &fl);
 170                if (err)
 171                        return err;
 172                fl.fl4_dst = (*rp)->rt_dst;
 173                fl.fl4_src = (*rp)->rt_src;
 174                ip_rt_put(*rp);
 175                *rp = NULL;
 176        }
 177        security_sk_classify_flow(sk, &fl);
 178        return ip_route_output_flow(net, rp, &fl, sk, flags);
 179}
 180
 181static inline int ip_route_newports(struct rtable **rp, u8 protocol,
 182                                    __be16 sport, __be16 dport, struct sock *sk)
 183{
 184        if (sport != (*rp)->fl.fl_ip_sport ||
 185            dport != (*rp)->fl.fl_ip_dport) {
 186                struct flowi fl;
 187
 188                memcpy(&fl, &(*rp)->fl, sizeof(fl));
 189                fl.fl_ip_sport = sport;
 190                fl.fl_ip_dport = dport;
 191                fl.proto = protocol;
 192                ip_rt_put(*rp);
 193                *rp = NULL;
 194                security_sk_classify_flow(sk, &fl);
 195                return ip_route_output_flow(sock_net(sk), rp, &fl, sk, 0);
 196        }
 197        return 0;
 198}
 199
 200extern void rt_bind_peer(struct rtable *rt, int create);
 201
 202static inline struct inet_peer *rt_get_peer(struct rtable *rt)
 203{
 204        if (rt->peer)
 205                return rt->peer;
 206
 207        rt_bind_peer(rt, 0);
 208        return rt->peer;
 209}
 210
 211static inline int inet_iif(const struct sk_buff *skb)
 212{
 213        return skb_rtable(skb)->rt_iif;
 214}
 215
 216#endif  /* _ROUTE_H */
 217