]> git.ipfire.org Git - people/ms/strongswan.git/commitdiff
Merge branch 'opaque-ports'
authorMartin Willi <martin@revosec.ch>
Fri, 1 Mar 2013 10:27:12 +0000 (11:27 +0100)
committerMartin Willi <martin@revosec.ch>
Fri, 1 Mar 2013 10:27:12 +0000 (11:27 +0100)
Adds a %opaque port option and support for port ranges in left/rightprotoport.
Currently not supported by any of our kernel backends.

1  2 
man/ipsec.conf.5.in
src/conftest/config.c
src/libcharon/plugins/load_tester/load_tester_config.c
src/libcharon/plugins/medcli/medcli_config.c
src/libcharon/plugins/stroke/stroke_config.c
src/libcharon/plugins/uci/uci_config.c
src/libhydra/plugins/kernel_netlink/kernel_netlink_ipsec.c
src/starter/confread.h
src/starter/starterstroke.c
src/stroke/stroke_msg.h

diff --combined man/ipsec.conf.5.in
index c623186d91f1aa9c3b9ed899ba04fae088d708f3,0447838bdeedb082882881bec3d6902c6f88ed74..3c0071694e623d2b901493e18e018b670921ebab
@@@ -452,11 -452,6 +452,11 @@@ suites, the strict fla
  exclamation mark) can be used, e.g:
  .BR aes256-sha512-modp4096!
  .TP
 +.BR ikedscp " = " 000000 " | <DSCP field>"
 +Differentiated Services Field Codepoint to set on outgoing IKE packets sent
 +from this connection. The value is a six digit binary encoded string defining
 +the Codepoint to set, as defined in RFC 2474.
 +.TP
  .BR ikelifetime " = " 3h " | <time>"
  how long the keying channel of a connection (ISAKMP or IKE SA)
  should last before being renegotiated. Also see EXPIRY/REKEY below.
@@@ -742,6 -737,14 +742,14 @@@ can be used to the same effect, e.g
  .B leftprotoport=udp/%any
  or
  .BR leftprotoport=%any/53 .
+ The port value can alternatively take the value
+ .B %opaque
+ for RFC 4301 OPAQUE selectors, or a numerical range in the form
+ .BR 1024-65535 .
+ None of the kernel backends currently supports opaque or port ranges and uses
+ .B %any
+ for policy installation instead.
  .TP
  .BR leftrsasigkey " = <raw rsa public key> | <path to public key>"
  the left participant's public key for RSA signature authentication, in RFC 2537
