e6edd98cb20e79bdec9d22e7389fda6903d30d1b
[dragonfly.git] / lib / libipfw2 / dummynet / ipfw2_dummynet.c
1 /*
2  * Copyright (c) 2014 The DragonFly Project.  All rights reserved.
3  *
4  * This code is derived from software contributed to The DragonFly Project
5  * by Bill Yuan <bycn82@gmail.com>
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in
15  *    the documentation and/or other materials provided with the
16  *    distribution.
17  * 3. Neither the name of The DragonFly Project nor the names of its
18  *    contributors may be used to endorse or promote products derived
19  *    from this software without specific, prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
25  * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
27  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
29  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
30  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
31  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32  * SUCH DAMAGE.
33  */
34
35 #include <stdio.h>
36 #include <stdlib.h>
37
38 #include <net/if.h>
39 #include <net/route.h>
40 #include <net/pfil.h>
41 #include <netinet/in.h>
42
43 #include "../../../sys/net/ipfw2/ip_fw3.h"
44 #include "../../../sbin/ipfw2/ipfw.h"
45 #include "ipfw2_dummynet.h"
46
47 void
48 parse_pipe(ipfw_insn **cmd, int *ac, char **av[])
49 {
50         NEXT_ARG1;
51         (*cmd)->opcode = O_DUMMYNET_PIPE;
52         (*cmd)->module = MODULE_DUMMYNET_ID;
53         (*cmd)->len = ((*cmd)->len&(F_NOT|F_OR))|LEN_OF_IPFWINSN;
54         (*cmd)->arg1 = strtoul(**av, NULL, 10);
55         NEXT_ARG1;
56 }
57
58 void
59 parse_queue(ipfw_insn **cmd, int *ac, char **av[])
60 {
61         NEXT_ARG1;
62         (*cmd)->opcode = O_DUMMYNET_QUEUE;
63         (*cmd)->module = MODULE_DUMMYNET_ID;
64         (*cmd)->len = ((*cmd)->len&(F_NOT|F_OR))|LEN_OF_IPFWINSN;
65         (*cmd)->arg1 = strtoul(**av, NULL, 10);
66         NEXT_ARG1;
67 }
68
69 void
70 show_pipe(ipfw_insn *cmd)
71 {
72         printf(" pipe %u", cmd->arg1);
73 }
74
75 void
76 show_queue(ipfw_insn *cmd)
77 {
78         printf(" queue %u", cmd->arg1);
79 }
80
81 void
82 load_module(register_func function, register_keyword keyword)
83 {
84         keyword(MODULE_DUMMYNET_ID,O_DUMMYNET_PIPE,"pipe", IPFW_KEYWORD_TYPE_ACTION);
85         function(MODULE_DUMMYNET_ID,O_DUMMYNET_PIPE,
86                         (parser_func)parse_pipe, (shower_func)show_pipe);
87
88         keyword(MODULE_DUMMYNET_ID,O_DUMMYNET_QUEUE,"queue", IPFW_KEYWORD_TYPE_ACTION);
89         function(MODULE_DUMMYNET_ID,O_DUMMYNET_QUEUE,
90                         (parser_func)parse_queue, (shower_func)show_queue);
91 }
92