xfrm: introduce basic mark infrastructure
authorJamal Hadi Salim <hadi@cyberus.ca>
Mon, 22 Feb 2010 11:32:54 +0000 (11:32 +0000)
committerDavid S. Miller <davem@davemloft.net>
Tue, 23 Feb 2010 00:19:45 +0000 (16:19 -0800)
Add basic structuring and accessors for xfrm mark

Signed-off-by: Jamal Hadi Salim <hadi@cyberus.ca>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/xfrm.h
include/net/xfrm.h

index 29e04beb1fc90ab233709232d02892b62c19a7d8..b971e3848493dbe10aadc1db42349e2efdb790f2 100644 (file)
@@ -267,8 +267,8 @@ enum xfrm_attr_type_t {
        XFRMA_ALG_COMP,         /* struct xfrm_algo */
        XFRMA_ENCAP,            /* struct xfrm_algo + struct xfrm_encap_tmpl */
        XFRMA_TMPL,             /* 1 or more struct xfrm_user_tmpl */
-       XFRMA_SA,
-       XFRMA_POLICY,
+       XFRMA_SA,               /* struct xfrm_usersa_info  */
+       XFRMA_POLICY,           /*struct xfrm_userpolicy_info */
        XFRMA_SEC_CTX,          /* struct xfrm_sec_ctx */
        XFRMA_LTIME_VAL,
        XFRMA_REPLAY_VAL,
@@ -276,17 +276,23 @@ enum xfrm_attr_type_t {
        XFRMA_ETIMER_THRESH,
        XFRMA_SRCADDR,          /* xfrm_address_t */
        XFRMA_COADDR,           /* xfrm_address_t */
-       XFRMA_LASTUSED,
+       XFRMA_LASTUSED,         /* unsigned long  */
        XFRMA_POLICY_TYPE,      /* struct xfrm_userpolicy_type */
        XFRMA_MIGRATE,
        XFRMA_ALG_AEAD,         /* struct xfrm_algo_aead */
        XFRMA_KMADDRESS,        /* struct xfrm_user_kmaddress */
        XFRMA_ALG_AUTH_TRUNC,   /* struct xfrm_algo_auth */
+       XFRMA_MARK,             /* struct xfrm_mark */
        __XFRMA_MAX
 
 #define XFRMA_MAX (__XFRMA_MAX - 1)
 };
 
+struct xfrm_mark {
+       __u32           v; /* value */
+       __u32           m; /* mask */
+};
+
 enum xfrm_sadattr_type_t {
        XFRMA_SAD_UNSPEC,
        XFRMA_SAD_CNT,
index 0beb413c01c4aa8fb4221a719ee480170a01ab9c..39f151c7f251959a9a06cfc539546a4870d5f312 100644 (file)
@@ -140,6 +140,7 @@ struct xfrm_state {
 
        struct xfrm_id          id;
        struct xfrm_selector    sel;
+       struct xfrm_mark        mark;
 
        u32                     genid;
 
@@ -481,6 +482,7 @@ struct xfrm_policy {
 
        u32                     priority;
        u32                     index;
+       struct xfrm_mark        mark;
        struct xfrm_selector    selector;
        struct xfrm_lifetime_cfg lft;
        struct xfrm_lifetime_cur curlft;
@@ -1570,4 +1572,24 @@ static inline struct xfrm_state *xfrm_input_state(struct sk_buff *skb)
 }
 #endif
 
+static inline int xfrm_mark_get(struct nlattr **attrs, struct xfrm_mark *m)
+{
+       if (attrs[XFRMA_MARK])
+               memcpy(m, nla_data(attrs[XFRMA_MARK]), sizeof(m));
+       else
+               m->v = m->m = 0;
+
+       return m->v & m->m;
+}
+
+static inline int xfrm_mark_put(struct sk_buff *skb, struct xfrm_mark *m)
+{
+       if (m->m | m->v)
+               NLA_PUT(skb, XFRMA_MARK, sizeof(struct xfrm_mark), m);
+       return 0;
+
+nla_put_failure:
+       return -1;
+}
+
 #endif /* _NET_XFRM_H */