public inbox for b.a.t.m.a.n@lists.open-mesh.org
 help / color / mirror / Atom feed
From: Marco Dalla Torre <marco.dallato@gmail.com>
To: The list for a Better Approach To Mobile Ad-hoc Networking
	<b.a.t.m.a.n@lists.open-mesh.org>
Subject: Re: [B.A.T.M.A.N.] [RFCv2] batctl tcpdump: add IPv6 support to tcpdump parser
Date: Tue, 17 Sep 2013 16:01:02 +0200	[thread overview]
Message-ID: <5238609E.5030705@gmail.com> (raw)
In-Reply-To: <20130917123132.GB3053@neomailbox.net>

Hi,

On 09/17/13 14:31, Antonio Quartulli wrote:
> On Tue, Sep 17, 2013 at 02:08:14PM +0200, Marco Dalla Torre wrote:
>> >@@ -47,6 +49,8 @@
>> >  #define ETH_P_BATMAN	0x4305
>> >  #endif /* ETH_P_BATMAN */
>> >
>> >+#define IPV6_MIN_MTU	1280
> I have it in /usr/include/linux/ipv6.h don't you?
> If it has been introduced in a recent version of the headers, please add an
> #ifndef to avoid defining the symbol twice.
>

I'm aware of ipv6.h, in fact this is exactly where the definition I used 
comes from. Unfortunately including it in tcpdump.c generates all sort 
of namespace clashes with the other include statements, and I felt that 
doing namespace housecleaning was beyond the scope of the patch...
I'm not sure of what you mean with the #ifndef, since that statement is 
already present in the file.
Can you suggest a solution (or explain better what you meant if that one 
is the solution)?

