7b2084b8ac81670fcaa02ee410f519dd0f84b70e
1 // L2TPNS Rate Limiting Stuff
2 // $Id: rl.c,v 1.1 2003-12-16 07:07:39 fred_nerk Exp $
14 extern char *radiussecret
;
15 extern radiust
*radius
;
16 extern sessiont
*session
;
17 extern ipt radiusserver
[MAXRADSERVER
]; // radius servers
21 extern u8 numradiusservers
;
23 extern char *tapdevice
;
24 extern tbft
*filter_buckets
;
28 unsigned long rl_rate
= 0;
34 system("tc qdisc del dev " DEVICE
" root");
35 system("tc qdisc add dev " DEVICE
" root handle 1: cbq avpkt 10000 bandwidth 100mbit");
36 system("tc filter del dev " DEVICE
" protocol ip pref 1 fw");
37 system("iptables -t mangle -N throttle 2>&1 > /dev/null");
38 system("iptables -t mangle -F throttle");
39 system("iptables -t mangle -A l2tpns -j throttle");
43 "tc qdisc add dev " DEVICE
" root handle 1: htb default 1",
44 "tc class add dev " DEVICE
" parent 1: classid 1:1 htb rate 100mbit burst 300k",
45 "tc filter del dev " DEVICE
" protocol ip pref 1 fw",
46 "iptables -t mangle -N throttle 2>&1 > /dev/null",
47 "iptables -t mangle -F throttle",
48 "iptables -t mangle -A l2tpns -j throttle",
55 log(2, 0, 0, 0, "Initializing HTB\n");
56 for (i
= 0; commands
[i
] && *commands
[i
]; i
++)
58 log(3, 0, 0, 0, "Running \"%s\"\n", commands
[i
]);
61 log(2, 0, 0, 0, "Done initializing HTB\n");
69 if (!rl_rate
) return 0;
71 if (next_tbf
>= MAXSESSION
) return 0;
73 snprintf(filter_buckets
[t
].handle
, 9, "1:%d0", t
);
76 log(2, 0, 0, 0, "Creating new tbf %s\n", filter_buckets
[t
].handle
);
77 snprintf(cmd
, 2048, "tc class add dev " DEVICE
" parent 1: classid 1:%d cbq bandwidth 100Mbit rate 100Mbit "
78 "weight 1 prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000 bounded isolated",
80 log(3, 0, 0, 0, "%s\n", cmd
);
83 snprintf(cmd
, 2048, "tc qdisc add dev " DEVICE
" parent 1:%d handle %s tbf rate %dkbit buffer 1600 limit 3000",
84 t
, filter_buckets
[t
].handle
, rl_rate
);
85 log(3, 0, 0, 0, "%s\n", cmd
);
88 snprintf(cmd
, 2048, "tc filter add dev " DEVICE
" protocol ip parent 1:0 prio 1 handle %d fw flowid 1:%d",
90 log(3, 0, 0, 0, "%s\n", cmd
);
94 log(2, 0, 0, 0, "Creating new htb %s\n", filter_buckets
[t
].handle
);
95 snprintf(cmd
, 2048, "tc class add dev " DEVICE
" parent 1: classid %s htb rate %lukbit burst 15k",
96 filter_buckets
[t
].handle
, rl_rate
);
97 log(3, 0, 0, 0, "%s\n", cmd
);
100 snprintf(cmd
, 2048, "tc filter add dev " DEVICE
" protocol ip parent 1:0 prio 1 handle %d fw flowid %s",
101 t
, filter_buckets
[t
].handle
);
102 log(3, 0, 0, 0, "%s\n", cmd
);
113 if (!rl_rate
) return 0;
115 for (i
= 1; i
< MAXSESSION
; i
++)
117 if (!filter_buckets
[i
].in_use
&& *filter_buckets
[i
].handle
)
119 filter_buckets
[i
].in_use
= 1;
120 log(2, 0, 0, 0, "Returning tbf %s\n", filter_buckets
[i
].handle
);
125 if (i
) filter_buckets
[i
].in_use
= 1;
129 void rl_done_tbf(u16 t
)
132 if (!rl_rate
) return;
133 log(2, 0, 0, 0, "Freeing up TBF %s\n", filter_buckets
[t
].handle
);
134 filter_buckets
[t
].in_use
= 0;
137 void rl_destroy_tbf(u16 t
)
140 if (!rl_rate
) return;
141 if (filter_buckets
[t
].in_use
)
143 log(0, 0, 0, 0, "Trying to destroy an in-use TBF %s\n", filter_buckets
[t
].handle
);
147 snprintf(cmd
, 2048, "tc qdisc del dev " DEVICE
" handle %s", filter_buckets
[t
].handle
);
151 snprintf(cmd
, 2048, "tc qdisc del dev " DEVICE
" handle %s", filter_buckets
[t
].handle
);
154 system("iptables -t mangle -D l2tpns -j throttle");
155 system("iptables -t mangle -X throttle");
156 memset(filter_buckets
[t
].handle
, 0, sizeof(filter_buckets
[t
].handle
));