Skip to content

Commit 4713188

Browse files
committed
udp: Add optional broadcast capabilities
Signed-off-by: Konrad Gräfe <[email protected]>
1 parent 61ecafc commit 4713188

File tree

2 files changed

+33
-9
lines changed

2 files changed

+33
-9
lines changed

src/adapters/udp.rs

+26-2
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@ pub const MAX_LOCAL_PAYLOAD_LEN: usize = 65535 - 20 - 8;
2626
#[cfg(target_os = "macos")]
2727
pub const MAX_LOCAL_PAYLOAD_LEN: usize = 9216 - 20 - 8;
2828

29+
#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, Default)]
30+
pub struct UdpConfig {
31+
set_broadcast: bool,
32+
}
33+
2934
pub(crate) struct UdpAdapter;
3035
impl Adapter for UdpAdapter {
3136
type Remote = RemoteResource;
@@ -44,11 +49,21 @@ impl Resource for RemoteResource {
4449

4550
impl Remote for RemoteResource {
4651
fn connect_with(
47-
_: TransportConnect,
52+
config: TransportConnect,
4853
remote_addr: RemoteAddr,
4954
) -> io::Result<ConnectionInfo<Self>> {
55+
let config = match config {
56+
TransportConnect::Udp(config) => config,
57+
_ => unreachable!(),
58+
};
59+
5060
let socket = UdpSocket::bind("0.0.0.0:0".parse().unwrap())?;
5161
let peer_addr = *remote_addr.socket_addr();
62+
63+
if config.set_broadcast {
64+
socket.set_broadcast(true)?;
65+
}
66+
5267
socket.connect(peer_addr)?;
5368
let local_addr = socket.local_addr()?;
5469
Ok(ConnectionInfo { remote: RemoteResource { socket }, local_addr, peer_addr })
@@ -98,7 +113,12 @@ impl Resource for LocalResource {
98113
impl Local for LocalResource {
99114
type Remote = RemoteResource;
100115

101-
fn listen_with(_: TransportListen, addr: SocketAddr) -> io::Result<ListeningInfo<Self>> {
116+
fn listen_with(config: TransportListen, addr: SocketAddr) -> io::Result<ListeningInfo<Self>> {
117+
let config = match config {
118+
TransportListen::Udp(config) => config,
119+
_ => unreachable!(),
120+
};
121+
102122
let socket = match addr {
103123
SocketAddr::V4(addr) if addr.ip().is_multicast() => {
104124
let listening_addr = SocketAddrV4::new(Ipv4Addr::UNSPECIFIED, addr.port());
@@ -115,6 +135,10 @@ impl Local for LocalResource {
115135
_ => UdpSocket::bind(addr)?,
116136
};
117137

138+
if config.set_broadcast {
139+
socket.set_broadcast(true)?;
140+
}
141+
118142
let local_addr = socket.local_addr().unwrap();
119143
Ok(ListeningInfo { local: { LocalResource { socket } }, local_addr })
120144
}

src/network/transport.rs

+7-7
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use crate::adapters::tcp::{TcpAdapter};
55
#[cfg(feature = "tcp")]
66
use crate::adapters::framed_tcp::{FramedTcpAdapter};
77
#[cfg(feature = "udp")]
8-
use crate::adapters::udp::{self, UdpAdapter};
8+
use crate::adapters::udp::{self, UdpAdapter, UdpConfig};
99
#[cfg(feature = "websocket")]
1010
use crate::adapters::ws::{self, WsAdapter};
1111

@@ -160,7 +160,7 @@ impl std::fmt::Display for Transport {
160160
pub enum TransportConnect {
161161
Tcp,
162162
FramedTcp,
163-
Udp,
163+
Udp(UdpConfig),
164164
Ws,
165165
}
166166

@@ -169,7 +169,7 @@ impl TransportConnect {
169169
let transport = match self {
170170
Self::Tcp => Transport::Tcp,
171171
Self::FramedTcp => Transport::FramedTcp,
172-
Self::Udp => Transport::Udp,
172+
Self::Udp(_) => Transport::Udp,
173173
Self::Ws => Transport::Ws,
174174
};
175175

@@ -182,7 +182,7 @@ impl From<Transport> for TransportConnect {
182182
match transport {
183183
Transport::Tcp => Self::Tcp,
184184
Transport::FramedTcp => Self::FramedTcp,
185-
Transport::Udp => Self::Udp,
185+
Transport::Udp => Self::Udp(UdpConfig::default()),
186186
Transport::Ws => Self::Ws,
187187
}
188188
}
@@ -191,7 +191,7 @@ impl From<Transport> for TransportConnect {
191191
pub enum TransportListen {
192192
Tcp,
193193
FramedTcp,
194-
Udp,
194+
Udp(UdpConfig),
195195
Ws,
196196
}
197197

@@ -200,7 +200,7 @@ impl TransportListen {
200200
let transport = match self {
201201
Self::Tcp => Transport::Tcp,
202202
Self::FramedTcp => Transport::FramedTcp,
203-
Self::Udp => Transport::Udp,
203+
Self::Udp(_) => Transport::Udp,
204204
Self::Ws => Transport::Ws,
205205
};
206206

@@ -213,7 +213,7 @@ impl From<Transport> for TransportListen {
213213
match transport {
214214
Transport::Tcp => Self::Tcp,
215215
Transport::FramedTcp => Self::FramedTcp,
216-
Transport::Udp => Self::Udp,
216+
Transport::Udp => Self::Udp(UdpConfig::default()),
217217
Transport::Ws => Self::Ws,
218218
}
219219
}

0 commit comments

Comments
 (0)