diff options
Diffstat (limited to 'lib/route/sch/dsmark.c')
-rw-r--r-- | lib/route/sch/dsmark.c | 190 |
1 files changed, 75 insertions, 115 deletions
diff --git a/lib/route/sch/dsmark.c b/lib/route/sch/dsmark.c index a2e1628..372d0b6 100644 --- a/lib/route/sch/dsmark.c +++ b/lib/route/sch/dsmark.c @@ -6,13 +6,13 @@ * License as published by the Free Software Foundation version 2.1 * of the License. * - * Copyright (c) 2003-2008 Thomas Graf <tgraf@suug.ch> + * Copyright (c) 2003-2011 Thomas Graf <tgraf@suug.ch> */ /** - * @ingroup qdisc_api - * @ingroup class_api - * @defgroup dsmark Differentiated Services Marker (DSMARK) + * @ingroup qdisc + * @ingroup class + * @defgroup qdisc_dsmark Differentiated Services Marker (DSMARK) * @{ */ @@ -21,9 +21,8 @@ #include <netlink/netlink.h> #include <netlink/utils.h> #include <netlink/route/qdisc.h> -#include <netlink/route/qdisc-modules.h> +#include <netlink/route/tc-api.h> #include <netlink/route/class.h> -#include <netlink/route/class-modules.h> #include <netlink/route/sch/dsmark.h> /** @cond SKIP */ @@ -35,20 +34,6 @@ #define SCH_DSMARK_ATTR_VALUE 0x2 /** @endcond */ -static inline struct rtnl_dsmark_qdisc *dsmark_qdisc(struct rtnl_qdisc *qdisc) -{ - return (struct rtnl_dsmark_qdisc *) qdisc->q_subdata; -} - -static inline struct rtnl_dsmark_qdisc * -dsmark_qdisc_alloc(struct rtnl_qdisc *qdisc) -{ - if (!qdisc->q_subdata) - qdisc->q_subdata = calloc(1, sizeof(struct rtnl_dsmark_qdisc)); - - return dsmark_qdisc(qdisc); -} - static struct nla_policy dsmark_policy[TCA_DSMARK_MAX+1] = { [TCA_DSMARK_INDICES] = { .type = NLA_U16 }, [TCA_DSMARK_DEFAULT_INDEX] = { .type = NLA_U16 }, @@ -57,21 +42,16 @@ static struct nla_policy dsmark_policy[TCA_DSMARK_MAX+1] = { [TCA_DSMARK_MASK] = { .type = NLA_U8 }, }; -static int dsmark_qdisc_msg_parser(struct rtnl_qdisc *qdisc) +static int dsmark_qdisc_msg_parser(struct rtnl_tc *tc, void *data) { - int err; + struct rtnl_dsmark_qdisc *dsmark = data; struct nlattr *tb[TCA_DSMARK_MAX + 1]; - struct rtnl_dsmark_qdisc *dsmark; + int err; - err = tca_parse(tb, TCA_DSMARK_MAX, (struct rtnl_tc *) qdisc, - dsmark_policy); + err = tca_parse(tb, TCA_DSMARK_MAX, tc, dsmark_policy); if (err < 0) return err; - dsmark = dsmark_qdisc_alloc(qdisc); - if (!dsmark) - return -NLE_NOMEM; - if (tb[TCA_DSMARK_INDICES]) { dsmark->qdm_indices = nla_get_u16(tb[TCA_DSMARK_INDICES]); dsmark->qdm_mask |= SCH_DSMARK_ATTR_INDICES; @@ -91,35 +71,16 @@ static int dsmark_qdisc_msg_parser(struct rtnl_qdisc *qdisc) return 0; } -static inline struct rtnl_dsmark_class *dsmark_class(struct rtnl_class *class) +static int dsmark_class_msg_parser(struct rtnl_tc *tc, void *data) { - return (struct rtnl_dsmark_class *) class->c_subdata; -} - -static inline struct rtnl_dsmark_class * -dsmark_class_alloc(struct rtnl_class *class) -{ - if (!class->c_subdata) - class->c_subdata = calloc(1, sizeof(struct rtnl_dsmark_class)); - - return dsmark_class(class); -} - -static int dsmark_class_msg_parser(struct rtnl_class *class) -{ - int err; + struct rtnl_dsmark_class *dsmark = data; struct nlattr *tb[TCA_DSMARK_MAX + 1]; - struct rtnl_dsmark_class *dsmark; + int err; - err = tca_parse(tb, TCA_DSMARK_MAX, (struct rtnl_tc *) class, - dsmark_policy); + err = tca_parse(tb, TCA_DSMARK_MAX, tc, dsmark_policy); if (err < 0) return err; - dsmark = dsmark_class_alloc(class); - if (!dsmark) - return -NLE_NOMEM; - if (tb[TCA_DSMARK_MASK]) { dsmark->cdm_bmask = nla_get_u8(tb[TCA_DSMARK_MASK]); dsmark->cdm_mask |= SCH_DSMARK_ATTR_MASK; @@ -133,19 +94,19 @@ static int dsmark_class_msg_parser(struct rtnl_class *class) return 0; } -static void dsmark_qdisc_dump_line(struct rtnl_qdisc *qdisc, +static void dsmark_qdisc_dump_line(struct rtnl_tc *tc, void *data, struct nl_dump_params *p) { - struct rtnl_dsmark_qdisc *dsmark = dsmark_qdisc(qdisc); + struct rtnl_dsmark_qdisc *dsmark = data; if (dsmark && (dsmark->qdm_mask & SCH_DSMARK_ATTR_INDICES)) nl_dump(p, " indices 0x%04x", dsmark->qdm_indices); } -static void dsmark_qdisc_dump_details(struct rtnl_qdisc *qdisc, +static void dsmark_qdisc_dump_details(struct rtnl_tc *tc, void *data, struct nl_dump_params *p) { - struct rtnl_dsmark_qdisc *dsmark = dsmark_qdisc(qdisc); + struct rtnl_dsmark_qdisc *dsmark = data; if (!dsmark) return; @@ -157,10 +118,10 @@ static void dsmark_qdisc_dump_details(struct rtnl_qdisc *qdisc, nl_dump(p, " set-tc-index"); } -static void dsmark_class_dump_line(struct rtnl_class *class, +static void dsmark_class_dump_line(struct rtnl_tc *tc, void *data, struct nl_dump_params *p) { - struct rtnl_dsmark_class *dsmark = dsmark_class(class); + struct rtnl_dsmark_class *dsmark = data; if (!dsmark) return; @@ -172,17 +133,13 @@ static void dsmark_class_dump_line(struct rtnl_class *class, nl_dump(p, " mask 0x%02x", dsmark->cdm_bmask); } -static struct nl_msg *dsmark_qdisc_get_opts(struct rtnl_qdisc *qdisc) +static int dsmark_qdisc_msg_fill(struct rtnl_tc *tc, void *data, + struct nl_msg *msg) { - struct rtnl_dsmark_qdisc *dsmark = dsmark_qdisc(qdisc); - struct nl_msg *msg; + struct rtnl_dsmark_qdisc *dsmark = data; if (!dsmark) - return NULL; - - msg = nlmsg_alloc(); - if (!msg) - goto nla_put_failure; + return 0; if (dsmark->qdm_mask & SCH_DSMARK_ATTR_INDICES) NLA_PUT_U16(msg, TCA_DSMARK_INDICES, dsmark->qdm_indices); @@ -194,24 +151,19 @@ static struct nl_msg *dsmark_qdisc_get_opts(struct rtnl_qdisc *qdisc) if (dsmark->qdm_mask & SCH_DSMARK_ATTR_SET_TC_INDEX) NLA_PUT_FLAG(msg, TCA_DSMARK_SET_TC_INDEX); - return msg; + return 0; nla_put_failure: - nlmsg_free(msg); - return NULL; + return -NLE_MSGSIZE; } -static struct nl_msg *dsmark_class_get_opts(struct rtnl_class *class) +static int dsmark_class_msg_fill(struct rtnl_tc *tc, void *data, + struct nl_msg *msg) { - struct rtnl_dsmark_class *dsmark = dsmark_class(class); - struct nl_msg *msg; + struct rtnl_dsmark_class *dsmark = data; if (!dsmark) - return NULL; - - msg = nlmsg_alloc(); - if (!msg) - goto nla_put_failure; + return 0; if (dsmark->cdm_mask & SCH_DSMARK_ATTR_MASK) NLA_PUT_U8(msg, TCA_DSMARK_MASK, dsmark->cdm_bmask); @@ -219,11 +171,10 @@ static struct nl_msg *dsmark_class_get_opts(struct rtnl_class *class) if (dsmark->cdm_mask & SCH_DSMARK_ATTR_VALUE) NLA_PUT_U8(msg, TCA_DSMARK_VALUE, dsmark->cdm_value); - return msg; + return 0; nla_put_failure: - nlmsg_free(msg); - return NULL; + return -NLE_MSGSIZE; } /** @@ -241,8 +192,7 @@ int rtnl_class_dsmark_set_bitmask(struct rtnl_class *class, uint8_t mask) { struct rtnl_dsmark_class *dsmark; - dsmark = dsmark_class(class); - if (!dsmark) + if (!(dsmark = rtnl_tc_data(TC_CAST(class)))) return -NLE_NOMEM; dsmark->cdm_bmask = mask; @@ -259,9 +209,11 @@ int rtnl_class_dsmark_set_bitmask(struct rtnl_class *class, uint8_t mask) int rtnl_class_dsmark_get_bitmask(struct rtnl_class *class) { struct rtnl_dsmark_class *dsmark; + + if (!(dsmark = rtnl_tc_data(TC_CAST(class)))) + return -NLE_NOMEM; - dsmark = dsmark_class(class); - if (dsmark && dsmark->cdm_mask & SCH_DSMARK_ATTR_MASK) + if (dsmark->cdm_mask & SCH_DSMARK_ATTR_MASK) return dsmark->cdm_bmask; else return -NLE_NOATTR; @@ -276,9 +228,8 @@ int rtnl_class_dsmark_get_bitmask(struct rtnl_class *class) int rtnl_class_dsmark_set_value(struct rtnl_class *class, uint8_t value) { struct rtnl_dsmark_class *dsmark; - - dsmark = dsmark_class(class); - if (!dsmark) + + if (!(dsmark = rtnl_tc_data(TC_CAST(class)))) return -NLE_NOMEM; dsmark->cdm_value = value; @@ -295,9 +246,11 @@ int rtnl_class_dsmark_set_value(struct rtnl_class *class, uint8_t value) int rtnl_class_dsmark_get_value(struct rtnl_class *class) { struct rtnl_dsmark_class *dsmark; + + if (!(dsmark = rtnl_tc_data(TC_CAST(class)))) + return -NLE_NOMEM; - dsmark = dsmark_class(class); - if (dsmark && dsmark->cdm_mask & SCH_DSMARK_ATTR_VALUE) + if (dsmark->cdm_mask & SCH_DSMARK_ATTR_VALUE) return dsmark->cdm_value; else return -NLE_NOATTR; @@ -319,8 +272,7 @@ int rtnl_qdisc_dsmark_set_indices(struct rtnl_qdisc *qdisc, uint16_t indices) { struct rtnl_dsmark_qdisc *dsmark; - dsmark = dsmark_qdisc(qdisc); - if (!dsmark) + if (!(dsmark = rtnl_tc_data(TC_CAST(qdisc)))) return -NLE_NOMEM; dsmark->qdm_indices = indices; @@ -338,8 +290,10 @@ int rtnl_qdisc_dsmark_get_indices(struct rtnl_qdisc *qdisc) { struct rtnl_dsmark_qdisc *dsmark; - dsmark = dsmark_qdisc(qdisc); - if (dsmark && dsmark->qdm_mask & SCH_DSMARK_ATTR_INDICES) + if (!(dsmark = rtnl_tc_data(TC_CAST(qdisc)))) + return -NLE_NOMEM; + + if (dsmark->qdm_mask & SCH_DSMARK_ATTR_INDICES) return dsmark->qdm_indices; else return -NLE_NOATTR; @@ -356,8 +310,7 @@ int rtnl_qdisc_dsmark_set_default_index(struct rtnl_qdisc *qdisc, { struct rtnl_dsmark_qdisc *dsmark; - dsmark = dsmark_qdisc(qdisc); - if (!dsmark) + if (!(dsmark = rtnl_tc_data(TC_CAST(qdisc)))) return -NLE_NOMEM; dsmark->qdm_default_index = default_index; @@ -375,8 +328,10 @@ int rtnl_qdisc_dsmark_get_default_index(struct rtnl_qdisc *qdisc) { struct rtnl_dsmark_qdisc *dsmark; - dsmark = dsmark_qdisc(qdisc); - if (dsmark && dsmark->qdm_mask & SCH_DSMARK_ATTR_DEFAULT_INDEX) + if (!(dsmark = rtnl_tc_data(TC_CAST(qdisc)))) + return -NLE_NOMEM; + + if (dsmark->qdm_mask & SCH_DSMARK_ATTR_DEFAULT_INDEX) return dsmark->qdm_default_index; else return -NLE_NOATTR; @@ -392,8 +347,7 @@ int rtnl_qdisc_dsmark_set_set_tc_index(struct rtnl_qdisc *qdisc, int flag) { struct rtnl_dsmark_qdisc *dsmark; - dsmark = dsmark_qdisc(qdisc); - if (!dsmark) + if (!(dsmark = rtnl_tc_data(TC_CAST(qdisc)))) return -NLE_NOMEM; dsmark->qdm_set_tc_index = !!flag; @@ -412,8 +366,10 @@ int rtnl_qdisc_dsmark_get_set_tc_index(struct rtnl_qdisc *qdisc) { struct rtnl_dsmark_qdisc *dsmark; - dsmark = dsmark_qdisc(qdisc); - if (dsmark && dsmark->qdm_mask & SCH_DSMARK_ATTR_SET_TC_INDEX) + if (!(dsmark = rtnl_tc_data(TC_CAST(qdisc)))) + return -NLE_NOMEM; + + if (dsmark->qdm_mask & SCH_DSMARK_ATTR_SET_TC_INDEX) return dsmark->qdm_set_tc_index; else return -NLE_NOATTR; @@ -421,33 +377,37 @@ int rtnl_qdisc_dsmark_get_set_tc_index(struct rtnl_qdisc *qdisc) /** @} */ -static struct rtnl_qdisc_ops dsmark_qdisc_ops = { - .qo_kind = "dsmark", - .qo_msg_parser = dsmark_qdisc_msg_parser, - .qo_dump = { +static struct rtnl_tc_ops dsmark_qdisc_ops = { + .to_kind = "dsmark", + .to_type = RTNL_TC_TYPE_QDISC, + .to_size = sizeof(struct rtnl_dsmark_qdisc), + .to_msg_parser = dsmark_qdisc_msg_parser, + .to_dump = { [NL_DUMP_LINE] = dsmark_qdisc_dump_line, [NL_DUMP_DETAILS] = dsmark_qdisc_dump_details, }, - .qo_get_opts = dsmark_qdisc_get_opts, + .to_msg_fill = dsmark_qdisc_msg_fill, }; -static struct rtnl_class_ops dsmark_class_ops = { - .co_kind = "dsmark", - .co_msg_parser = dsmark_class_msg_parser, - .co_dump[NL_DUMP_LINE] = dsmark_class_dump_line, - .co_get_opts = dsmark_class_get_opts, +static struct rtnl_tc_ops dsmark_class_ops = { + .to_kind = "dsmark", + .to_type = RTNL_TC_TYPE_CLASS, + .to_size = sizeof(struct rtnl_dsmark_class), + .to_msg_parser = dsmark_class_msg_parser, + .to_dump[NL_DUMP_LINE] = dsmark_class_dump_line, + .to_msg_fill = dsmark_class_msg_fill, }; static void __init dsmark_init(void) { - rtnl_qdisc_register(&dsmark_qdisc_ops); - rtnl_class_register(&dsmark_class_ops); + rtnl_tc_register(&dsmark_qdisc_ops); + rtnl_tc_register(&dsmark_class_ops); } static void __exit dsmark_exit(void) { - rtnl_qdisc_unregister(&dsmark_qdisc_ops); - rtnl_class_unregister(&dsmark_class_ops); + rtnl_tc_unregister(&dsmark_qdisc_ops); + rtnl_tc_unregister(&dsmark_class_ops); } /** @} */ |