linux-man.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Graham Shaw <gdshaw-1YjpMCWsJptAfugRpC6u6w@public.gmane.org>
To: mtk.manpages-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org
Cc: linux-man-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Subject: packet(7) omits sll_protocol from required field list for outbound packets
Date: Wed, 06 Jun 2012 22:27:37 +0100	[thread overview]
Message-ID: <4FCFCB49.20504@riscpkg.org> (raw)

The manpage packet(7) currently states that:

"When you send packets it is enough to specify sll_family, sll_addr, 
sll_halen, sll_ifindex."

This is incorrect: you also need to specify sll_protocol.

(The protocol specified when the socket is created is used for filtering 
inbound packets, but not for constructing outbound packets.)

I encountered this while researching a page for my website:

http://www.microhowto.info/howto/send_an_arbitrary_ethernet_frame_using_an_af_packet_socket_in_c.html

To empirically verify the behaviour I took my test code from the above 
page then changed it to use different values for the third argument to 
socket() and the sll_protocol field:

- socket created with ETH_P_ARP, packet sent with ETH_P_ARP:
     packet sent with EtherType of ETH_P_ARP
- socket created with ETH_P_ARP, sll_protocol==0:
     packet sent with EtherType of 0
- socket created with 0x88b5, sll_protocol==htons(ETH_P_ARP):
     packet sent with EtherType of ETH_P_ARP
- socket created with ETH_P_ARP, sll_protocol==htons(0x88b5):
     packet sent with EtherType of 0x88b5

This shows that leaving sll_protocol set to zero does not have the 
desired effect and that it needs to be set to the desired link-layer 
protocol.

There is code in the relevant kernel source file 
(net/packet/af_packet.c) which appears to inspect the value of the 
sll_protocol field and use it as the link-layer protocol number, however 
I am not sufficiently familiar with this subsystem to be fully confident 
of what is happening. The line in question is:

     proto   = saddr->sll_protocol;

In version 3.4 of the kernel this can be found in the functions 
packet_snd and tpacket_snd. In version 2.6.26 it is in packet_sendmsg.

Below is a patch that adds sll_protocol to the list of required fields. 
This may not be the whole truth, since it is not clear what role if any 
sll_protocol, sll_halen or sll_addr would play when the socket type is 
SOCK_RAW, however I'm confident it is more accurate than the page as it 
stands at present:

diff --git a/man7/packet.7 b/man7/packet.7
index 374f6da..fb09f15 100644
--- a/man7/packet.7
+++ b/man7/packet.7
@@ -160,7 +160,9 @@ When you send packets it is enough to specify
  .IR sll_family ,
  .IR sll_addr ,
  .IR sll_halen ,
-.IR sll_ifindex .
+.IR sll_ifindex
+and
+.IR sll_protocol .
  The other fields should be 0.
  .I sll_hatype
  and

Yours,

Graham Shaw
http://gdshaw.net/
--
To unsubscribe from this list: send the line "unsubscribe linux-man" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

             reply	other threads:[~2012-06-06 21:27 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-06-06 21:27 Graham Shaw [this message]
     [not found] ` <4FCFCB49.20504-1YjpMCWsJptAfugRpC6u6w@public.gmane.org>
2015-05-06 13:06   ` packet(7) omits sll_protocol from required field list for outbound packets Michael Kerrisk (man-pages)

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4FCFCB49.20504@riscpkg.org \
    --to=gdshaw-1yjpmcwsjptafugrpc6u6w@public.gmane.org \
    --cc=linux-man-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=mtk.manpages-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).