Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

skb->priority and IP::tos and ping -Q

I'm developing some network driver and I'm trying to assign packets to different queues basing on ip::tos value. For testing purposes I'm running:

ping -Q 1 10.0.0.2

to set ip::tos value to 1. The problem I've got is that on this system where I run ping command - outgoing skb has skb->priority==0, but I think it should be 1.

I assumed that setting "-Q 1" will set skb->priority to 1, but it isn't.

Anyone knows why?

like image 884
user2699113 Avatar asked Sep 01 '25 01:09

user2699113


1 Answers

First of all, there is no direct mapping between the skb->priority and the IP TOS field. It is done like so in the linux kernel:

sk->sk_priority = rt_tos2priority(val)
...

static inline char rt_tos2priority(u8 tos)
{
    return ip_tos2prio[IPTOS_TOS(tos)>>1];
}

(and the ip_tos2prio table can be found in ipv4/route.c).

It seems to me you'll have to set the "TOS" byte to atleast 32 to get skb->priority to anything other than 0.

ping -Q 1 sets the whole TOS byte to 1. Note that TOS is deprecated in favor of DSCP. The 2 low-order bits are used for ECN, while the upper 6 bits are used for the DSCP value (the "priority").

So you likely have to start at 4, to get a DSCP priority of 1, but according to the above table, start at 32 to get skb->priority set as well, as in ping -Q 32 10.0.0.2

However, I'm not sure that will set the skb->priority as well in all cases. If the ping tool crafts packets using raw sockets, it might bypass setting the skb->priority.

However, skb->priority for locally generated packets will be set if one does e.g.

 int tos = 32; 
 setsockopt(sock_fd, IPPROTO_IP, IP_TOS,
                          &tos, sizeof(tos));

So you might need to cook up a small sample program that does the above before sending packets.

like image 115
nos Avatar answered Sep 02 '25 16:09

nos