1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifndef REMOTING_PROTOCOL_NETWORK_SETTINGS_H_
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define REMOTING_PROTOCOL_NETWORK_SETTINGS_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include <string>
95c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/basictypes.h"
115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/logging.h"
125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace remoting {
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace protocol {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NetworkSettings {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When hosts are configured with NAT traversal disabled they will
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // typically also limit their P2P ports to this range, so that
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // sessions may be blocked or un-blocked via firewall rules.
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int kDefaultMinPort = 12400;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int kDefaultMaxPort = 12409;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  enum Flags {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Don't use STUN or relay servers. Accept incoming P2P connection
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // attempts, but don't initiate any. This ensures that the peer is
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // on the same network. Note that connection will always fail if
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // both ends use this mode.
295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    NAT_TRAVERSAL_DISABLED = 0x0,
305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    // Allow outgoing connections, even when STUN and RELAY are not enabled.
325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    NAT_TRAVERSAL_OUTGOING = 0x1,
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    // Active NAT traversal using STUN.
355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    NAT_TRAVERSAL_STUN = 0x2,
365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    // Allow the use of relay servers when a direct connection is not available.
385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    NAT_TRAVERSAL_RELAY = 0x4,
395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    // Active NAT traversal using STUN and relay servers.
415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    NAT_TRAVERSAL_FULL = NAT_TRAVERSAL_STUN | NAT_TRAVERSAL_RELAY |
425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        NAT_TRAVERSAL_OUTGOING
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NetworkSettings()
465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      : flags(NAT_TRAVERSAL_DISABLED),
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        min_port(0),
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        max_port(0) {
495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    DCHECK(!(flags & (NAT_TRAVERSAL_STUN | NAT_TRAVERSAL_RELAY)) ||
505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu           (flags & NAT_TRAVERSAL_OUTGOING));
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  explicit NetworkSettings(uint32 flags)
545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      : flags(flags),
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        min_port(0),
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        max_port(0) {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Parse string in the form "<min_port>-<max_port>". E.g. "12400-12409".
605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Returns true if string was parsed successfuly.
615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  static bool ParsePortRange(const std::string& port_range,
625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                             int* out_min_port,
635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                             int* out_max_port);
645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  uint32 flags;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |min_port| and |max_port| specify range (inclusive) of ports used by
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // P2P sessions. Any port can be used when both values are set to 0.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int min_port;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int max_port;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace protocol
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace remoting
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // REMOTING_HOST_NETWORK_SETTINGS_H_
77