1*3f982cf4SFabien Sanglard // Copyright 2019 The Chromium Authors. All rights reserved. 2*3f982cf4SFabien Sanglard // Use of this source code is governed by a BSD-style license that can be 3*3f982cf4SFabien Sanglard // found in the LICENSE file. 4*3f982cf4SFabien Sanglard 5*3f982cf4SFabien Sanglard #include "discovery/mdns/mdns_sender.h" 6*3f982cf4SFabien Sanglard 7*3f982cf4SFabien Sanglard #include <algorithm> 8*3f982cf4SFabien Sanglard #include <iostream> 9*3f982cf4SFabien Sanglard #include <vector> 10*3f982cf4SFabien Sanglard 11*3f982cf4SFabien Sanglard #include "discovery/mdns/mdns_writer.h" 12*3f982cf4SFabien Sanglard #include "platform/api/udp_socket.h" 13*3f982cf4SFabien Sanglard 14*3f982cf4SFabien Sanglard namespace openscreen { 15*3f982cf4SFabien Sanglard namespace discovery { 16*3f982cf4SFabien Sanglard MdnsSender(UdpSocket * socket)17*3f982cf4SFabien SanglardMdnsSender::MdnsSender(UdpSocket* socket) : socket_(socket) { 18*3f982cf4SFabien Sanglard OSP_DCHECK(socket_ != nullptr); 19*3f982cf4SFabien Sanglard } 20*3f982cf4SFabien Sanglard 21*3f982cf4SFabien Sanglard MdnsSender::~MdnsSender() = default; 22*3f982cf4SFabien Sanglard SendMulticast(const MdnsMessage & message)23*3f982cf4SFabien SanglardError MdnsSender::SendMulticast(const MdnsMessage& message) { 24*3f982cf4SFabien Sanglard const IPEndpoint& endpoint = socket_->IsIPv6() ? kMulticastSendIPv6Endpoint 25*3f982cf4SFabien Sanglard : kMulticastSendIPv4Endpoint; 26*3f982cf4SFabien Sanglard return SendMessage(message, endpoint); 27*3f982cf4SFabien Sanglard } 28*3f982cf4SFabien Sanglard SendMessage(const MdnsMessage & message,const IPEndpoint & endpoint)29*3f982cf4SFabien SanglardError MdnsSender::SendMessage(const MdnsMessage& message, 30*3f982cf4SFabien Sanglard const IPEndpoint& endpoint) { 31*3f982cf4SFabien Sanglard // Always try to write the message into the buffer even if MaxWireSize is 32*3f982cf4SFabien Sanglard // greater than maximum message size. Domain name compression might reduce the 33*3f982cf4SFabien Sanglard // on-the-wire size of the message sufficiently for it to fit into the buffer. 34*3f982cf4SFabien Sanglard std::vector<uint8_t> buffer( 35*3f982cf4SFabien Sanglard std::min(message.MaxWireSize(), kMaxMulticastMessageSize)); 36*3f982cf4SFabien Sanglard MdnsWriter writer(buffer.data(), buffer.size()); 37*3f982cf4SFabien Sanglard if (!writer.Write(message)) { 38*3f982cf4SFabien Sanglard return Error::Code::kInsufficientBuffer; 39*3f982cf4SFabien Sanglard } 40*3f982cf4SFabien Sanglard 41*3f982cf4SFabien Sanglard socket_->SendMessage(buffer.data(), writer.offset(), endpoint); 42*3f982cf4SFabien Sanglard return Error::Code::kNone; 43*3f982cf4SFabien Sanglard } 44*3f982cf4SFabien Sanglard OnSendError(UdpSocket * socket,Error error)45*3f982cf4SFabien Sanglardvoid MdnsSender::OnSendError(UdpSocket* socket, Error error) { 46*3f982cf4SFabien Sanglard OSP_LOG_ERROR << "Error sending packet"; 47*3f982cf4SFabien Sanglard } 48*3f982cf4SFabien Sanglard 49*3f982cf4SFabien Sanglard } // namespace discovery 50*3f982cf4SFabien Sanglard } // namespace openscreen 51