Phonet: deliver broadcast packets to broadcast sockets

Signed-off-by: Rémi Denis-Courmont <remi.denis-courmont@nokia.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
diff --git a/net/phonet/socket.c b/net/phonet/socket.c
index aa5b5a9..8c84190 100644
--- a/net/phonet/socket.c
+++ b/net/phonet/socket.c
@@ -94,7 +94,28 @@
 	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)