xref: /aosp_15_r20/external/openscreen/discovery/mdns/mdns_sender.cc (revision 3f982cf4871df8771c9d4abe6e9a6f8d829b2736)
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 Sanglard MdnsSender::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 Sanglard Error 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 Sanglard Error 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 Sanglard void 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