1 /*
2  * mod_order.c
3  *
4  * Copyright (c) 2001 Dug Song <dugsong@monkey.org>
5  *
6  * $Id: mod_order.c,v 1.9 2002/04/07 22:55:20 dugsong Exp $
7  */
8 
9 #include "config.h"
10 
11 #include <stdio.h>
12 #include <stdlib.h>
13 #include <string.h>
14 
15 #include "mod.h"
16 
17 #define ORDER_RANDOM	1
18 #define ORDER_REVERSE	2
19 
20 struct order_data {
21 	rand_t	*rnd;
22 	int	 type;
23 };
24 
25 void *
order_close(void * d)26 order_close(void *d)
27 {
28 	struct order_data *data = (struct order_data *)d;
29 
30 	if (data != NULL) {
31 		rand_close(data->rnd);
32 		free(data);
33 	}
34 	return (NULL);
35 }
36 
37 void *
order_open(int argc,char * argv[])38 order_open(int argc, char *argv[])
39 {
40 	struct order_data *data;
41 
42 	if (argc < 2)
43 		return (NULL);
44 
45 	if ((data = malloc(sizeof(*data))) == NULL)
46 		return (NULL);
47 
48 	data->rnd = rand_open();
49 
50 	if (strcasecmp(argv[1], "random") == 0) {
51 		data->type = ORDER_RANDOM;
52 	} else if (strcasecmp(argv[1], "reverse") == 0) {
53 		data->type = ORDER_REVERSE;
54 	} else
55 		return (order_close(data));
56 
57 	return (data);
58 }
59 
60 int
order_apply(void * d,struct pktq * pktq)61 order_apply(void *d, struct pktq *pktq)
62 {
63 	struct order_data *data = (struct order_data *)d;
64 
65 	if (data->type == ORDER_RANDOM)
66 		pktq_shuffle(data->rnd, pktq);
67 	else
68 		pktq_reverse(pktq);
69 
70 	return (0);
71 }
72 
73 struct mod mod_order = {
74 	"order",			/* name */
75 	"order random|reverse",		/* usage */
76 	order_open,			/* open */
77 	order_apply,			/* apply */
78 	order_close			/* close */
79 };
80