// 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 #include #include #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 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