l3mdev.c (9d066a252786e1a18484a6283f82614d42a9f4ac) | l3mdev.c (0d240e7811c4ec1965760ee4643b5bbc9cfacbb3) |
---|---|
1/* 2 * net/l3mdev/l3mdev.c - L3 master device implementation 3 * Copyright (c) 2015 Cumulus Networks 4 * Copyright (c) 2015 David Ahern <dsa@cumulusnetworks.com> 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; either version 2 of the License, or 9 * (at your option) any later version. 10 */ 11 12#include <linux/netdevice.h> | 1/* 2 * net/l3mdev/l3mdev.c - L3 master device implementation 3 * Copyright (c) 2015 Cumulus Networks 4 * Copyright (c) 2015 David Ahern <dsa@cumulusnetworks.com> 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; either version 2 of the License, or 9 * (at your option) any later version. 10 */ 11 12#include <linux/netdevice.h> |
13#include <net/fib_rules.h> |
|
13#include <net/l3mdev.h> 14 15/** 16 * l3mdev_master_ifindex - get index of L3 master device 17 * @dev: targeted interface 18 */ 19 20int l3mdev_master_ifindex_rcu(const struct net_device *dev) --- 81 unchanged lines hidden (view full) --- 102 * l3mdev_get_rt6_dst - IPv6 route lookup based on flow. Returns 103 * cached route for L3 master device if relevant 104 * to flow 105 * @net: network namespace for device index lookup 106 * @fl6: IPv6 flow struct for lookup 107 */ 108 109struct dst_entry *l3mdev_get_rt6_dst(struct net *net, | 14#include <net/l3mdev.h> 15 16/** 17 * l3mdev_master_ifindex - get index of L3 master device 18 * @dev: targeted interface 19 */ 20 21int l3mdev_master_ifindex_rcu(const struct net_device *dev) --- 81 unchanged lines hidden (view full) --- 103 * l3mdev_get_rt6_dst - IPv6 route lookup based on flow. Returns 104 * cached route for L3 master device if relevant 105 * to flow 106 * @net: network namespace for device index lookup 107 * @fl6: IPv6 flow struct for lookup 108 */ 109 110struct dst_entry *l3mdev_get_rt6_dst(struct net *net, |
110 const struct flowi6 *fl6) | 111 struct flowi6 *fl6) |
111{ 112 struct dst_entry *dst = NULL; 113 struct net_device *dev; 114 115 if (fl6->flowi6_oif) { 116 rcu_read_lock(); 117 118 dev = dev_get_by_index_rcu(net, fl6->flowi6_oif); --- 36 unchanged lines hidden (view full) --- 155 rc = dev->l3mdev_ops->l3mdev_get_saddr(dev, fl4); 156 157 rcu_read_unlock(); 158 } 159 160 return rc; 161} 162EXPORT_SYMBOL_GPL(l3mdev_get_saddr); | 112{ 113 struct dst_entry *dst = NULL; 114 struct net_device *dev; 115 116 if (fl6->flowi6_oif) { 117 rcu_read_lock(); 118 119 dev = dev_get_by_index_rcu(net, fl6->flowi6_oif); --- 36 unchanged lines hidden (view full) --- 156 rc = dev->l3mdev_ops->l3mdev_get_saddr(dev, fl4); 157 158 rcu_read_unlock(); 159 } 160 161 return rc; 162} 163EXPORT_SYMBOL_GPL(l3mdev_get_saddr); |
164 165int l3mdev_get_saddr6(struct net *net, const struct sock *sk, 166 struct flowi6 *fl6) 167{ 168 struct net_device *dev; 169 int rc = 0; 170 171 if (fl6->flowi6_oif) { 172 rcu_read_lock(); 173 174 dev = dev_get_by_index_rcu(net, fl6->flowi6_oif); 175 if (dev && netif_is_l3_slave(dev)) 176 dev = netdev_master_upper_dev_get_rcu(dev); 177 178 if (dev && netif_is_l3_master(dev) && 179 dev->l3mdev_ops->l3mdev_get_saddr6) 180 rc = dev->l3mdev_ops->l3mdev_get_saddr6(dev, sk, fl6); 181 182 rcu_read_unlock(); 183 } 184 185 return rc; 186} 187EXPORT_SYMBOL_GPL(l3mdev_get_saddr6); 188 189/** 190 * l3mdev_fib_rule_match - Determine if flowi references an 191 * L3 master device 192 * @net: network namespace for device index lookup 193 * @fl: flow struct 194 */ 195 196int l3mdev_fib_rule_match(struct net *net, struct flowi *fl, 197 struct fib_lookup_arg *arg) 198{ 199 struct net_device *dev; 200 int rc = 0; 201 202 rcu_read_lock(); 203 204 dev = dev_get_by_index_rcu(net, fl->flowi_oif); 205 if (dev && netif_is_l3_master(dev) && 206 dev->l3mdev_ops->l3mdev_fib_table) { 207 arg->table = dev->l3mdev_ops->l3mdev_fib_table(dev); 208 rc = 1; 209 goto out; 210 } 211 212 dev = dev_get_by_index_rcu(net, fl->flowi_iif); 213 if (dev && netif_is_l3_master(dev) && 214 dev->l3mdev_ops->l3mdev_fib_table) { 215 arg->table = dev->l3mdev_ops->l3mdev_fib_table(dev); 216 rc = 1; 217 goto out; 218 } 219 220out: 221 rcu_read_unlock(); 222 223 return rc; 224} |
|