static int qdisc_request_update(struct nl_cache *c, struct nl_sock *sk) { struct tcmsg tchdr = { .tcm_family = AF_UNSPEC, .tcm_ifindex = c->c_iarg1, }; return nl_send_simple(sk, RTM_GETQDISC, NLM_F_DUMP, &tchdr, sizeof(tchdr)); } /** * @name QDisc Addition * @{ */ static int qdisc_build(struct rtnl_qdisc *qdisc, int type, int flags, struct nl_msg **result) { return rtnl_tc_msg_build(TC_CAST(qdisc), type, flags, result); #if 0 /* Some qdiscs don't accept properly nested messages (e.g. netem). To * accomodate for this, they can complete the message themselves. */ else if (qops && qops->qo_build_msg) { err = qops->qo_build_msg(qdisc, *result); if (err < 0) goto errout; } #endif }
static int build_qdisc_msg(struct rtnl_qdisc *qdisc, int type, int flags, struct nl_msg **result) { if (!(qdisc->ce_mask & TCA_ATTR_IFINDEX)) { APPBUG("ifindex must be specified"); return -NLE_MISSING_ATTR; } return rtnl_tc_msg_build(TC_CAST(qdisc), type, flags, result); }
static int cls_build(struct rtnl_cls *cls, int type, int flags, struct nl_msg **result) { int err, prio, proto; struct tcmsg *tchdr; err = rtnl_tc_msg_build(TC_CAST(cls), type, flags, result); if (err < 0) return err; tchdr = nlmsg_data(nlmsg_hdr(*result)); prio = rtnl_cls_get_prio(cls); proto = rtnl_cls_get_protocol(cls); tchdr->tcm_info = TC_H_MAKE(prio << 16, htons(proto)); return 0; }
static int cls_build(struct rtnl_cls *cls, int type, int flags, struct nl_msg **result) { int err, prio, proto; struct tcmsg *tchdr; uint32_t required = TCA_ATTR_IFINDEX; if ((cls->ce_mask & required) != required) { APPBUG("ifindex must be specified"); return -NLE_MISSING_ATTR; } err = rtnl_tc_msg_build(TC_CAST(cls), type, flags, result); if (err < 0) return err; tchdr = nlmsg_data(nlmsg_hdr(*result)); prio = rtnl_cls_get_prio(cls); proto = rtnl_cls_get_protocol(cls); tchdr->tcm_info = TC_H_MAKE(prio << 16, htons(proto)); return 0; }