TError TNlClass::Load(const TNl &nl) { struct nl_cache *cache; struct rtnl_class *tclass; int ret = rtnl_class_alloc_cache(nl.GetSock(), Index, &cache); if (ret < 0) return nl.Error(ret, "Cannot allocate class cache"); tclass = rtnl_class_get(cache, Index, Handle); if (!tclass) { nl_cache_free(cache); return TError(EError::Unknown, "Can't find tc class"); } Kind = rtnl_tc_get_kind(TC_CAST(tclass)); if (Kind == "htb") { Prio = rtnl_htb_get_prio(tclass); Rate = rtnl_htb_get_rate(tclass); Ceil = rtnl_htb_get_ceil(tclass); } if (Kind == "hfsc") { struct tc_service_curve sc; if (!rtnl_class_hfsc_get_fsc(tclass, &sc)) Rate = sc.m2; if (!rtnl_class_hfsc_get_usc(tclass, &sc)) Ceil = sc.m2; } rtnl_class_put(tclass); nl_cache_free(cache); return TError::Success(); }
TError TNlClass::GetProperties(const TNlLink &link, uint32_t &prio, uint32_t &rate, uint32_t &ceil) { struct nl_cache *cache; struct rtnl_class *tclass; int index = link.GetIndex(); int ret = rtnl_class_alloc_cache(link.GetSock(), index, &cache); if (ret < 0) return TError(EError::Unknown, std::string("Unable to allocate class cache: ") + nl_geterror(ret)); tclass = rtnl_class_get(cache, index, Handle); if (!tclass) { nl_cache_free(cache); return TError(EError::Unknown, "Can't find tc class"); } prio = rtnl_htb_get_prio(tclass); rate = rtnl_htb_get_rate(tclass); ceil = rtnl_htb_get_ceil(tclass); rtnl_class_put(tclass); nl_cache_free(cache); return TError::Success(); }