Home | History | Annotate | Download | only in base
      1 /*
      2  *  Copyright 2012 The WebRTC Project Authors. All rights reserved.
      3  *
      4  *  Use of this source code is governed by a BSD-style license
      5  *  that can be found in the LICENSE file in the root of the source
      6  *  tree. An additional intellectual property rights grant can be found
      7  *  in the file PATENTS.  All contributing project authors may
      8  *  be found in the AUTHORS file in the root of the source tree.
      9  */
     10 
     11 #ifndef WEBRTC_P2P_BASE_TRANSPORTDESCRIPTION_H_
     12 #define WEBRTC_P2P_BASE_TRANSPORTDESCRIPTION_H_
     13 
     14 #include <algorithm>
     15 #include <string>
     16 #include <vector>
     17 
     18 #include "webrtc/p2p/base/candidate.h"
     19 #include "webrtc/p2p/base/constants.h"
     20 #include "webrtc/base/scoped_ptr.h"
     21 #include "webrtc/base/sslfingerprint.h"
     22 
     23 namespace cricket {
     24 
     25 // SEC_ENABLED and SEC_REQUIRED should only be used if the session
     26 // was negotiated over TLS, to protect the inline crypto material
     27 // exchange.
     28 // SEC_DISABLED: No crypto in outgoing offer, ignore any supplied crypto.
     29 // SEC_ENABLED:  Crypto in outgoing offer and answer (if supplied in offer).
     30 // SEC_REQUIRED: Crypto in outgoing offer and answer. Fail any offer with absent
     31 //               or unsupported crypto.
     32 enum SecurePolicy {
     33   SEC_DISABLED,
     34   SEC_ENABLED,
     35   SEC_REQUIRED
     36 };
     37 
     38 // Whether our side of the call is driving the negotiation, or the other side.
     39 enum IceRole {
     40   ICEROLE_CONTROLLING = 0,
     41   ICEROLE_CONTROLLED,
     42   ICEROLE_UNKNOWN
     43 };
     44 
     45 // ICE RFC 5245 implementation type.
     46 enum IceMode {
     47   ICEMODE_FULL,  // As defined in http://tools.ietf.org/html/rfc5245#section-4.1
     48   ICEMODE_LITE   // As defined in http://tools.ietf.org/html/rfc5245#section-4.2
     49 };
     50 
     51 // RFC 4145 - http://tools.ietf.org/html/rfc4145#section-4
     52 // 'active':  The endpoint will initiate an outgoing connection.
     53 // 'passive': The endpoint will accept an incoming connection.
     54 // 'actpass': The endpoint is willing to accept an incoming
     55 //            connection or to initiate an outgoing connection.
     56 enum ConnectionRole {
     57   CONNECTIONROLE_NONE = 0,
     58   CONNECTIONROLE_ACTIVE,
     59   CONNECTIONROLE_PASSIVE,
     60   CONNECTIONROLE_ACTPASS,
     61   CONNECTIONROLE_HOLDCONN,
     62 };
     63 
     64 extern const char CONNECTIONROLE_ACTIVE_STR[];
     65 extern const char CONNECTIONROLE_PASSIVE_STR[];
     66 extern const char CONNECTIONROLE_ACTPASS_STR[];
     67 extern const char CONNECTIONROLE_HOLDCONN_STR[];
     68 
     69 bool StringToConnectionRole(const std::string& role_str, ConnectionRole* role);
     70 bool ConnectionRoleToString(const ConnectionRole& role, std::string* role_str);
     71 
     72 typedef std::vector<Candidate> Candidates;
     73 
     74 struct TransportDescription {
     75   TransportDescription()
     76       : ice_mode(ICEMODE_FULL),
     77         connection_role(CONNECTIONROLE_NONE) {}
     78 
     79   TransportDescription(const std::vector<std::string>& transport_options,
     80                        const std::string& ice_ufrag,
     81                        const std::string& ice_pwd,
     82                        IceMode ice_mode,
     83                        ConnectionRole role,
     84                        const rtc::SSLFingerprint* identity_fingerprint,
     85                        const Candidates& candidates)
     86       : transport_options(transport_options),
     87         ice_ufrag(ice_ufrag),
     88         ice_pwd(ice_pwd),
     89         ice_mode(ice_mode),
     90         connection_role(role),
     91         identity_fingerprint(CopyFingerprint(identity_fingerprint)),
     92         candidates(candidates) {}
     93   TransportDescription(const std::string& ice_ufrag,
     94                        const std::string& ice_pwd)
     95       : ice_ufrag(ice_ufrag),
     96         ice_pwd(ice_pwd),
     97         ice_mode(ICEMODE_FULL),
     98         connection_role(CONNECTIONROLE_NONE) {}
     99   TransportDescription(const TransportDescription& from)
    100       : transport_options(from.transport_options),
    101         ice_ufrag(from.ice_ufrag),
    102         ice_pwd(from.ice_pwd),
    103         ice_mode(from.ice_mode),
    104         connection_role(from.connection_role),
    105         identity_fingerprint(CopyFingerprint(from.identity_fingerprint.get())),
    106         candidates(from.candidates) {}
    107 
    108   TransportDescription& operator=(const TransportDescription& from) {
    109     // Self-assignment
    110     if (this == &from)
    111       return *this;
    112 
    113     transport_options = from.transport_options;
    114     ice_ufrag = from.ice_ufrag;
    115     ice_pwd = from.ice_pwd;
    116     ice_mode = from.ice_mode;
    117     connection_role = from.connection_role;
    118 
    119     identity_fingerprint.reset(CopyFingerprint(
    120         from.identity_fingerprint.get()));
    121     candidates = from.candidates;
    122     return *this;
    123   }
    124 
    125   bool HasOption(const std::string& option) const {
    126     return (std::find(transport_options.begin(), transport_options.end(),
    127                       option) != transport_options.end());
    128   }
    129   void AddOption(const std::string& option) {
    130     transport_options.push_back(option);
    131   }
    132   bool secure() const { return identity_fingerprint != NULL; }
    133 
    134   static rtc::SSLFingerprint* CopyFingerprint(
    135       const rtc::SSLFingerprint* from) {
    136     if (!from)
    137       return NULL;
    138 
    139     return new rtc::SSLFingerprint(*from);
    140   }
    141 
    142   std::vector<std::string> transport_options;
    143   std::string ice_ufrag;
    144   std::string ice_pwd;
    145   IceMode ice_mode;
    146   ConnectionRole connection_role;
    147 
    148   rtc::scoped_ptr<rtc::SSLFingerprint> identity_fingerprint;
    149   Candidates candidates;
    150 };
    151 
    152 }  // namespace cricket
    153 
    154 #endif  // WEBRTC_P2P_BASE_TRANSPORTDESCRIPTION_H_
    155