Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

How to get the state of a "plug" qdisc ? #278

Open
MathisMorin opened this issue Apr 22, 2021 · 1 comment
Open

How to get the state of a "plug" qdisc ? #278

MathisMorin opened this issue Apr 22, 2021 · 1 comment

Comments

@MathisMorin
Copy link

The question seem simple, but I can't figure out how to get that. Here is my use case:
I have two network namespaces (red at 192.168.15.1 and blue at 192.168.15.2) connected by a virtual ethernet cable. Red side, the device is named veth-red, blue side, it is named veth-blue. Now i want to add a "plug" qdisc to veth-blue, I'm doing it with the following command lines:

ip netns exec blue nl-qdisc-add --dev veth-blue --parent root --id 1: plug --limit 32000
ip netns exec blue nl-qdisc-add --dev veth-blue --parent root --id 1: --update plug --release-indefinite

Now, I want to be able to "buffer" and "release" my qdisc from a C program. My code looks like that:

#include <stdio.h>
#include <stdlib.h>
#include <libnl3/netlink/route/link.h>
#include <libnl3/netlink/route/tc.h>
#include <libnl3/netlink/route/qdisc.h>
#include <libnl3/netlink/route/qdisc/netem.h>
#include <libnl3/netlink/route/qdisc/tbf.h>

int main(){
    struct nl_sock *sock;
    struct nl_cache *cache;
    struct rtnl_link *link;
    int if_index;
    
    sock = nl_socket_alloc();
    nl_connect(sock, NETLINK_ROUTE);
    rtnl_link_alloc_cache(sock, AF_UNSPEC, &cache);
    link = rtnl_link_get_by_name(cache, "veth-blue");
    if_index = rtnl_link_get_ifindex(link);
    
    struct nl_cache *qdisc_cache;
    struct rtnl_qdisc *q;
    uint32_t handle = (1 << 16) | (0);

    rtnl_qdisc_alloc_cache(sock, &qdisc_cache);
    
    q = rtnl_qdisc_get(qdisc_cache, if_index, handle);
    rtnl_qdisc_plug_buffer(q);
    rtnl_qdisc_add(sock, q, NLM_F_CREATE);

    /* some code */

    rtnl_qdisc_plug_release_indefinite(q);
    rtnl_qdisc_add(sock, q, NLM_F_CREATE);

    return 0;
}

My code works fine, my only problem is that I want to be absolutely sure to execute the "/* some code */" part once the qdisc is "buffered" and not before. Thus, I'm looking for a indicator that could tell me whether or not the qdisc is buffered.

I looked into q with gdb, but can't find anything changing between the two states, I tried with rtnl_tc_data(TC_CAST(q)), but it seems it doesn't help me finding what I'm looking for.

Thanks in advance.

@chengyechun
Copy link

You can use the rtnl_qdisc_get_by_parent function or rtnl_qdisc_get to query.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants