]> git.proxmox.com Git - mirror_ubuntu-kernels.git/blobdiff - include/net/flow.h
net: Put fl6_* macros to struct flowi6 and use them again.
[mirror_ubuntu-kernels.git] / include / net / flow.h
index fd0413873b8ed58e985c3377ba42657f5a15036c..172d76dd873132c8255e5f9821fdda90557279c2 100644 (file)
 #include <linux/in6.h>
 #include <asm/atomic.h>
 
-struct flowi {
-       int     oif;
-       int     iif;
-       __u32   mark;
-
-       union {
-               struct {
-                       __be32                  daddr;
-                       __be32                  saddr;
-                       __u8                    tos;
-                       __u8                    scope;
-               } ip4_u;
-               
-               struct {
-                       struct in6_addr         daddr;
-                       struct in6_addr         saddr;
-                       __be32                  flowlabel;
-               } ip6_u;
-
-               struct {
-                       __le16                  daddr;
-                       __le16                  saddr;
-                       __u8                    scope;
-               } dn_u;
-       } nl_u;
-#define fld_dst                nl_u.dn_u.daddr
-#define fld_src                nl_u.dn_u.saddr
-#define fld_scope      nl_u.dn_u.scope
-#define fl6_dst                nl_u.ip6_u.daddr
-#define fl6_src                nl_u.ip6_u.saddr
-#define fl6_flowlabel  nl_u.ip6_u.flowlabel
-#define fl4_dst                nl_u.ip4_u.daddr
-#define fl4_src                nl_u.ip4_u.saddr
-#define fl4_tos                nl_u.ip4_u.tos
-#define fl4_scope      nl_u.ip4_u.scope
-
-       __u8    proto;
-       __u8    flags;
+struct flowi_common {
+       int     flowic_oif;
+       int     flowic_iif;
+       __u32   flowic_mark;
+       __u8    flowic_tos;
+       __u8    flowic_scope;
+       __u8    flowic_proto;
+       __u8    flowic_flags;
 #define FLOWI_FLAG_ANYSRC              0x01
 #define FLOWI_FLAG_PRECOW_METRICS      0x02
 #define FLOWI_FLAG_CAN_SLEEP           0x04
+       __u32   flowic_secid;
+};
+
+union flowi_uli {
+       struct {
+               __be16  sport;
+               __be16  dport;
+       } ports;
+
+       struct {
+               __u8    type;
+               __u8    code;
+       } icmpt;
+
+       struct {
+               __le16  sport;
+               __le16  dport;
+       } dnports;
+
+       __be32          spi;
+       __be32          gre_key;
+
+       struct {
+               __u8    type;
+       } mht;
+};
+
+struct flowi4 {
+       struct flowi_common     __fl_common;
+#define flowi4_oif             __fl_common.flowic_oif
+#define flowi4_iif             __fl_common.flowic_iif
+#define flowi4_mark            __fl_common.flowic_mark
+#define flowi4_tos             __fl_common.flowic_tos
+#define flowi4_scope           __fl_common.flowic_scope
+#define flowi4_proto           __fl_common.flowic_proto
+#define flowi4_flags           __fl_common.flowic_flags
+#define flowi4_secid           __fl_common.flowic_secid
+       __be32                  daddr;
+       __be32                  saddr;
+       union flowi_uli         uli;
+#define fl4_sport              uli.ports.sport
+#define fl4_dport              uli.ports.dport
+#define fl4_icmp_type          uli.icmpt.type
+#define fl4_icmp_code          uli.icmpt.code
+#define fl4_ipsec_spi          uli.spi
+#define fl4_mh_type            uli.mht.type
+#define fl4_gre_key            uli.gre_key
+};
+
+struct flowi6 {
+       struct flowi_common     __fl_common;
+#define flowi6_oif             __fl_common.flowic_oif
+#define flowi6_iif             __fl_common.flowic_iif
+#define flowi6_mark            __fl_common.flowic_mark
+#define flowi6_tos             __fl_common.flowic_tos
+#define flowi6_scope           __fl_common.flowic_scope
+#define flowi6_proto           __fl_common.flowic_proto
+#define flowi6_flags           __fl_common.flowic_flags
+#define flowi6_secid           __fl_common.flowic_secid
+       struct in6_addr         daddr;
+       struct in6_addr         saddr;
+       __be32                  flowlabel;
+       union flowi_uli         uli;
+#define fl6_sport              uli.ports.sport
+#define fl6_dport              uli.ports.dport
+#define fl6_icmp_type          uli.icmpt.type
+#define fl6_icmp_code          uli.icmpt.code
+#define fl6_ipsec_spi          uli.spi
+#define fl6_mh_type            uli.mht.type
+#define fl6_gre_key            uli.gre_key
+};
+
+struct flowidn {
+       struct flowi_common     __fl_common;
+       __le16                  daddr;
+       __le16                  saddr;
+       union flowi_uli         uli;
+};
+
+struct flowi {
        union {
-               struct {
-                       __be16  sport;
-                       __be16  dport;
-               } ports;
-
-               struct {
-                       __u8    type;
-                       __u8    code;
-               } icmpt;
-
-               struct {
-                       __le16  sport;
-                       __le16  dport;
-               } dnports;
-
-               __be32          spi;
-               __be32          gre_key;
-
-               struct {
-                       __u8    type;
-               } mht;
-       } uli_u;
-#define fl_ip_sport    uli_u.ports.sport
-#define fl_ip_dport    uli_u.ports.dport
-#define fl_icmp_type   uli_u.icmpt.type
-#define fl_icmp_code   uli_u.icmpt.code
-#define fl_ipsec_spi   uli_u.spi
-#define fl_mh_type     uli_u.mht.type
-#define fl_gre_key     uli_u.gre_key
-       __u32           secid;  /* used by xfrm; see secid.txt */
+               struct flowi_common     __fl_common;
+               struct flowi4           ip4;
+               struct flowi6           ip6;
+               struct flowidn          dn;
+       } u;
+#define flowi_oif      u.__fl_common.flowic_oif
+#define flowi_iif      u.__fl_common.flowic_iif
+#define flowi_mark     u.__fl_common.flowic_mark
+#define flowi_tos      u.__fl_common.flowic_tos
+#define flowi_scope    u.__fl_common.flowic_scope
+#define flowi_proto    u.__fl_common.flowic_proto
+#define flowi_flags    u.__fl_common.flowic_flags
+#define flowi_secid    u.__fl_common.flowic_secid
+#define fld_scope      flowi_scope
+
+#define fld_dst                u.dn.daddr
+#define fld_src                u.dn.saddr
 } __attribute__((__aligned__(BITS_PER_LONG/8)));
 
+static inline struct flowi *flowi4_to_flowi(struct flowi4 *fl4)
+{
+       return container_of(fl4, struct flowi, u.ip4);
+}
+
+static inline struct flowi *flowi6_to_flowi(struct flowi6 *fl6)
+{
+       return container_of(fl6, struct flowi, u.ip6);
+}
+
+static inline struct flowi *flowidn_to_flowi(struct flowidn *fldn)
+{
+       return container_of(fldn, struct flowi, u.dn);
+}
+
 #define FLOW_DIR_IN    0
 #define FLOW_DIR_OUT   1
 #define FLOW_DIR_FWD   2
@@ -113,11 +165,4 @@ extern struct flow_cache_object *flow_cache_lookup(
 extern void flow_cache_flush(void);
 extern atomic_t flow_cache_genid;
 
-static inline int flow_cache_uli_match(const struct flowi *fl1,
-                                      const struct flowi *fl2)
-{
-       return (fl1->proto == fl2->proto &&
-               !memcmp(&fl1->uli_u, &fl2->uli_u, sizeof(fl1->uli_u)));
-}
-
 #endif