@@ -84,6 +84,10 @@ func (u *StdConn) SetSendBuffer(n int) error {
84
84
return unix .SetsockoptInt (u .sysFd , unix .SOL_SOCKET , unix .SO_SNDBUFFORCE , n )
85
85
}
86
86
87
+ func (u * StdConn ) SetSoMark (mark int ) error {
88
+ return unix .SetsockoptInt (u .sysFd , unix .SOL_SOCKET , unix .SO_MARK , mark )
89
+ }
90
+
87
91
func (u * StdConn ) GetRecvBuffer () (int , error ) {
88
92
return unix .GetsockoptInt (int (u .sysFd ), unix .SOL_SOCKET , unix .SO_RCVBUF )
89
93
}
@@ -92,6 +96,10 @@ func (u *StdConn) GetSendBuffer() (int, error) {
92
96
return unix .GetsockoptInt (int (u .sysFd ), unix .SOL_SOCKET , unix .SO_SNDBUF )
93
97
}
94
98
99
+ func (u * StdConn ) GetSoMark () (int , error ) {
100
+ return unix .GetsockoptInt (int (u .sysFd ), unix .SOL_SOCKET , unix .SO_MARK )
101
+ }
102
+
95
103
func (u * StdConn ) LocalAddr () (netip.AddrPort , error ) {
96
104
sa , err := unix .Getsockname (u .sysFd )
97
105
if err != nil {
@@ -270,6 +278,22 @@ func (u *StdConn) ReloadConfig(c *config.C) {
270
278
u .l .WithError (err ).Error ("Failed to set listen.write_buffer" )
271
279
}
272
280
}
281
+
282
+ b = c .GetInt ("listen.so_mark" , 0 )
283
+ s , err := u .GetSoMark ()
284
+ if b > 0 || (err == nil && s != 0 ) {
285
+ err := u .SetSoMark (b )
286
+ if err == nil {
287
+ s , err := u .GetSoMark ()
288
+ if err == nil {
289
+ u .l .WithField ("mark" , s ).Info ("listen.so_mark was set" )
290
+ } else {
291
+ u .l .WithError (err ).Warn ("Failed to get listen.so_mark" )
292
+ }
293
+ } else {
294
+ u .l .WithError (err ).Error ("Failed to set listen.so_mark" )
295
+ }
296
+ }
273
297
}
274
298
275
299
func (u * StdConn ) getMemInfo (meminfo * [unix .SK_MEMINFO_VARS ]uint32 ) error {
0 commit comments