aboutsummaryrefslogtreecommitdiffstats
path: root/include/net
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2011-03-07 23:54:48 -0500
committerDavid S. Miller <davem@davemloft.net>2011-03-07 23:54:48 -0500
commit1fc050a13473348f5c439de2bb41c8e92dba5588 (patch)
treeb2cecf15f5de87997fb44b4a1025b48d473cd038 /include/net
parent6118e35a7126c1062b1a0f6737b84b4fe4d5c8d4 (diff)
ipv4: Cache source address in nexthop entries.
When doing output route lookups, we have to select the source address if the user has not specified an explicit one. First, if the route has an explicit preferred source address specified, then we use that. Otherwise we search the route's outgoing interface for a suitable address. This search can be precomputed and cached at route insertion time. The only missing part is that we have to refresh this precomputed value any time addresses are added or removed from the interface, and this is accomplished by fib_update_nh_saddrs(). Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/net')
-rw-r--r--include/net/ip_fib.h7
1 files changed, 5 insertions, 2 deletions
diff --git a/include/net/ip_fib.h b/include/net/ip_fib.h
index 523a170b0ecb..0e140830b85a 100644
--- a/include/net/ip_fib.h
+++ b/include/net/ip_fib.h
@@ -60,6 +60,7 @@ struct fib_nh {
60#endif 60#endif
61 int nh_oif; 61 int nh_oif;
62 __be32 nh_gw; 62 __be32 nh_gw;
63 __be32 nh_saddr;
63}; 64};
64 65
65/* 66/*
@@ -139,11 +140,13 @@ struct fib_result_nl {
139 140
140#endif /* CONFIG_IP_ROUTE_MULTIPATH */ 141#endif /* CONFIG_IP_ROUTE_MULTIPATH */
141 142
142#define FIB_RES_PREFSRC(res) ((res).fi->fib_prefsrc ? : __fib_res_prefsrc(&res)) 143#define FIB_RES_SADDR(res) (FIB_RES_NH(res).nh_saddr)
143#define FIB_RES_GW(res) (FIB_RES_NH(res).nh_gw) 144#define FIB_RES_GW(res) (FIB_RES_NH(res).nh_gw)
144#define FIB_RES_DEV(res) (FIB_RES_NH(res).nh_dev) 145#define FIB_RES_DEV(res) (FIB_RES_NH(res).nh_dev)
145#define FIB_RES_OIF(res) (FIB_RES_NH(res).nh_oif) 146#define FIB_RES_OIF(res) (FIB_RES_NH(res).nh_oif)
146 147
148#define FIB_RES_PREFSRC(res) ((res).fi->fib_prefsrc ? : FIB_RES_SADDR(res))
149
147struct fib_table { 150struct fib_table {
148 struct hlist_node tb_hlist; 151 struct hlist_node tb_hlist;
149 u32 tb_id; 152 u32 tb_id;
@@ -224,8 +227,8 @@ extern void fib_select_default(struct fib_result *res);
224extern int ip_fib_check_default(__be32 gw, struct net_device *dev); 227extern int ip_fib_check_default(__be32 gw, struct net_device *dev);
225extern int fib_sync_down_dev(struct net_device *dev, int force); 228extern int fib_sync_down_dev(struct net_device *dev, int force);
226extern int fib_sync_down_addr(struct net *net, __be32 local); 229extern int fib_sync_down_addr(struct net *net, __be32 local);
230extern void fib_update_nh_saddrs(struct net_device *dev);
227extern int fib_sync_up(struct net_device *dev); 231extern int fib_sync_up(struct net_device *dev);
228extern __be32 __fib_res_prefsrc(struct fib_result *res);
229extern void fib_select_multipath(const struct flowi *flp, struct fib_result *res); 232extern void fib_select_multipath(const struct flowi *flp, struct fib_result *res);
230 233
231/* Exported by fib_trie.c */ 234/* Exported by fib_trie.c */