From: Andrew Lunn <andrew@lunn.ch>
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.] [PATCH 2/2] batman-adv: layer2 unicast packet fragmentation
Date: Tue, 6 Jul 2010 19:07:37 +0200 [thread overview]
Message-ID: <20100706170737.GA18453@lunn.ch> (raw)
In-Reply-To: <1278431960-4636-2-git-send-email-an.langer@gmx.de>
> +struct frag_packet_list_entry *search_frag_packet(struct list_head *head,
> + struct unicast_frag_packet *up) {
> +
> + struct frag_packet_list_entry *tfp;
> + struct unicast_frag_packet *tmp_up = NULL;
> +
> + list_for_each_entry(tfp, head, list) {
> +
> + if (!tfp->skb)
> + continue;
> +
> + if (tfp->seqno == ntohs(up->seqno))
> + goto mov_tail;
Please could you explain this last bit? If we have received a
retransmit we move it to the tail of the list?
> +
> + tmp_up = (struct unicast_frag_packet *) tfp->skb->data;
> +
> + if (up->flags & UNI_FRAG_HEAD) {
> +
> + if (tfp->seqno == ntohs(up->seqno)+1) {
> + if (tmp_up->flags & UNI_FRAG_HEAD)
> + goto mov_tail;
> + else
> + goto ret_tfp;
> + }
> + } else {
> +
> + if (tfp->seqno == ntohs(up->seqno)-1) {
> + if (tmp_up->flags & UNI_FRAG_HEAD)
> + goto ret_tfp;
> + else
> + goto mov_tail;
> + }
> + }
How about simplifying this loop a little. Not tested, probably broken,
but i hope expresses the idea:
if (up->flags & UNI_FRAG_HEAD) {
search_seqno = ntohs(up->seqno)+1
} else {
search_seqno = ntohs(up->seqno)-1
}
list_for_each_entry(tfp, head, list) {
if (!tfp->skb)
continue;
/* Found the other fragment? */
if (tfp->seqno == search_seqno)
/* Head and a tail? */
if ((tmp_up->flags & UNI_FRAG_HEAD) !=
(tfp->flags & UNI_FRAG_HEAD)
return tfp;
} else {
/* Two heads or tails. Move to tail of list so it will
get recycled */
list_move_tail(&tfp->list, head);
return NULL;
}
}
return NULL;
Moving the ntohs() out of the loop should save a few cycles and it is
hopefully a little bit more readable.
> + }
> + goto ret_null;
> +
> +ret_tfp:
> + return tfp;
> +mov_tail:
> + list_move_tail(&tfp->list, head);
> +ret_null:
> + return NULL;
Assuming you don't like my re-write, could we remove ret_tfp and
ret_null. I don't think they aid the understandability of the
code. They are just return statements.
> +}
> +
> +void frag_list_free(struct list_head *head)
> +{
> +
> + struct frag_packet_list_entry *pf, *tmp_pf;
> +
> + if (!list_empty(head)) {
> +
> + list_for_each_entry_safe(pf, tmp_pf, head, list) {
> + if (pf->skb)
> + kfree_skb(pf->skb);
kfree_skb() is happy to take a NULL pointer. So there is no need to do
the comparison here. It will get repeated inside kfree_skb(). This
happens in a few places.
> + list_del(&pf->list);
> + kfree(pf);
> + }
> + }
> + return;
> +int recv_unicast_packet(struct sk_buff *skb, struct batman_if *recv_if)
> +{
> + struct unicast_packet *unicast_packet;
> + struct ethhdr *ethhdr;
> + int hdr_size = sizeof(struct unicast_packet);
> +
> + /* drop packet if it has not necessary minimum size */
> + if (skb_headlen(skb) < hdr_size)
> + return NET_RX_DROP;
> +
> + ethhdr = (struct ethhdr *) skb_mac_header(skb);
> +
> + /* packet with unicast indication but broadcast recipient */
> + if (is_bcast(ethhdr->h_dest))
> + return NET_RX_DROP;
> +
> + /* packet with broadcast sender address */
> + if (is_bcast(ethhdr->h_source))
> + return NET_RX_DROP;
> +
> + /* not for me */
> + if (!is_my_mac(ethhdr->h_dest))
> + return NET_RX_DROP;
> +
> + unicast_packet = (struct unicast_packet *) skb->data;
> +
> + /* packet for me */
> + if (is_my_mac(unicast_packet->dest)) {
> + interface_rx(skb, hdr_size);
> + return NET_RX_SUCCESS;
> + }
> +
> + return route_unicast_packet(skb, recv_if, hdr_size);
> +}
> +
> +int recv_ucast_frag_packet(struct sk_buff *skb, struct batman_if *recv_if)
> +{
> + struct unicast_frag_packet *unicast_packet;
> + struct orig_node *orig_node;
> + struct ethhdr *ethhdr;
> + struct frag_packet_list_entry *tmp_frag_entry;
> + int hdr_size = sizeof(struct unicast_frag_packet);
> + unsigned long flags;
> +
> + /* drop packet if it has not necessary minimum size */
> + if (skb_headlen(skb) < hdr_size)
> + return NET_RX_DROP;
> +
> + ethhdr = (struct ethhdr *) skb_mac_header(skb);
> +
> + /* packet with unicast indication but broadcast recipient */
> + if (is_bcast(ethhdr->h_dest))
> + return NET_RX_DROP;
> +
> + /* packet with broadcast sender address */
> + if (is_bcast(ethhdr->h_source))
> + return NET_RX_DROP;
> +
> + /* not for me */
> + if (!is_my_mac(ethhdr->h_dest))
> + return NET_RX_DROP;
> +
There is some code here which is identical to
recv_unicast_packet(). Could it be refactored into a helper function?
Andrew
next prev parent reply other threads:[~2010-07-06 17:07 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-07-06 15:58 [B.A.T.M.A.N.] batman adv unicast fragmentation (version 4) Andreas Langer
2010-07-06 15:59 ` [B.A.T.M.A.N.] [PATCH 1/2] batctl: layer2 unicast packet fragmentation Andreas Langer
2010-07-06 15:59 ` [B.A.T.M.A.N.] [PATCH 2/2] batman-adv: " Andreas Langer
2010-07-06 17:07 ` Andrew Lunn [this message]
2010-07-06 18:06 ` Andreas Langer
2010-07-06 17:39 ` Antonio Quartulli
2010-07-06 18:17 ` Andreas Langer
2010-07-06 18:57 ` Andrew Lunn
2010-07-06 19:13 ` Sven Eckelmann
2010-07-06 19:50 ` Marek Lindner
2010-07-07 10:40 ` Marek Lindner
-- strict thread matches above, loose matches on Subject: below --
2010-07-07 17:30 [B.A.T.M.A.N.] batman adv unicast fragmentation (version 5) Andreas Langer
2010-07-07 17:32 ` [B.A.T.M.A.N.] [PATCH 2/2] batman-adv: layer2 unicast packet fragmentation Andreas Langer
2010-07-09 14:51 ` Sven Eckelmann
2010-07-05 21:42 [B.A.T.M.A.N.] batman adv unicast fragmentation (version 3) Andreas Langer
2010-07-05 21:44 ` [B.A.T.M.A.N.] [PATCH 2/2] batman-adv: layer2 unicast packet fragmentation Andreas Langer
2010-06-30 18:58 [B.A.T.M.A.N.] batman adv unicast fragmentation Andreas Langer
2010-06-30 19:00 ` [B.A.T.M.A.N.] [PATCH 2/2] batman-adv: layer2 unicast packet fragmentation Andreas Langer
2010-07-05 0:37 ` Sven Eckelmann
2010-07-05 12:53 ` Sven Eckelmann
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=20100706170737.GA18453@lunn.ch \
--to=andrew@lunn.ch \
--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