SO_MARK 有效值

SO_MARK valid values

SO_MARK? I found some projects use int, some unsigned int (dnsmasq 的有效和有意义的值是什么):

unsigned int mark;
if (get_incoming_mark(&forward->frec_src.source, &forward->frec_src.dest, 0, &mark))
     setsockopt(fd, SOL_SOCKET, SO_MARK, &mark, sizeof(unsigned int));

我想使用 unsigned int 是正确的(因此 ping 的这个 PR 可能是正确的:https://github.com/iputils/iputils/pull/345)。但是 ping 允许用户指定 SO_MARK,因此我还想添加对有效输入的检查。

此外,我可以在 wireshark/tcpdump 输出中看到 SO_MARK 设置吗?

内核用于套接字defines the fieldstruct sock结构由SO_MARK设置为:__u32 sk_mark。所以我想说任何 uint32_t 都是这个选项的有意义的值。

Also, can I see SO_MARK setup in wireshark/tcpdump output?

AFAIK 不,mark 实际上并没有设置在数据包上(在任何层),它只是设置在用于管理套接字(struct sock)和数据包控制信息的内部内核结构上(struct sk_buff)。您不会在“网络上”看到它。

然而,您可以使用 iptables 将标记的数据包记录到 dmesg,例如 Unix 上的 this answer & Linux SE 建议:

$ sudo iptables -A INPUT -m mark ! --mark 0 -m limit --limit 8/min --limit-burst 12 -j LOG --log-prefix "IPTables-Marks: "

$ ./send-some-marked-packets ...

$ sudo dmesg
...
[27448.839237] IPTables-Marks: IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00 SRC=127.0.0.1 DST=127.0.0.1 LEN=31 TOS=0x00 PREC=0x00 TTL=64 ID=45988 DF PROTO=UDP SPT=40656 DPT=12345 LEN=11 MARK=0xcc