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