VServer 1.9.2 (patch-2.6.8.1-vs1.9.2.diff)
[linux-2.6.git] / net / xfrm / xfrm_user.c
index 15bf2fd..eccc023 100644 (file)
@@ -78,6 +78,15 @@ static int verify_encap_tmpl(struct rtattr **xfrma)
        if ((rt->rta_len - sizeof(*rt)) < sizeof(*encap))
                return -EINVAL;
 
+       encap = RTA_DATA(rt);
+       switch (encap->encap_type) {
+       case UDP_ENCAP_ESPINUDP:
+       case UDP_ENCAP_ESPINUDP_NON_IKE:
+               break;
+       default:
+               return -ENOPROTOOPT;
+       }
+
        return 0;
 }
 
@@ -258,6 +267,8 @@ static int xfrm_add_sa(struct sk_buff *skb, struct nlmsghdr *nlh, void **xfrma)
        if (err)
                return err;
 
+       xfrm_probe_algs();
+
        x = xfrm_state_construct(p, (struct rtattr **) xfrma, &err);
        if (!x)
                return err;
@@ -805,6 +816,20 @@ static int xfrm_get_policy(struct sk_buff *skb, struct nlmsghdr *nlh, void **xfr
        return err;
 }
 
+static int xfrm_flush_sa(struct sk_buff *skb, struct nlmsghdr *nlh, void **xfrma)
+{
+       struct xfrm_usersa_flush *p = NLMSG_DATA(nlh);
+
+       xfrm_state_flush(p->proto);
+       return 0;
+}
+
+static int xfrm_flush_policy(struct sk_buff *skb, struct nlmsghdr *nlh, void **xfrma)
+{
+       xfrm_policy_flush();
+       return 0;
+}
+
 static const int xfrm_msg_min[(XFRM_MSG_MAX + 1 - XFRM_MSG_BASE)] = {
        NLMSG_LENGTH(sizeof(struct xfrm_usersa_info)),  /* NEW SA */
        NLMSG_LENGTH(sizeof(struct xfrm_usersa_id)),    /* DEL SA */
@@ -817,6 +842,9 @@ static const int xfrm_msg_min[(XFRM_MSG_MAX + 1 - XFRM_MSG_BASE)] = {
        NLMSG_LENGTH(sizeof(struct xfrm_user_expire)),  /* EXPIRE */
        NLMSG_LENGTH(sizeof(struct xfrm_userpolicy_info)),/* UPD POLICY */
        NLMSG_LENGTH(sizeof(struct xfrm_usersa_info)),  /* UPD SA */
+       NLMSG_LENGTH(sizeof(struct xfrm_user_polexpire)), /* POLEXPIRE */
+       NLMSG_LENGTH(sizeof(struct xfrm_usersa_flush)), /* FLUSH SA */
+       NLMSG_LENGTH(0),                                /* FLUSH POLICY */
 };
 
 static struct xfrm_link {
@@ -840,6 +868,9 @@ static struct xfrm_link {
        {},
        {       .doit   =       xfrm_add_policy         },
        {       .doit   =       xfrm_add_sa,            },
+       {},
+       {       .doit   =       xfrm_flush_sa           },
+       {       .doit   =       xfrm_flush_policy       },
 };
 
 static int xfrm_done(struct netlink_callback *cb)