aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv6/route.c
diff options
context:
space:
mode:
authorMaciej Żenczykowski <maze@google.com>2010-09-26 20:07:02 -0400
committerDavid S. Miller <davem@davemloft.net>2010-09-29 02:38:15 -0400
commitab79ad14a2d51e95f0ac3cef7cd116a57089ba82 (patch)
treebfe0887548935354c671103e9718965e208db652 /net/ipv6/route.c
parent4465b469008bc03b98a1b8df4e9ae501b6c69d4b (diff)
ipv6: Implement Any-IP support for IPv6.
AnyIP is the capability to receive packets and establish incoming connections on IPs we have not explicitly configured on the machine. An example use case is to configure a machine to accept all incoming traffic on eth0, and leave the policy of whether traffic for a given IP should be delivered to the machine up to the load balancer. Can be setup as follows: ip -6 rule from all iif eth0 lookup 200 ip -6 route add local default dev lo table 200 (in this case for all IPv6 addresses) Signed-off-by: Maciej Żenczykowski <maze@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6/route.c')
-rw-r--r--net/ipv6/route.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/net/ipv6/route.c b/net/ipv6/route.c
index 25b0beda4331..25476e7e708b 100644
--- a/net/ipv6/route.c
+++ b/net/ipv6/route.c
@@ -1169,6 +1169,8 @@ int ip6_route_add(struct fib6_config *cfg)
1169 1169
1170 if (addr_type & IPV6_ADDR_MULTICAST) 1170 if (addr_type & IPV6_ADDR_MULTICAST)
1171 rt->dst.input = ip6_mc_input; 1171 rt->dst.input = ip6_mc_input;
1172 else if (cfg->fc_flags & RTF_LOCAL)
1173 rt->dst.input = ip6_input;
1172 else 1174 else
1173 rt->dst.input = ip6_forward; 1175 rt->dst.input = ip6_forward;
1174 1176
@@ -1190,7 +1192,8 @@ int ip6_route_add(struct fib6_config *cfg)
1190 they would result in kernel looping; promote them to reject routes 1192 they would result in kernel looping; promote them to reject routes
1191 */ 1193 */
1192 if ((cfg->fc_flags & RTF_REJECT) || 1194 if ((cfg->fc_flags & RTF_REJECT) ||
1193 (dev && (dev->flags&IFF_LOOPBACK) && !(addr_type&IPV6_ADDR_LOOPBACK))) { 1195 (dev && (dev->flags&IFF_LOOPBACK) && !(addr_type&IPV6_ADDR_LOOPBACK)
1196 && !(cfg->fc_flags&RTF_LOCAL))) {
1194 /* hold loopback dev/idev if we haven't done so. */ 1197 /* hold loopback dev/idev if we haven't done so. */
1195 if (dev != net->loopback_dev) { 1198 if (dev != net->loopback_dev) {
1196 if (dev) { 1199 if (dev) {
@@ -2082,6 +2085,9 @@ static int rtm_to_fib6_config(struct sk_buff *skb, struct nlmsghdr *nlh,
2082 if (rtm->rtm_type == RTN_UNREACHABLE) 2085 if (rtm->rtm_type == RTN_UNREACHABLE)
2083 cfg->fc_flags |= RTF_REJECT; 2086 cfg->fc_flags |= RTF_REJECT;
2084 2087
2088 if (rtm->rtm_type == RTN_LOCAL)
2089 cfg->fc_flags |= RTF_LOCAL;
2090
2085 cfg->fc_nlinfo.pid = NETLINK_CB(skb).pid; 2091 cfg->fc_nlinfo.pid = NETLINK_CB(skb).pid;
2086 cfg->fc_nlinfo.nlh = nlh; 2092 cfg->fc_nlinfo.nlh = nlh;
2087 cfg->fc_nlinfo.nl_net = sock_net(skb->sk); 2093 cfg->fc_nlinfo.nl_net = sock_net(skb->sk);
@@ -2202,6 +2208,8 @@ static int rt6_fill_node(struct net *net,
2202 NLA_PUT_U32(skb, RTA_TABLE, table); 2208 NLA_PUT_U32(skb, RTA_TABLE, table);
2203 if (rt->rt6i_flags&RTF_REJECT) 2209 if (rt->rt6i_flags&RTF_REJECT)
2204 rtm->rtm_type = RTN_UNREACHABLE; 2210 rtm->rtm_type = RTN_UNREACHABLE;
2211 else if (rt->rt6i_flags&RTF_LOCAL)
2212 rtm->rtm_type = RTN_LOCAL;
2205 else if (rt->rt6i_dev && (rt->rt6i_dev->flags&IFF_LOOPBACK)) 2213 else if (rt->rt6i_dev && (rt->rt6i_dev->flags&IFF_LOOPBACK))
2206 rtm->rtm_type = RTN_LOCAL; 2214 rtm->rtm_type = RTN_LOCAL;
2207 else 2215 else