Introduce "features" for the kernel backends returning kernel capabilities
authorMartin Willi <martin@revosec.ch>
Thu, 21 Feb 2013 08:39:23 +0000 (09:39 +0100)
committerMartin Willi <martin@revosec.ch>
Fri, 1 Mar 2013 10:11:24 +0000 (11:11 +0100)
src/libhydra/kernel/kernel_interface.c
src/libhydra/kernel/kernel_interface.h
src/libhydra/kernel/kernel_ipsec.h
src/libhydra/kernel/kernel_net.h

index 8948e05..b82fd6d 100644 (file)
@@ -137,6 +137,22 @@ struct private_kernel_interface_t {
        bool ifaces_exclude;
 };
 
+METHOD(kernel_interface_t, get_features, kernel_feature_t,
+       private_kernel_interface_t *this)
+{
+       kernel_feature_t features = 0;
+
+       if (this->ipsec && this->ipsec->get_features)
+       {
+               features |= this->ipsec->get_features(this->ipsec);
+       }
+       if (this->net && this->net->get_features)
+       {
+               features |= this->net->get_features(this->net);
+       }
+       return features;
+}
+
 METHOD(kernel_interface_t, get_spi, status_t,
        private_kernel_interface_t *this, host_t *src, host_t *dst,
        u_int8_t protocol, u_int32_t reqid, u_int32_t *spi)
@@ -682,6 +698,7 @@ kernel_interface_t *kernel_interface_create()
 
        INIT(this,
                .public = {
+                       .get_features = _get_features,
                        .get_spi = _get_spi,
                        .get_cpi = _get_cpi,
                        .add_sa = _add_sa,
@@ -757,4 +774,3 @@ kernel_interface_t *kernel_interface_create()
 
        return &this->public;
 }
-
index 8d8ef2e..8d8d048 100644 (file)
@@ -47,6 +47,7 @@
 #define KERNEL_INTERFACE_H_
 
 typedef struct kernel_interface_t kernel_interface_t;
+typedef enum kernel_feature_t kernel_feature_t;
 
 #include <networking/host.h>
 #include <crypto/prf_plus.h>
@@ -56,6 +57,17 @@ typedef struct kernel_interface_t kernel_interface_t;
 #include <kernel/kernel_net.h>
 
 /**
+ * Bitfield of optional features a kernel backend supports.
+ *
+ * This feature-set is for both, kernel_ipsec_t and kernel_net_t. Each
+ * backend returns a subset of these features.
+ */
+enum kernel_feature_t {
+       /** IPsec can process ESPv3 (RFC 4303) TFC padded packets */
+       KERNEL_ESP_V3_TFC = (1<<0),
+};
+
+/**
  * Constructor function for ipsec kernel interface
  */
 typedef kernel_ipsec_t* (*kernel_ipsec_constructor_t)(void);
@@ -74,6 +86,13 @@ typedef kernel_net_t* (*kernel_net_constructor_t)(void);
 struct kernel_interface_t {
 
        /**
+        * Get the feature set supported by the net and ipsec kernel backends.
+        *
+        * @return                              ORed feature-set of backends
+        */
+       kernel_feature_t (*get_features)(kernel_interface_t *this);
+
+       /**
         * Get a SPI from the kernel.
         *
         * @param src           source address of SA
index 1da0805..c8afcaf 100644 (file)
@@ -30,6 +30,7 @@ typedef struct kernel_ipsec_t kernel_ipsec_t;
 #include <ipsec/ipsec_types.h>
 #include <selectors/traffic_selector.h>
 #include <plugins/plugin.h>
+#include <kernel/kernel_interface.h>
 
 /**
  * Interface to the ipsec subsystem of the kernel.
@@ -45,6 +46,13 @@ typedef struct kernel_ipsec_t kernel_ipsec_t;
 struct kernel_ipsec_t {
 
        /**
+        * Get the feature set supported by this kernel backend.
+        *
+        * @return                              ORed feature-set of backend
+        */
+       kernel_feature_t (*get_features)(kernel_ipsec_t *this);
+
+       /**
         * Get a SPI from the kernel.
         *
         * @param src           source address of SA
index 6a3b2ce..0d3417f 100644 (file)
@@ -28,6 +28,7 @@ typedef enum kernel_address_type_t kernel_address_type_t;
 #include <collections/enumerator.h>
 #include <networking/host.h>
 #include <plugins/plugin.h>
+#include <kernel/kernel_interface.h>
 
 /**
  * Type of addresses (e.g. when enumerating them)
@@ -56,6 +57,13 @@ enum kernel_address_type_t {
 struct kernel_net_t {
 
        /**
+        * Get the feature set supported by this kernel backend.
+        *
+        * @return                              ORed feature-set of backend
+        */
+       kernel_feature_t (*get_features)(kernel_net_t *this);
+
+       /**
         * Get our outgoing source address for a destination.
         *
         * Does a route lookup to get the source address used to reach dest.