使用的开源dhcp client代码,其中希望将dscp设置为0xC0,但是发现discovery包可以设置成功,但是renew数据包不能,查看代码发现discovery数据包是跑raw socket的,但是renew则是通过udp socket发送,查看内核代码发现raw socket不通过netfilter规则,具体如下:
kernel/linux/net/packet/af_packet.c
packet_sendmsg->dev_queue_xmit 直接进入TC,然后发送。
udp_sendmsg->udp_push_pending_frames->ip_push_pending_frames->ip_local_out 进入netfilter,所以可以被netfilter规则拦截或修改。
做个记录,谨防忘记,如有出错,敬请谅解。