diff --combined src/conftest/config.c
index 10b773de2c227acd7cac4fd0dcd6d5a60284691d,5c078d21a179c81e8165f7889c966796f4add79a..7f05e9c72b1f5c2e8c9e5a9218cb827ba847f208
@@@ -107,7 -107,7 +107,7 @@@ static ike_cfg_t *load_ike_config(priva
                settings->get_int(settings, "configs.%s.lport", 500, config),
                settings->get_str(settings, "configs.%s.rhost", "%any", config), FALSE,
                settings->get_int(settings, "configs.%s.rport", 500, config),
 -              FRAGMENTATION_NO);
 +              FRAGMENTATION_NO, 0);
        token = settings->get_str(settings, "configs.%s.proposal", NULL, config);
        if (token)
        {
@@@ -188,7 -188,7 +188,7 @@@ static child_cfg_t *load_child_config(p
                enumerator = enumerator_create_token(token, ",", " ");
                while (enumerator->enumerate(enumerator, &token))
                {
-                       ts = traffic_selector_create_from_cidr(token, 0, 0);
+                       ts = traffic_selector_create_from_cidr(token, 0, 0, 65535);
                        if (ts)
                        {
                                child_cfg->add_traffic_selector(child_cfg, TRUE, ts);
                enumerator = enumerator_create_token(token, ",", " ");
                while (enumerator->enumerate(enumerator, &token))
                {
-                       ts = traffic_selector_create_from_cidr(token, 0, 0);
+                       ts = traffic_selector_create_from_cidr(token, 0, 0, 65535);
                        if (ts)
                        {
                                child_cfg->add_traffic_selector(child_cfg, FALSE, ts);
index 18794657959ac7ef4a2b886e416a765c22095fbb,1033eb5173d3023b9dfcbb0f3f4e6b319b2e3067..52afe1b0a11ac99b27e38479e24523aa801f28a7
@@@ -369,7 -369,7 +369,7 @@@ static void add_ts(char *string, child_
  
        if (string)
        {
-               ts = traffic_selector_create_from_cidr(string, 0, 0);
+               ts = traffic_selector_create_from_cidr(string, 0, 0, 65535);
                if (!ts)
                {
                        DBG1(DBG_CFG, "parsing TS string '%s' failed", string);
@@@ -491,7 -491,7 +491,7 @@@ static peer_cfg_t* generate_config(priv
                ike_cfg = ike_cfg_create(this->version, TRUE, FALSE,
                                                                 local, FALSE, this->port + num - 1,
                                                                 remote, FALSE, IKEV2_NATT_PORT,
 -                                                               FRAGMENTATION_NO);
 +                                                               FRAGMENTATION_NO, 0);
        }
        else
        {
                                                                 local, FALSE,
                                                                 charon->socket->get_port(charon->socket, FALSE),
                                                                 remote, FALSE, IKEV2_UDP_PORT,
 -                                                               FRAGMENTATION_NO);
 +                                                               FRAGMENTATION_NO, 0);
        }
        ike_cfg->add_proposal(ike_cfg, this->proposal->clone(this->proposal));
        peer_cfg = peer_cfg_create("load-test", ike_cfg,
index d3bd29a1bdb80397d1830c7b20d7c35ce22dbf60,73e128abeb0fbf78462d2582b4d956c21cbe09d9..2bff703077b46d30c54d4018ced909bb40254243
@@@ -63,7 -63,7 +63,7 @@@ static traffic_selector_t *ts_from_stri
        {
                traffic_selector_t *ts;
  
-               ts = traffic_selector_create_from_cidr(str, 0, 0);
+               ts = traffic_selector_create_from_cidr(str, 0, 0, 65535);
                if (ts)
                {
                        return ts;
@@@ -105,7 -105,7 +105,7 @@@ METHOD(backend_t, get_peer_cfg_by_name
        ike_cfg = ike_cfg_create(IKEV2, FALSE, FALSE,
                                                         "0.0.0.0", FALSE,
                                                         charon->socket->get_port(charon->socket, FALSE),
 -                                                       address, FALSE, IKEV2_UDP_PORT, FRAGMENTATION_NO);
 +                                                       address, FALSE, IKEV2_UDP_PORT, FRAGMENTATION_NO, 0);
        ike_cfg->add_proposal(ike_cfg, proposal_create_default(PROTO_IKE));
        med_cfg = peer_cfg_create(
                "mediation", ike_cfg,
@@@ -381,7 -381,7 +381,7 @@@ medcli_config_t *medcli_config_create(d
                                                          "0.0.0.0", FALSE,
                                                          charon->socket->get_port(charon->socket, FALSE),
                                                          "0.0.0.0", FALSE, IKEV2_UDP_PORT,
 -                                                        FRAGMENTATION_NO),
 +                                                        FRAGMENTATION_NO, 0),
        );
        this->ike->add_proposal(this->ike, proposal_create_default(PROTO_IKE));
  
index 7bca94d432f30eab487a6e791c73086716fe1551,ed10bdb9fe8a74effc013c3e9cd6d9522755ae01..deff25878a32cb381edadb657d890628860f9863
@@@ -234,8 -234,7 +234,8 @@@ static ike_cfg_t *build_ike_cfg(private
                                                         msg->add_conn.other.address,
                                                         msg->add_conn.other.allow_any,
                                                         msg->add_conn.other.ikeport,
 -                                                       msg->add_conn.fragmentation);
 +                                                       msg->add_conn.fragmentation,
 +                                                       msg->add_conn.ikedscp);
        add_proposals(this, msg->add_conn.algorithms.ike, ike_cfg, NULL);
        return ike_cfg;
  }
@@@ -878,7 -877,7 +878,7 @@@ static void add_ts(private_stroke_confi
        if (end->tohost)
        {
                ts = traffic_selector_create_dynamic(end->protocol,
-                                       end->port ? end->port : 0, end->port ? end->port : 65535);
+                                                                                        end->from_port, end->to_port);
                child_cfg->add_traffic_selector(child_cfg, local, ts);
        }
        else
                        if (net)
                        {
                                ts = traffic_selector_create_from_subnet(net, 0, end->protocol,
-                                                                                                                end->port);
+                                                                                               end->from_port, end->to_port);
                                child_cfg->add_traffic_selector(child_cfg, local, ts);
                        }
                }
                        enumerator = enumerator_create_token(end->subnets, ",", " ");
                        while (enumerator->enumerate(enumerator, &subnet))
                        {
-                               ts = traffic_selector_create_from_cidr(subnet,
-                                                                                                       end->protocol, end->port);
+                               ts = traffic_selector_create_from_cidr(subnet, end->protocol,
+                                                                                               end->from_port, end->to_port);
                                if (ts)
                                {
                                        child_cfg->add_traffic_selector(child_cfg, local, ts);
index 4d317b6cc33e9af26d66265b22e4c9796456ee4d,b7df65d1c8dc26bffbdc68a2a63b2db319f43eb3..b58d120c18268d33df9983edc00e9411fb214feb
@@@ -89,7 -89,7 +89,7 @@@ static traffic_selector_t *create_ts(ch
        {
                traffic_selector_t *ts;
  
-               ts = traffic_selector_create_from_cidr(string, 0, 0);
+               ts = traffic_selector_create_from_cidr(string, 0, 0, 65535);
                if (ts)
                {
                        return ts;
@@@ -156,7 -156,7 +156,7 @@@ METHOD(enumerator_t, peer_enumerator_en
                                                                 local_addr, FALSE,
                                                                 charon->socket->get_port(charon->socket, FALSE),
                                                                 remote_addr, FALSE, IKEV2_UDP_PORT,
 -                                                               FRAGMENTATION_NO);
 +                                                               FRAGMENTATION_NO, 0);
                ike_cfg->add_proposal(ike_cfg, create_proposal(ike_proposal, PROTO_IKE));
                this->peer_cfg = peer_cfg_create(
                                        name, ike_cfg, CERT_SEND_IF_ASKED, UNIQUE_NO,
@@@ -255,7 -255,7 +255,7 @@@ METHOD(enumerator_t, ike_enumerator_enu
                                                                local_addr, FALSE,
                                                                charon->socket->get_port(charon->socket, FALSE),
                                                                remote_addr, FALSE, IKEV2_UDP_PORT,
 -                                                              FRAGMENTATION_NO);
 +                                                              FRAGMENTATION_NO, 0);
                this->ike_cfg->add_proposal(this->ike_cfg,
                                                                        create_proposal(ike_proposal, PROTO_IKE));
  
index eebb5d978b919ece5edde8ff37f66d683db19beb,6c4e711a403563bf52d698e65ed49544c672bab5..ff1fdeef6bb4855fab50a72a9b6d7cf42c0a1594
@@@ -787,7 -787,7 +787,7 @@@ static traffic_selector_t* selector2ts(
        if (host)
        {
                return traffic_selector_create_from_subnet(host, prefixlen,
-                                                                                                  sel->proto, port);
+                                                                                       sel->proto, port, port ?: 65535);
        }
        return NULL;
  }
@@@ -1036,12 -1036,6 +1036,12 @@@ static job_requeue_t receive_events(pri
        return JOB_REQUEUE_DIRECT;
  }
  
 +METHOD(kernel_ipsec_t, get_features, kernel_feature_t,
 +      private_kernel_netlink_ipsec_t *this)
 +{
 +      return KERNEL_ESP_V3_TFC;
 +}
 +
  /**
   * Get an SPI for a specific protocol from the kernel.
   */
@@@ -2740,7 -2734,6 +2740,7 @@@ kernel_netlink_ipsec_t *kernel_netlink_
        INIT(this,
                .public = {
                        .interface = {
 +                              .get_features = _get_features,
                                .get_spi = _get_spi,
                                .get_cpi = _get_cpi,
                                .add_sa  = _add_sa,
diff --combined src/starter/confread.h
index 8dd56080d0de88571900f7454b3d65bf679925f7,26a3568d48a5f107c0494c8c021b66081e4a0776..0690bed4e4fa80faafa35d078bddda226a7d36fe
@@@ -115,7 -115,8 +115,8 @@@ struct starter_end 
                bool            hostaccess;
                bool            allow_any;
                char            *updown;
-               u_int16_t       port;
+               u_int16_t       from_port;
+               u_int16_t       to_port;
                u_int8_t        protocol;
                char            *sourceip;
                char            *dns;
@@@ -148,7 -149,6 +149,7 @@@ struct starter_conn 
                ipsec_mode_t    mode;
                bool            proxy_mode;
                fragmentation_t fragmentation;
 +              u_int           ikedscp;
                sa_option_t     options;
                time_t          sa_ike_life_seconds;
                time_t          sa_ipsec_life_seconds;
index 9d096453aad9b0b50aa3e4ced9162063bc84b191,39c59eb1569e3862423f70151ed1432d6f67a141..cc447c41f33c5923a4a295ddeefa84bd7f91300c
@@@ -146,7 -146,8 +146,8 @@@ static void starter_stroke_add_end(stro
        msg_end->tohost = !conn_end->subnet;
        msg_end->allow_any = conn_end->allow_any;
        msg_end->protocol = conn_end->protocol;
-       msg_end->port = conn_end->port;
+       msg_end->from_port = conn_end->from_port;
+       msg_end->to_port = conn_end->to_port;
  }
  
  int starter_stroke_add_conn(starter_config_t *cfg, starter_conn_t *conn)
        msg.add_conn.mobike = conn->options & SA_OPTION_MOBIKE;
        msg.add_conn.force_encap = conn->options & SA_OPTION_FORCE_ENCAP;
        msg.add_conn.fragmentation = conn->fragmentation;
 +      msg.add_conn.ikedscp = conn->ikedscp;
        msg.add_conn.ipcomp = conn->options & SA_OPTION_COMPRESS;
        msg.add_conn.install_policy = conn->install_policy;
        msg.add_conn.aggressive = conn->aggressive;
diff --combined src/stroke/stroke_msg.h
index b2df887ae6663847aefb8fc1b5e9568e1bfabf7c,3eaa327ce0911858759eec4539b21ce4feaa8522..a9c6f23696344f87122bfc2fc7ec46292c3927e1
@@@ -167,7 -167,8 +167,8 @@@ struct stroke_end_t 
        int tohost;
        int allow_any;
        u_int8_t protocol;
-       u_int16_t port;
+       u_int16_t from_port;
+       u_int16_t to_port;
  };
  
  typedef struct stroke_msg_t stroke_msg_t;
@@@ -262,7 -263,6 +263,7 @@@ struct stroke_msg_t 
                        int close_action;
                        u_int32_t reqid;
                        u_int32_t tfc;
 +                      u_int8_t ikedscp;
  
                        crl_policy_t crl_policy;
                        int unique;