From: Ben Greear <greearb@candelatech.com>
To: hadi@cyberus.ca
Cc: Robert Olsson <Robert.Olsson@data.slu.se>,
NetDev <netdev@vger.kernel.org>
Subject: Re: pktgen patch available for perusal.
Date: Sat, 04 Nov 2006 09:29:04 -0800 [thread overview]
Message-ID: <454CCDE0.5040109@candelatech.com> (raw)
In-Reply-To: <1162643532.5166.34.camel@jzny2>
jamal wrote:
> On Wed, 2006-01-11 at 11:11 -0800, Ben Greear wrote:
>
>
>> I'd be thrilled to have the receive logic go into pktgen, even if
>> it was #if 0 with a comment
>> showing how to patch dev.c to get it working. It would make my
>> out-of-tree patch smaller
>> and should help others who are doing research and driver development...
>>
>>
>
> I use pktgen extensively these days for ipsec testing. I also record
> stats for pkts i receive using a tc action drop. Very simple and works
> great.
> Ben, you keep insisting on doing this hook (every 3 months) because you
> dont want to invest time to do it with netlink (I thought you sold this
> as part of your product - the investment of your time is really not that
> high). If you tell me what the packet trigger is, I will send you a
> script ;->
>
Please do send a script. I match based on this method below. Probably
you only
need the part that checks for the MAGIC, the rest can be in a method
called after
you match in your script?
/* Returns < 0 if the skb is not a pktgen buffer. */
int pktgen_receive(struct sk_buff* skb) {
/* See if we have a pktgen packet */
/* TODO: Add support for detecting IPv6, TCP packets too. This
will only
* catch UDP at the moment. --Ben
*/
/*printk("pktgen-rcv, skb->len: %d\n", skb->len);*/
if ((skb->len >= (20 + 8 + sizeof(struct pktgen_hdr))) &&
(skb->protocol == __constant_htons(ETH_P_IP))) {
struct pktgen_hdr* pgh;
/* It's IP, and long enough, lets check the magic number.
* TODO: This is a hack not always guaranteed to catch
the right
* packets.
*/
/*printk("Length & protocol passed, skb->data: %p, raw: %p\n",
skb->data, skb->h.raw);*/
pgh = (struct pktgen_hdr*)(skb->data + 20 + 8);
/*
tmp = (char*)(skb->data);
for (i = 0; i<90; i++) {
printk("%02hx ", tmp[i]);
if (((i + 1) % 15) == 0) {
printk("\n");
}
}
printk("\n");
*/
if (pgh->pgh_magic == __constant_ntohl(PKTGEN_MAGIC)) {
struct net_device* dev = skb->dev;
struct pktgen_dev* pkt_dev;
__u32 seq = ntohl(pgh->seq_num);
// TODO: Need lock..maybe
pkt_dev = dev->pkt_dev;
if (!pkt_dev) {
return -1;
}
pkt_dev->pkts_rcvd++;
pkt_dev->bytes_rcvd += ((skb->tail -
skb->mac.raw) + 4); /* +4 for the checksum */
/* Check for out-of-sequence packets */
if (pkt_dev->last_seq_rcvd == seq) {
pkt_dev->dup_rcvd++;
pkt_dev->dup_since_incr++;
}
else {
__s64 rx;
__s64 tx;
struct timeval txtv;
if (skb->tstamp.off_sec || skb->tstamp.off_usec) {
skb_get_timestamp(skb, &txtv);
}
else {
do_gettimeofday(&txtv);
skb_set_timestamp(skb, &txtv);
}
rx = tv_to_us(&txtv);
txtv.tv_usec = ntohl(pgh->tv_usec);
txtv.tv_sec = ntohl(pgh->tv_sec);
tx = tv_to_us(&txtv);
record_latency(pkt_dev, rx - tx);
if ((pkt_dev->last_seq_rcvd + 1) == seq) {
if ((pkt_dev->peer_clone_skb > 1) &&
(pkt_dev->peer_clone_skb >
(pkt_dev->dup_since_incr + 1))) {
pkt_dev->seq_gap_rcvd +=
(pkt_dev->peer_clone_skb -
pkt_dev->dup_since_incr - 1);
}
/* Great, in order...all is well */
}
else if (pkt_dev->last_seq_rcvd < seq) {
/* sequence gap, means we
dropped a pkt most likely */
if (pkt_dev->peer_clone_skb > 1) {
/* We dropped more than
one sequence number's worth,
* and if we're using
clone_skb, then this is quite
* a few. This number
still will not be exact, but
* it will be closer.
*/
pkt_dev->seq_gap_rcvd +=
(((seq - pkt_dev->last_seq_rcvd) *
pkt_dev->peer_clone_skb) -
pkt_dev->dup_since_incr);
}
else {
pkt_dev->seq_gap_rcvd +=
(seq - pkt_dev->last_seq_rcvd - 1);
}
}
else {
pkt_dev->ooo_rcvd++; /*
out-of-order */
}
pkt_dev->dup_since_incr = 0;
}
pkt_dev->last_seq_rcvd = seq;
kfree_skb(skb);
if (debug > 1) {
printk("done with pktgen_receive, free'd
pkt\n");
}
return 0;
}
}
return -1; /* Let another protocol handle it, it's not for us! */
}/* pktgen_receive */
> Robert, I have started writing some generic netlink messaging to replace
> the /proc that i will send your way. I need to get consensus on some
> tunnel-mode IPSEC patches first then i will send the about three
> patchsets your way (to replace the old ones i sent earlier).
>
> cheers,
> jamal
>
> -
> To unsubscribe from this list: send the line "unsubscribe netdev" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
--
Ben Greear <greearb@candelatech.com>
Candela Technologies Inc http://www.candelatech.com
next prev parent reply other threads:[~2006-11-04 17:27 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-10-30 23:47 pktgen patch available for perusal Ben Greear
2006-11-01 17:14 ` Robert Olsson
2006-11-01 19:11 ` Ben Greear
2006-11-03 11:13 ` Robert Olsson
2006-11-03 16:34 ` Ben Greear
2006-11-03 20:24 ` Robert Olsson
2006-11-03 20:41 ` Ben Greear
2006-11-04 12:32 ` jamal
2006-11-04 17:29 ` Ben Greear [this message]
2006-11-04 18:10 ` jamal
2006-11-04 19:12 ` Ben Greear
2006-11-06 14:06 ` Robert Olsson
2006-11-06 14:14 ` Robert Olsson
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=454CCDE0.5040109@candelatech.com \
--to=greearb@candelatech.com \
--cc=Robert.Olsson@data.slu.se \
--cc=hadi@cyberus.ca \
--cc=netdev@vger.kernel.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.