Send tunnel request.

This commit is contained in:
Ian Gulliver
2015-02-07 15:37:45 -08:00
parent 91323771cb
commit c93121ddf2
3 changed files with 23 additions and 7 deletions

View File

@@ -17,7 +17,7 @@ int main(int argc, char *argv[]) {
std::string server_public_key_filename;
std::string server_address;
std::string server_port;
std::list<uint64_t> channel_bitrates;
std::list<uint32_t> channel_bitrates;
{
int option, option_index;
while ((option = getopt_long(argc, argv, "s:", long_options, &option_index)) != -1) {
@@ -38,7 +38,7 @@ int main(int argc, char *argv[]) {
server_port = optarg;
break;
case 'b':
channel_bitrates.push_back(strtoull(optarg, NULL, 10));
channel_bitrates.push_back(strtoul(optarg, NULL, 10));
break;
}
}

View File

@@ -165,6 +165,13 @@ bool CryptoPubConnBase::HandleSecureHandshake(const TLVNode& node) {
return true;
}
void CryptoPubConnBase::EncryptSend(const TLVNode& node) {
auto encrypted = CryptoUtil::EncodeEncrypt(ephemeral_secret_key_, peer_ephemeral_public_key_, node);
std::string out;
encrypted->Encode(&out);
bufferevent_write(bev_, out.data(), out.length());
}
void CryptoPubConnBase::OnReadable_(struct bufferevent* bev, void* this__) {
auto this_ = (CryptoPubConnBase*)this__;
this_->OnReadable();
@@ -314,7 +321,7 @@ void CryptoPubServerConnection::OnError(const short what) {
}
CryptoPubClient::CryptoPubClient(struct sockaddr* addr, socklen_t addrlen, const std::string& secret_key, const std::string& server_public_key, const std::list<uint64_t>& channel_bitrates)
CryptoPubClient::CryptoPubClient(struct sockaddr* addr, socklen_t addrlen, const std::string& secret_key, const std::string& server_public_key, const std::list<uint32_t>& channel_bitrates)
: CryptoPubConnBase(secret_key),
event_base_(event_base_new()),
channel_bitrates_(channel_bitrates) {
@@ -334,7 +341,7 @@ CryptoPubClient::~CryptoPubClient() {
event_base_free(event_base_);
}
CryptoPubClient* CryptoPubClient::FromHostname(const std::string& server_address, const std::string& server_port, const std::string& secret_key, const std::string& server_public_key, const std::list<uint64_t>& channel_bitrates) {
CryptoPubClient* CryptoPubClient::FromHostname(const std::string& server_address, const std::string& server_port, const std::string& secret_key, const std::string& server_public_key, const std::list<uint32_t>& channel_bitrates) {
struct addrinfo* res;
int gai_ret = getaddrinfo(server_address.c_str(), server_port.c_str(), NULL, &res);
if (gai_ret) {
@@ -393,6 +400,14 @@ void CryptoPubClient::SendHandshake() {
}
void CryptoPubClient::SendTunnelRequest() {
TLVNode tunnel_request(TLV_TYPE_TUNNEL_REQUEST);
for (auto channel_bitrate : channel_bitrates_) {
auto channel = new TLVNode(TLV_TYPE_CHANNEL);
channel_bitrate = htonl(channel_bitrate);
channel->AppendChild(new TLVNode(TLV_TYPE_DOWNSTREAM_BITRATE, std::string((char*)&channel_bitrate, sizeof(channel_bitrate))));
tunnel_request.AppendChild(channel);
}
EncryptSend(tunnel_request);
}
void CryptoPubClient::OnError() {

View File

@@ -32,6 +32,7 @@ class CryptoPubConnBase : public CryptoBase {
std::unique_ptr<TLVNode> BuildSecureHandshake();
bool HandleSecureHandshake(const TLVNode& node);
void EncryptSend(const TLVNode& node);
static void OnReadable_(struct bufferevent* bev, void* this__);
void OnReadable();
@@ -88,10 +89,10 @@ class CryptoPubServerConnection : public CryptoPubConnBase {
class CryptoPubClient : public CryptoPubConnBase {
public:
CryptoPubClient(struct sockaddr* addr, socklen_t addrlen, const std::string& secret_key, const std::string& server_public_key, const std::list<uint64_t>& channel_bitrates);
CryptoPubClient(struct sockaddr* addr, socklen_t addrlen, const std::string& secret_key, const std::string& server_public_key, const std::list<uint32_t>& channel_bitrates);
~CryptoPubClient();
static CryptoPubClient* FromHostname(const std::string& server_address, const std::string& server_port, const std::string& secret_key, const std::string& server_public_key, const std::list<uint64_t>& channel_bitrates);
static CryptoPubClient* FromHostname(const std::string& server_address, const std::string& server_port, const std::string& secret_key, const std::string& server_public_key, const std::list<uint32_t>& channel_bitrates);
void Loop();
@@ -108,5 +109,5 @@ class CryptoPubClient : public CryptoPubConnBase {
struct event_base* event_base_;
const std::list<uint64_t> channel_bitrates_;
const std::list<uint32_t> channel_bitrates_;
};