diff options
-rw-r--r-- | include/net/route.h | 1 | ||||
-rw-r--r-- | net/ipv4/fib_frontend.c | 21 |
2 files changed, 20 insertions, 2 deletions
diff --git a/include/net/route.h b/include/net/route.h index 59b0b19205a2..76b08c1affc0 100644 --- a/include/net/route.h +++ b/include/net/route.h | |||
@@ -118,6 +118,7 @@ extern unsigned short ip_rt_frag_needed(struct iphdr *iph, unsigned short new_mt | |||
118 | extern void ip_rt_send_redirect(struct sk_buff *skb); | 118 | extern void ip_rt_send_redirect(struct sk_buff *skb); |
119 | 119 | ||
120 | extern unsigned inet_addr_type(__be32 addr); | 120 | extern unsigned inet_addr_type(__be32 addr); |
121 | extern unsigned inet_dev_addr_type(const struct net_device *dev, __be32 addr); | ||
121 | extern void ip_rt_multicast_event(struct in_device *); | 122 | extern void ip_rt_multicast_event(struct in_device *); |
122 | extern int ip_rt_ioctl(unsigned int cmd, void __user *arg); | 123 | extern int ip_rt_ioctl(unsigned int cmd, void __user *arg); |
123 | extern void ip_rt_get_source(u8 *src, struct rtable *rt); | 124 | extern void ip_rt_get_source(u8 *src, struct rtable *rt); |
diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c index e02aba5fa136..d90b42f3630c 100644 --- a/net/ipv4/fib_frontend.c +++ b/net/ipv4/fib_frontend.c | |||
@@ -155,7 +155,12 @@ out: | |||
155 | return dev; | 155 | return dev; |
156 | } | 156 | } |
157 | 157 | ||
158 | unsigned inet_addr_type(__be32 addr) | 158 | /* |
159 | * Find address type as if only "dev" was present in the system. If | ||
160 | * on_dev is NULL then all interfaces are taken into consideration. | ||
161 | */ | ||
162 | static inline unsigned __inet_dev_addr_type(const struct net_device *dev, | ||
163 | __be32 addr) | ||
159 | { | 164 | { |
160 | struct flowi fl = { .nl_u = { .ip4_u = { .daddr = addr } } }; | 165 | struct flowi fl = { .nl_u = { .ip4_u = { .daddr = addr } } }; |
161 | struct fib_result res; | 166 | struct fib_result res; |
@@ -175,13 +180,24 @@ unsigned inet_addr_type(__be32 addr) | |||
175 | if (local_table) { | 180 | if (local_table) { |
176 | ret = RTN_UNICAST; | 181 | ret = RTN_UNICAST; |
177 | if (!local_table->tb_lookup(local_table, &fl, &res)) { | 182 | if (!local_table->tb_lookup(local_table, &fl, &res)) { |
178 | ret = res.type; | 183 | if (!dev || dev == res.fi->fib_dev) |
184 | ret = res.type; | ||
179 | fib_res_put(&res); | 185 | fib_res_put(&res); |
180 | } | 186 | } |
181 | } | 187 | } |
182 | return ret; | 188 | return ret; |
183 | } | 189 | } |
184 | 190 | ||
191 | unsigned int inet_addr_type(__be32 addr) | ||
192 | { | ||
193 | return __inet_dev_addr_type(NULL, addr); | ||
194 | } | ||
195 | |||
196 | unsigned int inet_dev_addr_type(const struct net_device *dev, __be32 addr) | ||
197 | { | ||
198 | return __inet_dev_addr_type(dev, addr); | ||
199 | } | ||
200 | |||
185 | /* Given (packet source, input interface) and optional (dst, oif, tos): | 201 | /* Given (packet source, input interface) and optional (dst, oif, tos): |
186 | - (main) check, that source is valid i.e. not broadcast or our local | 202 | - (main) check, that source is valid i.e. not broadcast or our local |
187 | address. | 203 | address. |
@@ -940,4 +956,5 @@ void __init ip_fib_init(void) | |||
940 | } | 956 | } |
941 | 957 | ||
942 | EXPORT_SYMBOL(inet_addr_type); | 958 | EXPORT_SYMBOL(inet_addr_type); |
959 | EXPORT_SYMBOL(inet_dev_addr_type); | ||
943 | EXPORT_SYMBOL(ip_dev_find); | 960 | EXPORT_SYMBOL(ip_dev_find); |