Message ID | 20240505185456.214677-1-doug@schmorgal.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 2e82a58d6c0797092eabe7ba66a532c11548047f |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [net] appletalk: Improve handling of broadcast packets | expand |
Hello: This patch was applied to netdev/net.git (main) by David S. Miller <davem@davemloft.net>: On Sun, 5 May 2024 11:54:57 -0700 you wrote: > From: Vincent Duvert <vincent.ldev@duvert.net> > > When a broadcast AppleTalk packet is received, prefer queuing it on the > socket whose address matches the address of the interface that received > the packet (and is listening on the correct port). Userspace > applications that handle such packets will usually send a response on > the same socket that received the packet; this fix allows the response > to be sent on the correct interface. > > [...] Here is the summary with links: - [net] appletalk: Improve handling of broadcast packets https://git.kernel.org/netdev/net/c/2e82a58d6c07 You are awesome, thank you!
diff --git a/net/appletalk/ddp.c b/net/appletalk/ddp.c index 198f5ba2feae..b068651984fe 100644 --- a/net/appletalk/ddp.c +++ b/net/appletalk/ddp.c @@ -88,6 +88,7 @@ static inline void atalk_remove_socket(struct sock *sk) static struct sock *atalk_search_socket(struct sockaddr_at *to, struct atalk_iface *atif) { + struct sock *def_socket = NULL; struct sock *s; read_lock_bh(&atalk_sockets_lock); @@ -98,8 +99,20 @@ static struct sock *atalk_search_socket(struct sockaddr_at *to, continue; if (to->sat_addr.s_net == ATADDR_ANYNET && - to->sat_addr.s_node == ATADDR_BCAST) - goto found; + to->sat_addr.s_node == ATADDR_BCAST) { + if (atif->address.s_node == at->src_node && + atif->address.s_net == at->src_net) { + /* This socket's address matches the address of the interface + * that received the packet -- use it + */ + goto found; + } + + /* Continue searching for a socket matching the interface address, + * but use this socket by default if no other one is found + */ + def_socket = s; + } if (to->sat_addr.s_net == at->src_net && (to->sat_addr.s_node == at->src_node || @@ -116,7 +129,7 @@ static struct sock *atalk_search_socket(struct sockaddr_at *to, goto found; } } - s = NULL; + s = def_socket; found: read_unlock_bh(&atalk_sockets_lock); return s;