/* packet_dropper.c
*
* This program provides an example of how to install a module into a
* slightly modified kernel that will randomly drop packets for a specific
* (hard-coded) host.
*
* See linux/drivers/char/random.c for details of get_random_bytes().
*
* Usage (must be root to use):
* /sbin/insmod packet_dropper
* /sbin/rmmod packet_dropper
*/
#define MODULE
#define MAX_UNSIGNED_SHORT 65535
#include
#include /* for struct sk_buff */
#include /* for struct iphdr */
extern int (*xmit_test_function)(struct sk_buff *); /* calling function */
extern void get_random_bytes(void *buf, int nbytes); /* random function */
//unsigned short cutoff; /* drop cutoff */
float rate = 0.15; /* drop percentage */
static int dropPoint = -1;
static unsigned int count = 0;
//__u32 target = 0x6A08B184; /* hard coded target */
__u32 target = 0x0202A8C0; /* dst address 192.168.2.2 */
/************************************************************ packet_dropper
* this is what dev_queue_xmit will call while this module is installed */
int packet_dropper(struct sk_buff *skb) {
//unsigned short t;
if (skb->nh.iph->daddr == target) {
/* the get_random_bytes is too inefficient */
/* the following code is modified by lin : begin (*/
//get_random_bytes(&t,2);
//if (t <= cutoff) return 1; /* drop this packet */
count ++;
if ( count == dropPoint )
{
count = 0;
return 1;
}
/* modified by lin : end ) */
}
return 0; /* continue with normal routine */
} /* packet_dropper */
/*************************************************************** init_module
* this function replaces the null pointer with a real one */
int init_module() {
EXPORT_NO_SYMBOLS;
//cutoff = rate * MAX_UNSIGNED_SHORT;
/* added by lin begin ( */
if ( rate == 0.0 )
dropPoint = -1;
else
dropPoint = (int) ( 1/rate );
/* added by lin end ) */
xmit_test_function = packet_dropper;
//printk("<1> packet_dropper: now dropping packets below %u\n",cutoff);
printk("<1> packet_dropper: now dropping one out of every %u packets\n",
dropPoint );
return 0;
} /* init_module */
/************************************************************ cleanup_module
* this function resets the function pointer back to null */
void cleanup_module() {
xmit_test_function = 0;
printk("<1> packet_dropper: uninstalled\n");
} /* cleanup_module */