net: Abstract away all dst_entry metrics accesses.
Use helper functions to hide all direct accesses, especially writes, to dst_entry metrics values. This will allow us to: 1) More easily change how the metrics are stored. 2) Implement COW for metrics. In particular this will help us put metrics into the inetpeer cache if that is what we end up doing. We can make the _metrics member a pointer instead of an array, initially have it point at the read-only metrics in the FIB, and then on the first set grab an inetpeer entry and point the _metrics member there. Signed-off-by: David S. Miller <davem@davemloft.net> Acked-by: Eric Dumazet <eric.dumazet@gmail.com>
This commit is contained in:
@@ -1433,7 +1433,7 @@ static struct dst_entry *xfrm_bundle_create(struct xfrm_policy *policy,
|
||||
}
|
||||
|
||||
xdst->route = dst;
|
||||
memcpy(&dst1->metrics, &dst->metrics, sizeof(dst->metrics));
|
||||
dst_copy_metrics(dst1, dst);
|
||||
|
||||
if (xfrm[i]->props.mode != XFRM_MODE_TRANSPORT) {
|
||||
family = xfrm[i]->props.family;
|
||||
@@ -2271,7 +2271,7 @@ static void xfrm_init_pmtu(struct dst_entry *dst)
|
||||
if (pmtu > route_mtu_cached)
|
||||
pmtu = route_mtu_cached;
|
||||
|
||||
dst->metrics[RTAX_MTU-1] = pmtu;
|
||||
dst_metric_set(dst, RTAX_MTU, pmtu);
|
||||
} while ((dst = dst->next));
|
||||
}
|
||||
|
||||
@@ -2349,7 +2349,7 @@ static int xfrm_bundle_ok(struct xfrm_policy *pol, struct xfrm_dst *first,
|
||||
mtu = xfrm_state_mtu(dst->xfrm, mtu);
|
||||
if (mtu > last->route_mtu_cached)
|
||||
mtu = last->route_mtu_cached;
|
||||
dst->metrics[RTAX_MTU-1] = mtu;
|
||||
dst_metric_set(dst, RTAX_MTU, mtu);
|
||||
|
||||
if (last == first)
|
||||
break;
|
||||
|
Reference in New Issue
Block a user