xref: /aosp_15_r20/external/cronet/net/socket/udp_server_socket.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "net/socket/udp_server_socket.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <utility>
8*6777b538SAndroid Build Coastguard Worker 
9*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
10*6777b538SAndroid Build Coastguard Worker #include "net/base/net_errors.h"
11*6777b538SAndroid Build Coastguard Worker 
12*6777b538SAndroid Build Coastguard Worker namespace net {
13*6777b538SAndroid Build Coastguard Worker 
UDPServerSocket(net::NetLog * net_log,const net::NetLogSource & source)14*6777b538SAndroid Build Coastguard Worker UDPServerSocket::UDPServerSocket(net::NetLog* net_log,
15*6777b538SAndroid Build Coastguard Worker                                  const net::NetLogSource& source)
16*6777b538SAndroid Build Coastguard Worker     : socket_(DatagramSocket::DEFAULT_BIND, net_log, source) {}
17*6777b538SAndroid Build Coastguard Worker 
18*6777b538SAndroid Build Coastguard Worker UDPServerSocket::~UDPServerSocket() = default;
19*6777b538SAndroid Build Coastguard Worker 
Listen(const IPEndPoint & address)20*6777b538SAndroid Build Coastguard Worker int UDPServerSocket::Listen(const IPEndPoint& address) {
21*6777b538SAndroid Build Coastguard Worker   int rv = socket_.Open(address.GetFamily());
22*6777b538SAndroid Build Coastguard Worker   if (rv != OK)
23*6777b538SAndroid Build Coastguard Worker     return rv;
24*6777b538SAndroid Build Coastguard Worker 
25*6777b538SAndroid Build Coastguard Worker   if (allow_address_reuse_) {
26*6777b538SAndroid Build Coastguard Worker     rv = socket_.AllowAddressReuse();
27*6777b538SAndroid Build Coastguard Worker     if (rv != OK) {
28*6777b538SAndroid Build Coastguard Worker       socket_.Close();
29*6777b538SAndroid Build Coastguard Worker       return rv;
30*6777b538SAndroid Build Coastguard Worker     }
31*6777b538SAndroid Build Coastguard Worker   }
32*6777b538SAndroid Build Coastguard Worker 
33*6777b538SAndroid Build Coastguard Worker   if (allow_broadcast_) {
34*6777b538SAndroid Build Coastguard Worker     rv = socket_.SetBroadcast(true);
35*6777b538SAndroid Build Coastguard Worker     if (rv != OK) {
36*6777b538SAndroid Build Coastguard Worker       socket_.Close();
37*6777b538SAndroid Build Coastguard Worker       return rv;
38*6777b538SAndroid Build Coastguard Worker     }
39*6777b538SAndroid Build Coastguard Worker   }
40*6777b538SAndroid Build Coastguard Worker 
41*6777b538SAndroid Build Coastguard Worker   if (allow_address_sharing_for_multicast_) {
42*6777b538SAndroid Build Coastguard Worker     rv = socket_.AllowAddressSharingForMulticast();
43*6777b538SAndroid Build Coastguard Worker     if (rv != OK) {
44*6777b538SAndroid Build Coastguard Worker       socket_.Close();
45*6777b538SAndroid Build Coastguard Worker       return rv;
46*6777b538SAndroid Build Coastguard Worker     }
47*6777b538SAndroid Build Coastguard Worker   }
48*6777b538SAndroid Build Coastguard Worker 
49*6777b538SAndroid Build Coastguard Worker   return socket_.Bind(address);
50*6777b538SAndroid Build Coastguard Worker }
51*6777b538SAndroid Build Coastguard Worker 
RecvFrom(IOBuffer * buf,int buf_len,IPEndPoint * address,CompletionOnceCallback callback)52*6777b538SAndroid Build Coastguard Worker int UDPServerSocket::RecvFrom(IOBuffer* buf,
53*6777b538SAndroid Build Coastguard Worker                               int buf_len,
54*6777b538SAndroid Build Coastguard Worker                               IPEndPoint* address,
55*6777b538SAndroid Build Coastguard Worker                               CompletionOnceCallback callback) {
56*6777b538SAndroid Build Coastguard Worker   return socket_.RecvFrom(buf, buf_len, address, std::move(callback));
57*6777b538SAndroid Build Coastguard Worker }
58*6777b538SAndroid Build Coastguard Worker 
SendTo(IOBuffer * buf,int buf_len,const IPEndPoint & address,CompletionOnceCallback callback)59*6777b538SAndroid Build Coastguard Worker int UDPServerSocket::SendTo(IOBuffer* buf,
60*6777b538SAndroid Build Coastguard Worker                             int buf_len,
61*6777b538SAndroid Build Coastguard Worker                             const IPEndPoint& address,
62*6777b538SAndroid Build Coastguard Worker                             CompletionOnceCallback callback) {
63*6777b538SAndroid Build Coastguard Worker   return socket_.SendTo(buf, buf_len, address, std::move(callback));
64*6777b538SAndroid Build Coastguard Worker }
65*6777b538SAndroid Build Coastguard Worker 
SetReceiveBufferSize(int32_t size)66*6777b538SAndroid Build Coastguard Worker int UDPServerSocket::SetReceiveBufferSize(int32_t size) {
67*6777b538SAndroid Build Coastguard Worker   return socket_.SetReceiveBufferSize(size);
68*6777b538SAndroid Build Coastguard Worker }
69*6777b538SAndroid Build Coastguard Worker 
SetSendBufferSize(int32_t size)70*6777b538SAndroid Build Coastguard Worker int UDPServerSocket::SetSendBufferSize(int32_t size) {
71*6777b538SAndroid Build Coastguard Worker   return socket_.SetSendBufferSize(size);
72*6777b538SAndroid Build Coastguard Worker }
73*6777b538SAndroid Build Coastguard Worker 
SetDoNotFragment()74*6777b538SAndroid Build Coastguard Worker int UDPServerSocket::SetDoNotFragment() {
75*6777b538SAndroid Build Coastguard Worker   return socket_.SetDoNotFragment();
76*6777b538SAndroid Build Coastguard Worker }
77*6777b538SAndroid Build Coastguard Worker 
SetRecvTos()78*6777b538SAndroid Build Coastguard Worker int UDPServerSocket::SetRecvTos() {
79*6777b538SAndroid Build Coastguard Worker   return socket_.SetRecvTos();
80*6777b538SAndroid Build Coastguard Worker }
81*6777b538SAndroid Build Coastguard Worker 
SetMsgConfirm(bool confirm)82*6777b538SAndroid Build Coastguard Worker void UDPServerSocket::SetMsgConfirm(bool confirm) {
83*6777b538SAndroid Build Coastguard Worker   return socket_.SetMsgConfirm(confirm);
84*6777b538SAndroid Build Coastguard Worker }
85*6777b538SAndroid Build Coastguard Worker 
Close()86*6777b538SAndroid Build Coastguard Worker void UDPServerSocket::Close() {
87*6777b538SAndroid Build Coastguard Worker   socket_.Close();
88*6777b538SAndroid Build Coastguard Worker }
89*6777b538SAndroid Build Coastguard Worker 
GetPeerAddress(IPEndPoint * address) const90*6777b538SAndroid Build Coastguard Worker int UDPServerSocket::GetPeerAddress(IPEndPoint* address) const {
91*6777b538SAndroid Build Coastguard Worker   return socket_.GetPeerAddress(address);
92*6777b538SAndroid Build Coastguard Worker }
93*6777b538SAndroid Build Coastguard Worker 
GetLocalAddress(IPEndPoint * address) const94*6777b538SAndroid Build Coastguard Worker int UDPServerSocket::GetLocalAddress(IPEndPoint* address) const {
95*6777b538SAndroid Build Coastguard Worker   return socket_.GetLocalAddress(address);
96*6777b538SAndroid Build Coastguard Worker }
97*6777b538SAndroid Build Coastguard Worker 
NetLog() const98*6777b538SAndroid Build Coastguard Worker const NetLogWithSource& UDPServerSocket::NetLog() const {
99*6777b538SAndroid Build Coastguard Worker   return socket_.NetLog();
100*6777b538SAndroid Build Coastguard Worker }
101*6777b538SAndroid Build Coastguard Worker 
AllowAddressReuse()102*6777b538SAndroid Build Coastguard Worker void UDPServerSocket::AllowAddressReuse() {
103*6777b538SAndroid Build Coastguard Worker   allow_address_reuse_ = true;
104*6777b538SAndroid Build Coastguard Worker }
105*6777b538SAndroid Build Coastguard Worker 
AllowBroadcast()106*6777b538SAndroid Build Coastguard Worker void UDPServerSocket::AllowBroadcast() {
107*6777b538SAndroid Build Coastguard Worker   allow_broadcast_ = true;
108*6777b538SAndroid Build Coastguard Worker }
109*6777b538SAndroid Build Coastguard Worker 
AllowAddressSharingForMulticast()110*6777b538SAndroid Build Coastguard Worker void UDPServerSocket::AllowAddressSharingForMulticast() {
111*6777b538SAndroid Build Coastguard Worker   allow_address_sharing_for_multicast_ = true;
112*6777b538SAndroid Build Coastguard Worker }
113*6777b538SAndroid Build Coastguard Worker 
JoinGroup(const IPAddress & group_address) const114*6777b538SAndroid Build Coastguard Worker int UDPServerSocket::JoinGroup(const IPAddress& group_address) const {
115*6777b538SAndroid Build Coastguard Worker   return socket_.JoinGroup(group_address);
116*6777b538SAndroid Build Coastguard Worker }
117*6777b538SAndroid Build Coastguard Worker 
LeaveGroup(const IPAddress & group_address) const118*6777b538SAndroid Build Coastguard Worker int UDPServerSocket::LeaveGroup(const IPAddress& group_address) const {
119*6777b538SAndroid Build Coastguard Worker   return socket_.LeaveGroup(group_address);
120*6777b538SAndroid Build Coastguard Worker }
121*6777b538SAndroid Build Coastguard Worker 
SetMulticastInterface(uint32_t interface_index)122*6777b538SAndroid Build Coastguard Worker int UDPServerSocket::SetMulticastInterface(uint32_t interface_index) {
123*6777b538SAndroid Build Coastguard Worker   return socket_.SetMulticastInterface(interface_index);
124*6777b538SAndroid Build Coastguard Worker }
125*6777b538SAndroid Build Coastguard Worker 
SetMulticastTimeToLive(int time_to_live)126*6777b538SAndroid Build Coastguard Worker int UDPServerSocket::SetMulticastTimeToLive(int time_to_live) {
127*6777b538SAndroid Build Coastguard Worker   return socket_.SetMulticastTimeToLive(time_to_live);
128*6777b538SAndroid Build Coastguard Worker }
129*6777b538SAndroid Build Coastguard Worker 
SetMulticastLoopbackMode(bool loopback)130*6777b538SAndroid Build Coastguard Worker int UDPServerSocket::SetMulticastLoopbackMode(bool loopback) {
131*6777b538SAndroid Build Coastguard Worker   return socket_.SetMulticastLoopbackMode(loopback);
132*6777b538SAndroid Build Coastguard Worker }
133*6777b538SAndroid Build Coastguard Worker 
SetDiffServCodePoint(DiffServCodePoint dscp)134*6777b538SAndroid Build Coastguard Worker int UDPServerSocket::SetDiffServCodePoint(DiffServCodePoint dscp) {
135*6777b538SAndroid Build Coastguard Worker   return socket_.SetDiffServCodePoint(dscp);
136*6777b538SAndroid Build Coastguard Worker }
137*6777b538SAndroid Build Coastguard Worker 
SetTos(DiffServCodePoint dscp,EcnCodePoint ecn)138*6777b538SAndroid Build Coastguard Worker int UDPServerSocket::SetTos(DiffServCodePoint dscp, EcnCodePoint ecn) {
139*6777b538SAndroid Build Coastguard Worker   return socket_.SetTos(dscp, ecn);
140*6777b538SAndroid Build Coastguard Worker }
141*6777b538SAndroid Build Coastguard Worker 
DetachFromThread()142*6777b538SAndroid Build Coastguard Worker void UDPServerSocket::DetachFromThread() {
143*6777b538SAndroid Build Coastguard Worker   socket_.DetachFromThread();
144*6777b538SAndroid Build Coastguard Worker }
145*6777b538SAndroid Build Coastguard Worker 
GetLastTos() const146*6777b538SAndroid Build Coastguard Worker DscpAndEcn UDPServerSocket::GetLastTos() const {
147*6777b538SAndroid Build Coastguard Worker   return socket_.GetLastTos();
148*6777b538SAndroid Build Coastguard Worker }
149*6777b538SAndroid Build Coastguard Worker 
UseNonBlockingIO()150*6777b538SAndroid Build Coastguard Worker void UDPServerSocket::UseNonBlockingIO() {
151*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
152*6777b538SAndroid Build Coastguard Worker   socket_.UseNonBlockingIO();
153*6777b538SAndroid Build Coastguard Worker #endif
154*6777b538SAndroid Build Coastguard Worker }
155*6777b538SAndroid Build Coastguard Worker 
156*6777b538SAndroid Build Coastguard Worker }  // namespace net
157