1 /*
2 * mod_order.c
3 *
4 * Copyright (c) 2001 Dug Song <dugsong@monkey.org>
5 *
6 * $Id$
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