Revert "xfrm: state and policy should fail if XFRMA_IF_ID 0"
[platform/kernel/linux-rpi.git] / net / xfrm / xfrm_user.c
index 1157431..e13198f 100644 (file)
@@ -282,6 +282,10 @@ static int verify_newsa_info(struct xfrm_usersa_info *p,
 
        err = 0;
 
+       if (attrs[XFRMA_MTIMER_THRESH])
+               if (!attrs[XFRMA_ENCAP])
+                       err = -EINVAL;
+
 out:
        return err;
 }
@@ -521,6 +525,7 @@ static void xfrm_update_ae_params(struct xfrm_state *x, struct nlattr **attrs,
        struct nlattr *lt = attrs[XFRMA_LTIME_VAL];
        struct nlattr *et = attrs[XFRMA_ETIMER_THRESH];
        struct nlattr *rt = attrs[XFRMA_REPLAY_THRESH];
+       struct nlattr *mt = attrs[XFRMA_MTIMER_THRESH];
 
        if (re) {
                struct xfrm_replay_state_esn *replay_esn;
@@ -552,6 +557,9 @@ static void xfrm_update_ae_params(struct xfrm_state *x, struct nlattr **attrs,
 
        if (rt)
                x->replay_maxdiff = nla_get_u32(rt);
+
+       if (mt)
+               x->mapping_maxage = nla_get_u32(mt);
 }
 
 static void xfrm_smark_init(struct nlattr **attrs, struct xfrm_mark *m)
@@ -1024,8 +1032,13 @@ static int copy_to_user_state_extra(struct xfrm_state *x,
                if (ret)
                        goto out;
        }
-       if (x->security)
+       if (x->security) {
                ret = copy_sec_ctx(x->security, skb);
+               if (ret)
+                       goto out;
+       }
+       if (x->mapping_maxage)
+               ret = nla_put_u32(skb, XFRMA_MTIMER_THRESH, x->mapping_maxage);
 out:
        return ret;
 }
@@ -3069,6 +3082,9 @@ static inline unsigned int xfrm_sa_len(struct xfrm_state *x)
        /* Must count x->lastused as it may become non-zero behind our back. */
        l += nla_total_size_64bit(sizeof(u64));
 
+       if (x->mapping_maxage)
+               l += nla_total_size(sizeof(x->mapping_maxage));
+
        return l;
 }