summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Kozlov <xeb@mail.ru>2014-11-22 08:51:14 +0300
committerDmitry Kozlov <xeb@mail.ru>2014-11-22 08:51:14 +0300
commit830c399cf126f6bf1e8dfa1ad919a3ce8e346c5d (patch)
treee2081d727d9a1d21b1c721950c32f54a4eefd31d
parent731b6b13149ab333158aadfd3c7b841f5c1fc3b4 (diff)
downloadaccel-ppp-830c399cf126f6bf1e8dfa1ad919a3ce8e346c5d.tar.gz
accel-ppp-830c399cf126f6bf1e8dfa1ad919a3ce8e346c5d.zip
shaper: fixed installing fw filter
-rw-r--r--accel-pppd/shaper/limiter.c86
-rw-r--r--accel-pppd/shaper/shaper.c68
2 files changed, 76 insertions, 78 deletions
diff --git a/accel-pppd/shaper/limiter.c b/accel-pppd/shaper/limiter.c
index 2398bfea..b0525cb8 100644
--- a/accel-pppd/shaper/limiter.c
+++ b/accel-pppd/shaper/limiter.c
@@ -59,7 +59,7 @@ static int qdisc_htb_root(struct qdisc_opt *qopt, struct nlmsghdr *n)
opt.rate2quantum = qopt->quantum;
opt.version = 3;
opt.defcls = qopt->defcls;
-
+
tail = NLMSG_TAIL(n);
addattr_l(n, TCA_BUF_MAX, TCA_OPTIONS, NULL, 0);
addattr_l(n, TCA_BUF_MAX, TCA_HTB_INIT, &opt, NLMSG_ALIGN(sizeof(opt)));
@@ -131,9 +131,9 @@ int tc_qdisc_modify(struct rtnl_handle *rth, int ifindex, int cmd, unsigned flag
if (opt->handle)
req.t.tcm_handle = opt->handle;
-
+
req.t.tcm_parent = opt->parent;
-
+
if (opt->kind)
addattr_l(&req.n, sizeof(req), TCA_KIND, opt->kind, strlen(opt->kind) + 1);
@@ -171,7 +171,7 @@ static int install_htb(struct rtnl_handle *rth, int ifindex, int rate, int burst
.defcls = 1,
.qdisc = qdisc_htb_root,
};
-
+
struct qdisc_opt opt2 = {
.kind = "htb",
.handle = 0x00010001,
@@ -185,10 +185,10 @@ static int install_htb(struct rtnl_handle *rth, int ifindex, int rate, int burst
if (tc_qdisc_modify(rth, ifindex, RTM_NEWQDISC, NLM_F_EXCL|NLM_F_CREATE, &opt1))
return -1;
-
+
if (tc_qdisc_modify(rth, ifindex, RTM_NEWTCLASS, NLM_F_EXCL|NLM_F_CREATE, &opt2))
return -1;
-
+
return 0;
}
@@ -211,7 +211,7 @@ static int install_police(struct rtnl_handle *rth, int ifindex, int rate, int bu
.handle = 0xffff0000,
.parent = TC_H_INGRESS,
};
-
+
struct sel {
struct tc_u32_sel sel;
struct tc_u32_key key;
@@ -220,7 +220,7 @@ static int install_police(struct rtnl_handle *rth, int ifindex, int rate, int bu
.sel.flags = TC_U32_TERMINAL,
.key.off = 12,
};
-
+
struct tc_police police = {
.action = TC_POLICE_SHOT,
.rate.rate = rate,
@@ -231,7 +231,7 @@ static int install_police(struct rtnl_handle *rth, int ifindex, int rate, int bu
if (tc_qdisc_modify(rth, ifindex, RTM_NEWQDISC, NLM_F_EXCL|NLM_F_CREATE, &opt1))
return -1;
-
+
if (tc_calc_rtable(&police.rate, rtab, Rcell_log, mtu, linklayer) < 0) {
log_ppp_error("shaper: failed to calculate ceil rate table.\n");
return -1;
@@ -246,9 +246,9 @@ static int install_police(struct rtnl_handle *rth, int ifindex, int rate, int bu
req.t.tcm_ifindex = ifindex;
req.t.tcm_handle = 1;
req.t.tcm_parent = 0xffff0000;
-
+
req.t.tcm_info = TC_H_MAKE(100 << 16, ntohs(ETH_P_IP));
-
+
addattr_l(&req.n, sizeof(req), TCA_KIND, "u32", 4);
tail = NLMSG_TAIL(&req.n);
@@ -266,15 +266,15 @@ static int install_police(struct rtnl_handle *rth, int ifindex, int rate, int bu
addattr_l(&req.n, MAX_MSG, TCA_POLICE_TBF, &police, sizeof(police));
addattr_l(&req.n, MAX_MSG, TCA_POLICE_RATE, rtab, 1024);
tail3->rta_len = (void *)NLMSG_TAIL(&req.n) - (void *)tail3;
-
+
tail2->rta_len = (void *)NLMSG_TAIL(&req.n) - (void *)tail2;
-
+
tail1->rta_len = (void *)NLMSG_TAIL(&req.n) - (void *)tail1;
addattr_l(&req.n, MAX_MSG, TCA_U32_CLASSID, &flowid, 4);
addattr_l(&req.n, MAX_MSG, TCA_U32_SEL, &sel, sizeof(sel));
tail->rta_len = (void *)NLMSG_TAIL(&req.n) - (void *)tail;
-
+
if (rtnl_talk(rth, &req.n, 0, 0, NULL, NULL, NULL, 0) < 0)
return -1;
@@ -300,13 +300,13 @@ static int install_htb_ifb(struct rtnl_handle *rth, int ifindex, __u32 priority,
.quantum = conf_quantum,
.qdisc = qdisc_htb_class,
};
-
+
struct qdisc_opt opt2 = {
.kind = "ingress",
.handle = 0xffff0000,
.parent = TC_H_INGRESS,
};
-
+
struct sel {
struct tc_u32_sel sel;
struct tc_u32_key key;
@@ -315,11 +315,11 @@ static int install_htb_ifb(struct rtnl_handle *rth, int ifindex, __u32 priority,
.sel.flags = TC_U32_TERMINAL,
.key.off = 0,
};
-
+
struct tc_skbedit p1 = {
.action = TC_ACT_PIPE,
};
-
+
struct tc_mirred p2 = {
.eaction = TCA_EGRESS_REDIR,
.action = TC_ACT_STOLEN,
@@ -328,10 +328,10 @@ static int install_htb_ifb(struct rtnl_handle *rth, int ifindex, __u32 priority,
if (tc_qdisc_modify(rth, conf_ifb_ifindex, RTM_NEWTCLASS, NLM_F_EXCL|NLM_F_CREATE, &opt1))
return -1;
-
+
if (tc_qdisc_modify(rth, ifindex, RTM_NEWQDISC, NLM_F_EXCL|NLM_F_CREATE, &opt2))
return -1;
-
+
memset(&req, 0, sizeof(req));
req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct tcmsg));
@@ -341,10 +341,10 @@ static int install_htb_ifb(struct rtnl_handle *rth, int ifindex, __u32 priority,
req.t.tcm_ifindex = ifindex;
req.t.tcm_handle = 1;
req.t.tcm_parent = 0xffff0000;
-
+
req.t.tcm_info = TC_H_MAKE(100 << 16, ntohs(ETH_P_IP));
-
+
addattr_l(&req.n, sizeof(req), TCA_KIND, "u32", 4);
tail = NLMSG_TAIL(&req.n);
@@ -353,7 +353,7 @@ static int install_htb_ifb(struct rtnl_handle *rth, int ifindex, __u32 priority,
tail1 = NLMSG_TAIL(&req.n);
addattr_l(&req.n, MAX_MSG, TCA_U32_ACT, NULL, 0);
- // action skbedit priority X pipe
+ // action skbedit priority X pipe
tail2 = NLMSG_TAIL(&req.n);
addattr_l(&req.n, MAX_MSG, 1, NULL, 0);
addattr_l(&req.n, MAX_MSG, TCA_ACT_KIND, "skbedit", 8);
@@ -363,9 +363,9 @@ static int install_htb_ifb(struct rtnl_handle *rth, int ifindex, __u32 priority,
addattr_l(&req.n, MAX_MSG, TCA_SKBEDIT_PARMS, &p1, sizeof(p1));
addattr_l(&req.n, MAX_MSG, TCA_SKBEDIT_PRIORITY, &priority, sizeof(priority));
tail3->rta_len = (void *)NLMSG_TAIL(&req.n) - (void *)tail3;
-
+
tail2->rta_len = (void *)NLMSG_TAIL(&req.n) - (void *)tail2;
-
+
tail1->rta_len = (void *)NLMSG_TAIL(&req.n) - (void *)tail1;
// action mirred egress redirect dev ifb0
@@ -377,16 +377,16 @@ static int install_htb_ifb(struct rtnl_handle *rth, int ifindex, __u32 priority,
addattr_l(&req.n, MAX_MSG, TCA_ACT_OPTIONS, NULL, 0);
addattr_l(&req.n, MAX_MSG, TCA_MIRRED_PARMS, &p2, sizeof(p2));
tail3->rta_len = (void *)NLMSG_TAIL(&req.n) - (void *)tail3;
-
+
tail2->rta_len = (void *)NLMSG_TAIL(&req.n) - (void *)tail2;
-
+
tail1->rta_len = (void *)NLMSG_TAIL(&req.n) - (void *)tail1;
//
addattr32(&req.n, TCA_BUF_MAX, TCA_U32_CLASSID, 1);
addattr_l(&req.n, MAX_MSG, TCA_U32_SEL, &sel, sizeof(sel));
tail->rta_len = (void *)NLMSG_TAIL(&req.n) - (void *)tail;
-
+
if (rtnl_talk(rth, &req.n, 0, 0, NULL, NULL, NULL, 0) < 0)
return -1;
@@ -410,14 +410,14 @@ static int install_fwmark(struct rtnl_handle *rth, int ifindex, int parent)
req.n.nlmsg_type = RTM_NEWTFILTER;
req.t.tcm_family = AF_UNSPEC;
req.t.tcm_ifindex = ifindex;
- req.t.tcm_handle = 1;
+ req.t.tcm_handle = conf_fwmark;
req.t.tcm_parent = parent;
req.t.tcm_info = TC_H_MAKE(90 << 16, ntohs(ETH_P_IP));
-
+
addattr_l(&req.n, sizeof(req), TCA_KIND, "fw", 3);
tail = NLMSG_TAIL(&req.n);
addattr_l(&req.n, TCA_BUF_MAX, TCA_OPTIONS, NULL, 0);
- addattr32(&req.n, TCA_BUF_MAX, TCA_FW_CLASSID, TC_H_MAKE(conf_fwmark << 16, 0));
+ addattr32(&req.n, TCA_BUF_MAX, TCA_FW_CLASSID, TC_H_MAKE(1 << 16, 0));
tail->rta_len = (void *)NLMSG_TAIL(&req.n) - (void *)tail;
return rtnl_talk(rth, &req.n, 0, 0, NULL, NULL, NULL, 0);
}
@@ -428,7 +428,7 @@ static int remove_root(struct rtnl_handle *rth, int ifindex)
.handle = 0x00010000,
.parent = TC_H_ROOT,
};
-
+
return tc_qdisc_modify(rth, ifindex, RTM_DELQDISC, 0, &opt);
}
@@ -438,7 +438,7 @@ static int remove_ingress(struct rtnl_handle *rth, int ifindex)
.handle = 0xffff0000,
.parent = TC_H_INGRESS,
};
-
+
return tc_qdisc_modify(rth, ifindex, RTM_DELQDISC, 0, &opt);
}
@@ -448,7 +448,7 @@ static int remove_htb_ifb(struct rtnl_handle *rth, int ifindex, int priority)
.handle = 0x00010001 + priority,
.parent = 0x00010000,
};
-
+
return tc_qdisc_modify(rth, conf_ifb_ifindex, RTM_DELTCLASS, 0, &opt);
}
@@ -456,7 +456,7 @@ int install_limiter(struct ap_session *ses, int down_speed, int down_burst, int
{
struct rtnl_handle rth;
int r;
-
+
if (rtnl_open(&rth, 0)) {
log_ppp_error("shaper: cannot open rtnetlink\n");
return -1;
@@ -483,11 +483,9 @@ int install_limiter(struct ap_session *ses, int down_speed, int down_burst, int
r = install_leaf_qdisc(&rth, conf_ifb_ifindex, 0x00010001 + ses->unit_idx + 1, (1 + ses->unit_idx + 1) << 16);
}
- if (conf_fwmark) {
+ if (conf_fwmark)
install_fwmark(&rth, ses->ifindex, 0x00010000);
- install_fwmark(&rth, ses->ifindex, TC_H_INGRESS);
- }
-
+
rtnl_close(&rth);
return r;
@@ -504,7 +502,7 @@ int remove_limiter(struct ap_session *ses)
remove_root(&rth, ses->ifindex);
remove_ingress(&rth, ses->ifindex);
-
+
if (conf_up_limiter == LIM_HTB)
remove_htb_ifb(&rth, ses->ifindex, ses->unit_idx + 1);
@@ -525,7 +523,7 @@ int init_ifb(const char *name)
struct tcmsg t;
char buf[TCA_BUF_MAX];
} req;
-
+
struct qdisc_opt opt = {
.kind = "htb",
.handle = 0x00010000,
@@ -536,7 +534,7 @@ int init_ifb(const char *name)
if (system("modprobe -q ifb"))
log_warn("failed to load ifb kernel module\n");
-
+
memset(&ifr, 0, sizeof(ifr));
strcpy(ifr.ifr_name, name);
@@ -546,7 +544,7 @@ int init_ifb(const char *name)
}
conf_ifb_ifindex = ifr.ifr_ifindex;
-
+
ifr.ifr_flags |= IFF_UP;
if (ioctl(sock_fd, SIOCSIFFLAGS, &ifr)) {
@@ -575,7 +573,7 @@ int init_ifb(const char *name)
req.t.tcm_handle = 1;
req.t.tcm_parent = 0x00010000;
req.t.tcm_info = TC_H_MAKE(100 << 16, ntohs(ETH_P_IP));
-
+
addattr_l(&req.n, sizeof(req), TCA_KIND, "flow", 5);
tail = NLMSG_TAIL(&req.n);
diff --git a/accel-pppd/shaper/shaper.c b/accel-pppd/shaper/shaper.c
index fa89e62b..862267a4 100644
--- a/accel-pppd/shaper/shaper.c
+++ b/accel-pppd/shaper/shaper.c
@@ -155,7 +155,7 @@ static void parse_string(const char *str, int dir, int *speed, int *burst, int *
}
return;
}
-
+
str1 = strstr(str, "rate-limit output");
if (str1) {
val = sscanf(str1, "rate-limit output %u %u %u", &n1, &n2, &n3);
@@ -175,7 +175,7 @@ static void parse_string(const char *str, int dir, int *speed, int *burst, int *
}
return;
}
-
+
str1 = strstr(str, "rate-limit input");
if (str1) {
val = sscanf(str1, "rate-limit input %u %u %u", &n1, &n2, &n3);
@@ -212,7 +212,7 @@ static void parse_string(const char *str, int dir, int *speed, int *burst, int *
static struct time_range_pd_t *get_tr_pd(struct shaper_pd_t *pd, int id)
{
struct time_range_pd_t *tr_pd;
-
+
list_for_each_entry(tr_pd, &pd->tr_list, entry) {
if (tr_pd->id == id)
return tr_pd;
@@ -224,7 +224,7 @@ static struct time_range_pd_t *get_tr_pd(struct shaper_pd_t *pd, int id)
if (id == time_range_id || id == 0)
pd->cur_tr = tr_pd;
-
+
list_add_tail(&tr_pd->entry, &pd->tr_list);
return tr_pd;
@@ -304,13 +304,13 @@ static void ev_radius_coa(struct ev_radius_t *ev)
ev->res = -1;
return;
}
-
+
clear_tr_pd(pd);
check_radius_attrs(pd, ev->request);
-
+
if (pd->temp_down_speed || pd->temp_up_speed)
return;
-
+
if (!pd->cur_tr) {
if (pd->down_speed || pd->up_speed) {
pd->down_speed = 0;
@@ -330,7 +330,7 @@ static void ev_radius_coa(struct ev_radius_t *ev)
ev->res = -1;
return;
}
-
+
if (pd->down_speed > 0 || pd->up_speed > 0) {
if (install_limiter(ev->ses, pd->cur_tr->down_speed, pd->cur_tr->down_burst, pd->cur_tr->up_speed, pd->cur_tr->up_burst)) {
ev->res= -1;
@@ -396,10 +396,10 @@ static void ev_ppp_pre_up(struct ap_session *ses)
int down_speed, down_burst;
int up_speed, up_burst;
struct shaper_pd_t *pd = find_pd(ses, 1);
-
+
if (!pd)
return;
-
+
if (temp_down_speed || temp_up_speed) {
pd->temp_down_speed = temp_down_speed;
pd->temp_up_speed = temp_up_speed;
@@ -476,7 +476,7 @@ static void shaper_change(struct shaper_pd_t *pd)
pd->down_speed = 0;
pd->up_speed = 0;
}
-
+
out:
if (__sync_sub_and_fetch(&pd->refs, 1) == 0) {
clear_tr_pd(pd);
@@ -499,10 +499,10 @@ static int shaper_change_exec(const char *cmd, char * const *f, int f_cnt, void
//if (down_speed == 0 || up_speed == 0)
// return CLI_CMD_INVAL;
-
+
if (!strcmp(f[2], "all"))
all = 1;
-
+
if (f_cnt == 5) {
if (strcmp(f[4], "temp"))
return CLI_CMD_SYNTAX;
@@ -583,12 +583,12 @@ static int shaper_restore_exec(const char *cmd, char * const *f, int f_cnt, void
if (f_cnt != 3)
return CLI_CMD_SYNTAX;
-
+
if (strcmp(f[2], "all"))
all = 0;
else
all = 1;
-
+
pthread_rwlock_rdlock(&shaper_lock);
if (all) {
temp_down_speed = 0;
@@ -612,7 +612,7 @@ static int shaper_restore_exec(const char *cmd, char * const *f, int f_cnt, void
if (!all && !found)
cli_send(cli, "not found\r\n");
-
+
return CLI_CMD_OK;
}
@@ -665,7 +665,7 @@ static void update_shaper_tr(struct shaper_pd_t *pd)
goto out;
remove_limiter(pd->ses);
}
-
+
if (pd->cur_tr && (pd->cur_tr->down_speed || pd->cur_tr->up_speed)) {
pd->down_speed = pd->cur_tr->down_speed;
pd->up_speed = pd->cur_tr->up_speed;
@@ -707,7 +707,7 @@ static void time_range_end_timer(struct triton_timer_t *t)
struct shaper_pd_t *pd;
time_range_id = 0;
-
+
log_debug("shaper: time_range_end_timer\n");
pthread_rwlock_rdlock(&shaper_lock);
@@ -730,7 +730,7 @@ static struct time_range_t *parse_range(time_t t, const char *val)
return NULL;
if (id <= 0)
return NULL;
-
+
localtime_r(&t, &begin_tm);
begin_tm.tm_sec = 0;
end_tm = begin_tm;
@@ -738,11 +738,11 @@ static struct time_range_t *parse_range(time_t t, const char *val)
endptr = strptime(endptr + 1, "%H:%M", &begin_tm);
if (*endptr != '-')
return NULL;
-
+
endptr = strptime(endptr + 1, "%H:%M", &end_tm);
if (*endptr)
return NULL;
-
+
r = _malloc(sizeof(*r));
memset(r, 0, sizeof(*r));
@@ -766,7 +766,7 @@ static void load_time_ranges(void)
if (!s)
return;
-
+
time(&ts);
while (!list_empty(&time_range_list)) {
@@ -813,7 +813,7 @@ static void load_time_ranges(void)
r->end.expire_tv.tv_sec += 24 * 60 * 60;
triton_timer_add(&shaper_ctx, &r->begin, 1);
-
+
if (r->end.period)
triton_timer_add(&shaper_ctx, &r->end, 1);
}
@@ -851,7 +851,7 @@ static int parse_vendor_opt(const char *opt)
vendor = rad_dict_find_vendor_name(opt);
if (vendor)
return vendor->id;
-
+
return atoi(opt);
}
#endif
@@ -875,7 +875,7 @@ static void load_config(void)
opt = conf_get_opt("shaper", "attr-down");
if (opt)
conf_attr_down = parse_attr_opt(opt);
-
+
opt = conf_get_opt("shaper", "attr-up");
if (opt)
conf_attr_up = parse_attr_opt(opt);
@@ -886,13 +886,13 @@ static void load_config(void)
}
}
#endif
-
+
opt = conf_get_opt("shaper", "burst-factor");
if (opt) {
conf_down_burst_factor = strtod(opt, NULL);
conf_up_burst_factor = conf_down_burst_factor * 10;
}
-
+
opt = conf_get_opt("shaper", "down-burst-factor");
if (opt)
conf_down_burst_factor = strtod(opt, NULL);
@@ -926,13 +926,13 @@ static void load_config(void)
conf_quantum = atoi(opt);
else
conf_quantum = 0;
-
+
opt = conf_get_opt("shaper", "moderate-quantum");
if (opt)
conf_moderate_quantum = atoi(opt);
else
conf_moderate_quantum = 0;
-
+
opt = conf_get_opt("shaper", "cburst");
if (opt && atoi(opt) >= 0)
conf_cburst = atoi(opt);
@@ -972,19 +972,19 @@ static void load_config(void)
opt = conf_get_opt("shaper", "verbose");
if (opt && atoi(opt) >= 0)
conf_verbose = atoi(opt) > 0;
-
+
opt = conf_get_opt("shaper", "rate-multiplier");
if (opt && atof(opt) > 0)
conf_multiplier = atof(opt);
else
conf_multiplier = 1;
-
+
opt = conf_get_opt("shaper", "fwmark");
if (opt)
- conf_fwmark = atof(opt);
+ conf_fwmark = atoi(opt);
else
conf_fwmark = 0;
-
+
triton_context_call(&shaper_ctx, (triton_event_func)load_time_ranges, NULL);
}
@@ -993,7 +993,7 @@ static void init(void)
const char *opt;
tc_core_init();
-
+
opt = conf_get_opt("shaper", "ifb");
if (opt && init_ifb(opt))
_exit(0);