blob: 9054d8f5a6efedbeac01016087a3cf16087a6aa8 [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "discovery/mdns/mdns_sender.h"
#include <algorithm>
#include <iostream>
#include <vector>
#include "discovery/mdns/mdns_writer.h"
#include "platform/api/udp_socket.h"
namespace openscreen {
namespace discovery {
MdnsSender::MdnsSender(UdpSocket* socket) : socket_(socket) {
OSP_DCHECK(socket_ != nullptr);
}
MdnsSender::~MdnsSender() = default;
Error MdnsSender::SendMulticast(const MdnsMessage& message) {
const IPEndpoint& endpoint = socket_->IsIPv6() ? kMulticastSendIPv6Endpoint
: kMulticastSendIPv4Endpoint;
return SendMessage(message, endpoint);
}
Error MdnsSender::SendMessage(const MdnsMessage& message,
const IPEndpoint& endpoint) {
// Always try to write the message into the buffer even if MaxWireSize is
// greater than maximum message size. Domain name compression might reduce the
// on-the-wire size of the message sufficiently for it to fit into the buffer.
std::vector<uint8_t> buffer(
std::min(message.MaxWireSize(), kMaxMulticastMessageSize));
MdnsWriter writer(buffer.data(), buffer.size());
if (!writer.Write(message)) {
return Error::Code::kInsufficientBuffer;
}
socket_->SendMessage(buffer.data(), writer.offset(), endpoint);
return Error::Code::kNone;
}
void MdnsSender::OnSendError(UdpSocket* socket, Error error) {
OSP_LOG_ERROR << "Error sending packet";
}
} // namespace discovery
} // namespace openscreen