>> >+
>> >  #define LEN_CHECK(buff_len, check_len, desc) \
>> >  if ((size_t)(buff_len) < (check_len)) { \
>> >  	fprintf(stderr, "Warning - dropping received %s packet as it is smaller than expected (%zu): %zu\n", \
>> >@@ -188,11 +192,210 @@ static void dump_arp(unsigned char *packet_buff, ssize_t buff_len,
>> >  	}
>> >  }
>> >
>> >+static void parse_tcp(
> Why don't you call this function dump_tcp like all the other dump_* ?

Because, I wasn't aware of this rule. Now I know! :P

>
>> >+	unsigned char *packet_buff,
>> >+	ssize_t buff_len,
>> >+	size_t header_len,
>> >+	char *src_addr,
>> >+	char *dst_addr)
> Did we discuss this "freestyle" alignment in the last RFC?
>

For this and all the other styling problems like that: yes sorry when I 
wrote this patch some time ago I wasn't aware of these formatting rules. 
And I clearly failed correcting all while reviewing it...

>> >+{
>> >+	LEN_CHECK((size_t)buff_len - header_len,
>> >+		sizeof(struct tcphdr), "TCP");
>> >+	struct tcphdr *tcphdr;
> put all the declarations first and then perform the LEN_CHECK, like int he other
> functions.
>

Ok, it just didn't feel right to me to declare something even if you 
might even get to use it, but I can understand that from a style 
conformity point of view.

[...]

>> >+
>> >+	udphdr = (struct udphdr *)(packet_buff + header_len);
>> >+	printf("IP %s.%i > ",
>> >+		src_addr,
>> >+		ntohs(udphdr->source));
> does not fit on one line?

Yeah, it does now with the temporary variable, but when I did format it 
before introducing *udphdr was still much longer for one line... oh 
nevermind I'll fix it of course :)

>> >+
>> >+	switch (ntohs(udphdr->dest)) {
>> >+	case 67:
>> >+		LEN_CHECK(
>> >+			(size_t)buff_len - header_len - sizeof(struct udphdr),
>> >+			(size_t) 44,
>> >+			"DHCP");
> same alignment problem as before. If one argument is too long, feel free to use
> a temporary variable.

Ack.

[...]

>> >+			switch (icmphdr->icmp6_code) {
>> >+			case ICMP6_DST_UNREACH_NOPORT:
>> >+				tmp_iphdr = (struct ip6_hdr *)(((char *)icmphdr)
>> >+					    + sizeof(struct icmp6_hdr));
>> >+
>> >+				tmp_udphdr = (struct udphdr *)
>> >+					     ((char *)tmp_iphdr)
> there is no need for the parenthesis around the cast. and I'd suggest to cast to
> uint8_t or unsigned char. That is the 'recommended' type for this kind of pointer
> operations.

I'll keep it in mind, but I hope you don't mind if I sometimes happen to 
use them to clear things up for my poor C-untrained eye :-D

>> >+		case ICMP6_ECHO_REQUEST:
>> >+			inet_ntop(AF_INET6, &(iphdr->ip6_dst), nd_ipv6_addr,
>> >+				  40);
>> >+			printf("%s: ICMPv6 echo request, id: %d, seq: %d, length: %hu\n",
>> >+			       nd_ipv6_addr, icmphdr->icmp6_id,
>> >+			       icmphdr->icmp6_seq, iphdr->ip6_plen);
>> >+			break;
>> >+		case ICMP6_ECHO_REPLY:
>> >+			inet_ntop(AF_INET6, &(iphdr->ip6_dst),
>> >+				  nd_ipv6_addr, 40);
>> >+			printf("%s: ICMPv6 echo reply, id: %d, seq: %d, length: %hu\n",
>> >+			       nd_ipv6_addr, icmphdr->icmp6_id,
>> >+			       icmphdr->icmp6_seq, iphdr->ip6_plen);
>> >+			break;
>> >+		case ICMP6_TIME_EXCEEDED:
>> >+			inet_ntop(AF_INET6, &(iphdr->ip6_dst), nd_ipv6_addr,
>> >+				  40);
>> >+			printf("%s: ICMPv6 time exceeded in-transit, length %zu\n",
>> >+			       nd_ipv6_addr,
>> >+			       (size_t)buff_len - sizeof(struct icmp6_hdr));
>> >+			break;
>> >+		case ND_NEIGHBOR_SOLICIT:
>> >+			nd_neigh_sol = (struct nd_neighbor_solicit *)icmphdr;
>> >+
>> >+			inet_ntop(AF_INET6, &(nd_neigh_sol->nd_ns_target),
>> >+				  nd_ipv6_addr, 40);
>> >+			printf("NEIGHBOR SOLICITATION, Request who-has %s",
>> >+			       nd_ipv6_addr);
> Does (the real) tcpdump print "who-has" also in this case? I have not checked,
> but we try to reproduce the same output to avoid confusion and make it easier
> to read.
>

I wasn't aware of this "output equality" goal, I'll look into it.

>> >+
>> >+			inet_ntop(AF_INET6, &(iphdr->ip6_src), nd_ipv6_addr,
>> >+				  40);
>> >+			printf(" tell %s, length %zd\n", nd_ipv6_addr,
>> >+			       buff_len);
>> >+			break;
>> >+		case ND_NEIGHBOR_ADVERT:
>> >+			nd_advert = (struct nd_neighbor_advert *)icmphdr;
>> >+			inet_ntop(AF_INET6, &(nd_advert->nd_na_target),
>> >+				  nd_na_target, 40);
>> >+			inet_ntop(AF_INET6, &(iphdr->ip6_dst), nd_ipv6_addr,
>> >+				  40);
>> >+			printf("NEIGHBOR ADVERTISEMENT, Reply to %s for target %s, length %zd\n",
> As above, check what tcpdump prints. I don't think it says "Reply" since there
> is no ARP Request/Reply in this case.

Yes, there is no ARP but the semantics in this case are pretty much the 
same. But as before, I'll look into it.

>> >  	switch (iphdr->protocol) {
>> >  	case IPPROTO_ICMP:
>> >-		LEN_CHECK((size_t)buff_len - (iphdr->ihl * 4), sizeof(struct icmphdr), "ICMP");
>> >+		LEN_CHECK((size_t)buff_len - (iphdr->ihl * 4),
>> >+			  sizeof(struct icmphdr), "ICMP");
> This change is unrelated to this patch.

For this and the others unrelated CHANGES: ok, didn't feel wrong to fix 
some offending formatting, but I'll revert those changes.
By the way: now I understand you! Fixing bad code formatting is like 
drugs! :D

>
> Cheers,
>
> -- Antonio Quartulli
>

Thanks,
Marco

  reply	other threads:[~2013-09-17 14:01 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-09-17 12:08 [B.A.T.M.A.N.] [RFCv2] batctl tcpdump: add IPv6 support to tcpdump parser Marco Dalla Torre
2013-09-17 12:31 ` Antonio Quartulli
2013-09-17 14:01   ` Marco Dalla Torre [this message]
2013-09-17 15:38     ` Antonio Quartulli
2013-09-17 15:51 ` Antonio Quartulli
2013-09-17 16:35   ` Marco Dalla Torre

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=5238609E.5030705@gmail.com \
    --to=marco.dallato@gmail.com \
    --cc=b.a.t.m.a.n@lists.open-mesh.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