summaryrefslogtreecommitdiffstats
path: root/net/ipv6/ila/ila_lwt.c
diff options
context:
space:
mode:
authorTom Herbert2017-11-06 00:58:23 +0100
committerDavid S. Miller2017-11-08 03:20:48 +0100
commit84287bb3285634b60c55c00a1d5ed843b44fde92 (patch)
tree2e212cdf5454318fd22e2d60e32b876cd5eab9f1 /net/ipv6/ila/ila_lwt.c
parentila: cleanup checksum diff (diff)
downloadkernel-qcow2-linux-84287bb3285634b60c55c00a1d5ed843b44fde92.tar.gz
kernel-qcow2-linux-84287bb3285634b60c55c00a1d5ed843b44fde92.tar.xz
kernel-qcow2-linux-84287bb3285634b60c55c00a1d5ed843b44fde92.zip
ila: add checksum neutral map auto
Add checksum neutral auto that performs checksum neutral mapping without using the C-bit. This is enabled by configuration of a mapping. The checksum neutral function has been split into ila_csum_do_neutral_fmt and ila_csum_do_neutral_nofmt. The former handles the C-bit and includes it in the adjustment value. The latter just sets the adjustment value on the locator diff only. Added configuration for checksum neutral map aut in ila_lwt and ila_xlat. Signed-off-by: Tom Herbert <tom@quantonium.net> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6/ila/ila_lwt.c')
-rw-r--r--net/ipv6/ila/ila_lwt.c29
1 files changed, 15 insertions, 14 deletions
diff --git a/net/ipv6/ila/ila_lwt.c b/net/ipv6/ila/ila_lwt.c
index 696281b4bca2..104af07d83a6 100644
--- a/net/ipv6/ila/ila_lwt.c
+++ b/net/ipv6/ila/ila_lwt.c
@@ -127,6 +127,7 @@ static int ila_build_state(struct nlattr *nla,
struct lwtunnel_state *newts;
const struct fib6_config *cfg6 = cfg;
struct ila_addr *iaddr;
+ u8 csum_mode = ILA_CSUM_NO_ACTION;
int ret;
if (family != AF_INET6)
@@ -139,15 +140,6 @@ static int ila_build_state(struct nlattr *nla,
return -EINVAL;
}
- iaddr = (struct ila_addr *)&cfg6->fc_dst;
-
- if (!ila_addr_is_ila(iaddr) || ila_csum_neutral_set(iaddr->ident)) {
- /* Don't allow translation for a non-ILA address or checksum
- * neutral flag to be set.
- */
- return -EINVAL;
- }
-
ret = nla_parse_nested(tb, ILA_ATTR_MAX, nla, ila_nl_policy, extack);
if (ret < 0)
return ret;
@@ -155,6 +147,19 @@ static int ila_build_state(struct nlattr *nla,
if (!tb[ILA_ATTR_LOCATOR])
return -EINVAL;
+ iaddr = (struct ila_addr *)&cfg6->fc_dst;
+
+ if (tb[ILA_ATTR_CSUM_MODE])
+ csum_mode = nla_get_u8(tb[ILA_ATTR_CSUM_MODE]);
+
+ if (csum_mode == ILA_CSUM_NEUTRAL_MAP &&
+ ila_csum_neutral_set(iaddr->ident)) {
+ /* Don't allow translation if checksum neutral bit is
+ * configured and it's set in the SIR address.
+ */
+ return -EINVAL;
+ }
+
newts = lwtunnel_state_alloc(sizeof(*ilwt));
if (!newts)
return -ENOMEM;
@@ -168,17 +173,13 @@ static int ila_build_state(struct nlattr *nla,
p = ila_params_lwtunnel(newts);
+ p->csum_mode = csum_mode;
p->locator.v64 = (__force __be64)nla_get_u64(tb[ILA_ATTR_LOCATOR]);
/* Precompute checksum difference for translation since we
* know both the old locator and the new one.
*/
p->locator_match = iaddr->loc;
- p->csum_diff = compute_csum_diff8(
- (__be32 *)&p->locator_match, (__be32 *)&p->locator);
-
- if (tb[ILA_ATTR_CSUM_MODE])
- p->csum_mode = nla_get_u8(tb[ILA_ATTR_CSUM_MODE]);
ila_init_saved_csum(p);