int netem_init() { /* Allocate and initialize a new netlink handle */ if (!(sock = nl_socket_alloc())) { fprintf(stderr, "Failed to alloc netlink socket\n"); return -EOPNOTSUPP; } /* Bind and connect socket to protocol, NETLINK_ROUTE in our case. */ if (nl_connect(sock, NETLINK_ROUTE) < 0) { fprintf(stderr, "Failed to connect to kernel\n"); return -EOPNOTSUPP; } /* Retrieve a list of all available interfaces and populate cache. */ if (rtnl_link_alloc_cache(sock, AF_UNSPEC, &link_cache) < 0) { fprintf(stderr, "Error creating link cache\n"); return -EOPNOTSUPP; } /* Retrieve a list of all available qdiscs and populate cache. */ if (rtnl_qdisc_alloc_cache(sock, &qdisc_cache) < 0) { fprintf(stderr, "Error creating qdisc cache\n"); return -EOPNOTSUPP; } return 0; }
bool TNlHtb::Valid(const TNlLink &link, uint32_t defaultClass) { int ret; struct nl_cache *qdiscCache; bool valid = true; ret = rtnl_qdisc_alloc_cache(link.GetSock(), &qdiscCache); if (ret < 0) { L_ERR() << "can't alloc qdisc cache" << std::endl; return false; } struct rtnl_qdisc *qdisc = rtnl_qdisc_get(qdiscCache, link.GetIndex(), Handle); if (qdisc) { link.Dump("found", qdisc); if (rtnl_tc_get_ifindex(TC_CAST(qdisc)) != link.GetIndex()) valid = false; else if (rtnl_tc_get_parent(TC_CAST(qdisc)) != Parent) valid = false; else if (rtnl_tc_get_handle(TC_CAST(qdisc)) != Handle) valid = false; else if (rtnl_tc_get_kind(TC_CAST(qdisc)) != std::string("htb")) valid = false; else if (rtnl_htb_get_defcls(qdisc) != TC_H_MIN(defaultClass)) valid = false; } else { valid = false; } rtnl_qdisc_put(qdisc); nl_cache_free(qdiscCache); return valid; }
struct nl_cache *nltool_alloc_qdisc_cache(struct nl_handle *nlh) { struct nl_cache *cache; cache = rtnl_qdisc_alloc_cache(nlh); if (!cache) fprintf(stderr, "Unable to retrieve qdisc cache: %s\n", nl_geterror()); else nl_cache_mngt_provide(cache); return cache; }
bool TNlHtb::Exists(const TNlLink &link) { int ret; struct nl_cache *qdiscCache; bool exists; ret = rtnl_qdisc_alloc_cache(link.GetSock(), &qdiscCache); if (ret < 0) return false; link.LogCache(qdiscCache); struct rtnl_qdisc *qdisc = rtnl_qdisc_get(qdiscCache, link.GetIndex(), Handle); exists = qdisc != nullptr; rtnl_qdisc_put(qdisc); nl_cache_free(qdiscCache); return exists; }
int init_subkind_nic(libxl__checkpoint_devices_state *cds) { int rc, ret; libxl__domain_save_state *dss = CONTAINER_OF(cds, *dss, cds); libxl__remus_state *rs = cds->concrete_data; STATE_AO_GC(cds->ao); rs->nlsock = nl_socket_alloc(); if (!rs->nlsock) { LOGD(ERROR, dss->domid, "cannot allocate nl socket"); rc = ERROR_FAIL; goto out; } ret = nl_connect(rs->nlsock, NETLINK_ROUTE); if (ret) { LOGD(ERROR, dss->domid, "failed to open netlink socket: %s", nl_geterror(ret)); rc = ERROR_FAIL; goto out; } /* get list of all qdiscs installed on network devs. */ ret = rtnl_qdisc_alloc_cache(rs->nlsock, &rs->qdisc_cache); if (ret) { LOGD(ERROR, dss->domid, "failed to allocate qdisc cache: %s", nl_geterror(ret)); rc = ERROR_FAIL; goto out; } if (dss->remus->netbufscript) { rs->netbufscript = libxl__strdup(gc, dss->remus->netbufscript); } else { rs->netbufscript = GCSPRINTF("%s/remus-netbuf-setup", libxl__xen_script_dir_path()); } rc = 0; out: return rc; }
bool TNlQdisc::Check(const TNl &nl) { struct nl_cache *qdiscCache; bool result = false; int ret; ret = rtnl_qdisc_alloc_cache(nl.GetSock(), &qdiscCache); if (ret < 0) { L_ERR() << nl.Error(ret, "cannot alloc qdisc cache") << std::endl; return false; } struct rtnl_qdisc *qdisc = rtnl_qdisc_get(qdiscCache, Index, Handle); if (!qdisc) { result = Kind == ""; goto out; } nl.Dump("found", qdisc); if (rtnl_tc_get_ifindex(TC_CAST(qdisc)) != Index) goto out; if (rtnl_tc_get_parent(TC_CAST(qdisc)) != Parent) goto out; if (rtnl_tc_get_handle(TC_CAST(qdisc)) != Handle) goto out; if (rtnl_tc_get_kind(TC_CAST(qdisc)) != Kind) goto out; if (Kind == "htb") { if (rtnl_htb_get_defcls(qdisc) != Default) goto out; } result = true; out: rtnl_qdisc_put(qdisc); nl_cache_free(qdiscCache); return result; }
static int netlink_do_init(void) { int err; if (!(sock = nl_socket_alloc())) { fprintf(stderr, "Unable to allocate netlink socket\n"); goto disable; } if ((err = nl_connect(sock, NETLINK_ROUTE)) < 0) { fprintf(stderr, "Unable to connect netlink socket: %s\n", nl_geterror(err)); goto disable; } if ((err = rtnl_link_alloc_cache(sock, AF_UNSPEC, &link_cache)) < 0) { fprintf(stderr, "Unable to allocate link cache: %s\n", nl_geterror(err)); goto disable; } if ((err = rtnl_qdisc_alloc_cache(sock, &qdisc_cache)) < 0) { fprintf(stderr, "Warning: Unable to allocate qdisc cache: %s\n", nl_geterror(err)); fprintf(stderr, "Disabling QoS statistics.\n"); qdisc_cache = NULL; } netlink_use_bit(link_attrs, ARRAY_SIZE(link_attrs)); netlink_use_bit(tc_attrs, ARRAY_SIZE(tc_attrs)); if (attr_map_load(link_attrs, ARRAY_SIZE(link_attrs)) || attr_map_load(tc_attrs, ARRAY_SIZE(tc_attrs))) BUG(); if (!(grp = group_lookup(DEFAULT_GROUP, GROUP_CREATE))) BUG(); return 0; disable: return -EOPNOTSUPP; }