Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f14001fc authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont Committed by David S. Miller
Browse files

Phonet: deliver broadcast packets to broadcast sockets

parent 67ca0e5f
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -47,6 +47,7 @@ static inline struct pn_sock *pn_sk(struct sock *sk)
extern const struct proto_ops phonet_dgram_ops;

struct sock *pn_find_sock_by_sa(struct net *net, const struct sockaddr_pn *sa);
void pn_deliver_sock_broadcast(struct net *net, struct sk_buff *skb);
void phonet_get_local_port_range(int *min, int *max);
void pn_sock_hash(struct sock *sk);
void pn_sock_unhash(struct sock *sk);
+6 −0
Original line number Diff line number Diff line
@@ -369,6 +369,12 @@ static int phonet_rcv(struct sk_buff *skb, struct net_device *dev,

	pn_skb_get_dst_sockaddr(skb, &sa);

	/* check if this is broadcasted */
	if (pn_sockaddr_get_addr(&sa) == PNADDR_BROADCAST) {
		pn_deliver_sock_broadcast(net, skb);
		goto out;
	}

	/* check if we are the destination */
	if (phonet_address_lookup(net, pn_sockaddr_get_addr(&sa)) == 0) {
		/* Phonet packet input */
+21 −0
Original line number Diff line number Diff line
@@ -94,7 +94,28 @@ struct sock *pn_find_sock_by_sa(struct net *net, const struct sockaddr_pn *spn)
	spin_unlock_bh(&pnsocks.lock);

	return rval;
}

/* Deliver a broadcast packet (only in bottom-half) */
void pn_deliver_sock_broadcast(struct net *net, struct sk_buff *skb)
{
	struct hlist_node *node;
	struct sock *sknode;

	spin_lock(&pnsocks.lock);
	sk_for_each(sknode, node, &pnsocks.hlist) {
		struct sk_buff *clone;

		if (!net_eq(sock_net(sknode), net))
			continue;
		if (!sock_flag(sknode, SOCK_BROADCAST))
			continue;

		clone = skb_clone(skb, GFP_ATOMIC);
		if (clone)
			sk_receive_skb(sknode, clone, 0);
	}
	spin_unlock(&pnsocks.lock);
}

void pn_sock_hash(struct sock *sk)