[patch] allow write() on SOCK_PACKET sockets

From: Stas Sergeev
Date: Mon Oct 11 2004 - 13:18:25 EST


Hello.

Unless I am really missing something, there
seem to be no reason why the SOCK_PACKET code
does not allow to use write() or send() when
the socket was bound, and insists on using
sendto(). SOCK_RAW code, in comparison, allows
write() after bind().
Attached patch allows write() for the SOCK_PACKET
sockets when they are bound.
Can this be applied, or am I missing the point?

Signed-off-by: Stas Sergeev <stsp@xxxxxxxx>

--- linux/net/packet/af_packet.c 2004-06-26 15:20:54.000000000 +0400
+++ linux/net/packet/af_packet.c 2004-10-10 02:25:41.000000000 +0400
@@ -322,16 +322,23 @@
return(-EINVAL);
if (msg->msg_namelen==sizeof(struct sockaddr_pkt))
proto=saddr->spkt_protocol;
+ /*
+ * Find the device first to size check it
+ */
+
+ saddr->spkt_device[13] = 0;
+ dev = dev_get_by_name(saddr->spkt_device);
}
else
- return(-ENOTCONN); /* SOCK_PACKET must be sent giving an address */
-
- /*
- * Find the device first to size check it
- */
+ {
+ struct packet_opt *po = pkt_sk(sk);
+ if (!po->running || !po->prot_hook.dev)
+ return -ENOTCONN; /* SOCK_PACKET must be sent giving an address */
+ proto = po->prot_hook.type;
+ dev = po->prot_hook.dev;
+ dev_hold(dev);
+ }

- saddr->spkt_device[13] = 0;
- dev = dev_get_by_name(saddr->spkt_device);
err = -ENODEV;
if (dev == NULL)
goto out_unlock;