flow: Extend flow informations with xfrm interface id.
authorSteffen Klassert <steffen.klassert@secunet.com>
Tue, 12 Jun 2018 12:06:57 +0000 (14:06 +0200)
committerSteffen Klassert <steffen.klassert@secunet.com>
Sat, 23 Jun 2018 14:07:05 +0000 (16:07 +0200)
Add a new flowi_xfrm structure with informations needed to do
a xfrm lookup. At the moment it keeps the informations about
the new xfrm interface id needed to lookup xfrm interfaces
that are introduced with a followup patch. We need this new
lookup key as other possible keys, like the ifindex is
already part of the xfrm selector and used as a key to
enforce the output device after the transformation in the
policy/state lookup.

Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
Acked-by: Shannon Nelson <shannon.nelson@oracle.com>
Acked-by: Benedict Wong <benedictwong@google.com>
Tested-by: Benedict Wong <benedictwong@google.com>
Tested-by: Antony Antony <antony@phenome.org>
Reviewed-by: Eyal Birger <eyal.birger@gmail.com>
include/net/flow.h

index 8ce21793094e32248ac2656ad5c7a9d986b35970..187c9bef672fd31d96aa096d5ab97d316b90c96b 100644 (file)
@@ -26,6 +26,10 @@ struct flowi_tunnel {
        __be64                  tun_id;
 };
 
+struct flowi_xfrm {
+       __u32                   if_id;
+};
+
 struct flowi_common {
        int     flowic_oif;
        int     flowic_iif;
@@ -39,6 +43,7 @@ struct flowi_common {
 #define FLOWI_FLAG_SKIP_NH_OIF         0x04
        __u32   flowic_secid;
        struct flowi_tunnel flowic_tun_key;
+       struct flowi_xfrm xfrm;
        kuid_t  flowic_uid;
 };
 
@@ -78,6 +83,7 @@ struct flowi4 {
 #define flowi4_secid           __fl_common.flowic_secid
 #define flowi4_tun_key         __fl_common.flowic_tun_key
 #define flowi4_uid             __fl_common.flowic_uid
+#define flowi4_xfrm            __fl_common.xfrm
 
        /* (saddr,daddr) must be grouped, same order as in IP header */
        __be32                  saddr;
@@ -109,6 +115,7 @@ static inline void flowi4_init_output(struct flowi4 *fl4, int oif,
        fl4->flowi4_flags = flags;
        fl4->flowi4_secid = 0;
        fl4->flowi4_tun_key.tun_id = 0;
+       fl4->flowi4_xfrm.if_id = 0;
        fl4->flowi4_uid = uid;
        fl4->daddr = daddr;
        fl4->saddr = saddr;
@@ -138,6 +145,7 @@ struct flowi6 {
 #define flowi6_secid           __fl_common.flowic_secid
 #define flowi6_tun_key         __fl_common.flowic_tun_key
 #define flowi6_uid             __fl_common.flowic_uid
+#define flowi6_xfrm            __fl_common.xfrm
        struct in6_addr         daddr;
        struct in6_addr         saddr;
        /* Note: flowi6_tos is encoded in flowlabel, too. */
@@ -185,6 +193,7 @@ struct flowi {
 #define flowi_secid    u.__fl_common.flowic_secid
 #define flowi_tun_key  u.__fl_common.flowic_tun_key
 #define flowi_uid      u.__fl_common.flowic_uid
+#define flowi_xfrm     u.__fl_common.xfrm
 } __attribute__((__aligned__(BITS_PER_LONG/8)));
 
 static inline struct flowi *flowi4_to_flowi(struct flowi4 *fl4)