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