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>
This commit is contained in:
parent
4465b46900
commit
ab79ad14a2
1 changed files with 9 additions and 1 deletions
|
@ -1169,6 +1169,8 @@ int ip6_route_add(struct fib6_config *cfg)
|
|||
|
||||
if (addr_type & IPV6_ADDR_MULTICAST)
|
||||
rt->dst.input = ip6_mc_input;
|
||||
else if (cfg->fc_flags & RTF_LOCAL)
|
||||
rt->dst.input = ip6_input;
|
||||
else
|
||||
rt->dst.input = ip6_forward;
|
||||
|
||||
|
@ -1190,7 +1192,8 @@ int ip6_route_add(struct fib6_config *cfg)
|
|||
they would result in kernel looping; promote them to reject routes
|
||||
*/
|
||||
if ((cfg->fc_flags & RTF_REJECT) ||
|
||||
(dev && (dev->flags&IFF_LOOPBACK) && !(addr_type&IPV6_ADDR_LOOPBACK))) {
|
||||
(dev && (dev->flags&IFF_LOOPBACK) && !(addr_type&IPV6_ADDR_LOOPBACK)
|
||||
&& !(cfg->fc_flags&RTF_LOCAL))) {
|
||||
/* hold loopback dev/idev if we haven't done so. */
|
||||
if (dev != net->loopback_dev) {
|
||||
if (dev) {
|
||||
|
@ -2082,6 +2085,9 @@ static int rtm_to_fib6_config(struct sk_buff *skb, struct nlmsghdr *nlh,
|
|||
if (rtm->rtm_type == RTN_UNREACHABLE)
|
||||
cfg->fc_flags |= RTF_REJECT;
|
||||
|
||||
if (rtm->rtm_type == RTN_LOCAL)
|
||||
cfg->fc_flags |= RTF_LOCAL;
|
||||
|
||||
cfg->fc_nlinfo.pid = NETLINK_CB(skb).pid;
|
||||
cfg->fc_nlinfo.nlh = nlh;
|
||||
cfg->fc_nlinfo.nl_net = sock_net(skb->sk);
|
||||
|
@ -2202,6 +2208,8 @@ static int rt6_fill_node(struct net *net,
|
|||
NLA_PUT_U32(skb, RTA_TABLE, table);
|
||||
if (rt->rt6i_flags&RTF_REJECT)
|
||||
rtm->rtm_type = RTN_UNREACHABLE;
|
||||
else if (rt->rt6i_flags&RTF_LOCAL)
|
||||
rtm->rtm_type = RTN_LOCAL;
|
||||
else if (rt->rt6i_dev && (rt->rt6i_dev->flags&IFF_LOOPBACK))
|
||||
rtm->rtm_type = RTN_LOCAL;
|
||||
else
|
||||
|
|
Loading…
Reference in a new issue