ipv4: Use accessors for fib_info nexthop data
Use helpers to access fib_nh and fib_nhs fields of a fib_info. Drop the fib_dev macro which is an alias for the first nexthop. Replacements: fi->fib_dev --> fib_info_nh(fi, 0)->fib_nh_dev fi->fib_nh --> fib_info_nh(fi, 0) fi->fib_nh[i] --> fib_info_nh(fi, i) fi->fib_nhs --> fib_info_num_path(fi) where fib_info_nh(fi, i) returns fi->fib_nh[nhsel] and fib_info_num_path returns fi->fib_nhs. Move the existing fib_info_nhc to nexthop.h and define the new ones there. A later patch adds a check if a fib_info uses a nexthop object, and defining the helpers in nexthop.h avoid circular header dependencies. After this all remaining open coded references to fi->fib_nhs and fi->fib_nh are in: - fib_create_info and helpers used to lookup an existing fib_info entry, and - the netdev event functions fib_sync_down_dev and fib_sync_up. The latter two will not be reused for nexthops, and the fib_create_info will be updated to handle a nexthop in a fib_info. Signed-off-by: David Ahern <dsahern@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
7dd73168e2
commit
5481d73f81
@@ -22,6 +22,7 @@
|
||||
#include <net/neighbour.h>
|
||||
#include <net/switchdev.h>
|
||||
#include <net/ip_fib.h>
|
||||
#include <net/nexthop.h>
|
||||
#include <net/arp.h>
|
||||
|
||||
#include "rocker.h"
|
||||
@@ -2286,8 +2287,8 @@ static int ofdpa_port_fib_ipv4(struct ofdpa_port *ofdpa_port, __be32 dst,
|
||||
|
||||
/* XXX support ECMP */
|
||||
|
||||
nh = fi->fib_nh;
|
||||
nh_on_port = (fi->fib_dev == ofdpa_port->dev);
|
||||
nh = fib_info_nh(fi, 0);
|
||||
nh_on_port = (nh->fib_nh_dev == ofdpa_port->dev);
|
||||
has_gw = !!nh->fib_nh_gw4;
|
||||
|
||||
if (has_gw && nh_on_port) {
|
||||
@@ -2737,11 +2738,13 @@ static int ofdpa_fib4_add(struct rocker *rocker,
|
||||
{
|
||||
struct ofdpa *ofdpa = rocker->wpriv;
|
||||
struct ofdpa_port *ofdpa_port;
|
||||
struct fib_nh *nh;
|
||||
int err;
|
||||
|
||||
if (ofdpa->fib_aborted)
|
||||
return 0;
|
||||
ofdpa_port = ofdpa_port_dev_lower_find(fen_info->fi->fib_dev, rocker);
|
||||
nh = fib_info_nh(fen_info->fi, 0);
|
||||
ofdpa_port = ofdpa_port_dev_lower_find(nh->fib_nh_dev, rocker);
|
||||
if (!ofdpa_port)
|
||||
return 0;
|
||||
err = ofdpa_port_fib_ipv4(ofdpa_port, htonl(fen_info->dst),
|
||||
@@ -2749,7 +2752,7 @@ static int ofdpa_fib4_add(struct rocker *rocker,
|
||||
fen_info->tb_id, 0);
|
||||
if (err)
|
||||
return err;
|
||||
fen_info->fi->fib_nh->fib_nh_flags |= RTNH_F_OFFLOAD;
|
||||
nh->fib_nh_flags |= RTNH_F_OFFLOAD;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -2758,13 +2761,15 @@ static int ofdpa_fib4_del(struct rocker *rocker,
|
||||
{
|
||||
struct ofdpa *ofdpa = rocker->wpriv;
|
||||
struct ofdpa_port *ofdpa_port;
|
||||
struct fib_nh *nh;
|
||||
|
||||
if (ofdpa->fib_aborted)
|
||||
return 0;
|
||||
ofdpa_port = ofdpa_port_dev_lower_find(fen_info->fi->fib_dev, rocker);
|
||||
nh = fib_info_nh(fen_info->fi, 0);
|
||||
ofdpa_port = ofdpa_port_dev_lower_find(nh->fib_nh_dev, rocker);
|
||||
if (!ofdpa_port)
|
||||
return 0;
|
||||
fen_info->fi->fib_nh->fib_nh_flags &= ~RTNH_F_OFFLOAD;
|
||||
nh->fib_nh_flags &= ~RTNH_F_OFFLOAD;
|
||||
return ofdpa_port_fib_ipv4(ofdpa_port, htonl(fen_info->dst),
|
||||
fen_info->dst_len, fen_info->fi,
|
||||
fen_info->tb_id, OFDPA_OP_FLAG_REMOVE);
|
||||
@@ -2784,14 +2789,16 @@ static void ofdpa_fib4_abort(struct rocker *rocker)
|
||||
|
||||
spin_lock_irqsave(&ofdpa->flow_tbl_lock, flags);
|
||||
hash_for_each_safe(ofdpa->flow_tbl, bkt, tmp, flow_entry, entry) {
|
||||
struct fib_nh *nh;
|
||||
|
||||
if (flow_entry->key.tbl_id !=
|
||||
ROCKER_OF_DPA_TABLE_ID_UNICAST_ROUTING)
|
||||
continue;
|
||||
ofdpa_port = ofdpa_port_dev_lower_find(flow_entry->fi->fib_dev,
|
||||
rocker);
|
||||
nh = fib_info_nh(flow_entry->fi, 0);
|
||||
ofdpa_port = ofdpa_port_dev_lower_find(nh->fib_nh_dev, rocker);
|
||||
if (!ofdpa_port)
|
||||
continue;
|
||||
flow_entry->fi->fib_nh->fib_nh_flags &= ~RTNH_F_OFFLOAD;
|
||||
nh->fib_nh_flags &= ~RTNH_F_OFFLOAD;
|
||||
ofdpa_flow_tbl_del(ofdpa_port, OFDPA_OP_FLAG_REMOVE,
|
||||
flow_entry);
|
||||
}
|
||||
|
Reference in New Issue
Block a user