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 [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


--
Ben Greear <[EMAIL PROTECTED]> Candela Technologies Inc http://www.candelatech.com


-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to