@@ -17,7 +17,7 @@ import (
17
17
func setControlMessage (fd int , opt * rawOpt , cf ControlFlags , on bool ) error {
18
18
opt .Lock ()
19
19
defer opt .Unlock ()
20
- if cf & FlagTTL != 0 {
20
+ if cf & FlagTTL != 0 && sockOpts [ ssoReceiveTTL ]. name > 0 {
21
21
if err := setInt (fd , & sockOpts [ssoReceiveTTL ], boolint (on )); err != nil {
22
22
return err
23
23
}
@@ -39,7 +39,7 @@ func setControlMessage(fd int, opt *rawOpt, cf ControlFlags, on bool) error {
39
39
}
40
40
}
41
41
} else {
42
- if cf & FlagDst != 0 {
42
+ if cf & FlagDst != 0 && sockOpts [ ssoReceiveDst ]. name > 0 {
43
43
if err := setInt (fd , & sockOpts [ssoReceiveDst ], boolint (on )); err != nil {
44
44
return err
45
45
}
@@ -49,7 +49,7 @@ func setControlMessage(fd int, opt *rawOpt, cf ControlFlags, on bool) error {
49
49
opt .clear (FlagDst )
50
50
}
51
51
}
52
- if cf & FlagInterface != 0 {
52
+ if cf & FlagInterface != 0 && sockOpts [ ssoReceiveInterface ]. name > 0 {
53
53
if err := setInt (fd , & sockOpts [ssoReceiveInterface ], boolint (on )); err != nil {
54
54
return err
55
55
}
@@ -66,36 +66,36 @@ func setControlMessage(fd int, opt *rawOpt, cf ControlFlags, on bool) error {
66
66
func newControlMessage (opt * rawOpt ) (oob []byte ) {
67
67
opt .RLock ()
68
68
var l int
69
- if opt .isset (FlagTTL ) {
69
+ if opt .isset (FlagTTL ) && ctlOpts [ ctlTTL ]. name > 0 {
70
70
l += syscall .CmsgSpace (ctlOpts [ctlTTL ].length )
71
71
}
72
72
if ctlOpts [ctlPacketInfo ].name > 0 {
73
73
if opt .isset (FlagSrc | FlagDst | FlagInterface ) {
74
74
l += syscall .CmsgSpace (ctlOpts [ctlPacketInfo ].length )
75
75
}
76
76
} else {
77
- if opt .isset (FlagDst ) {
77
+ if opt .isset (FlagDst ) && ctlOpts [ ctlDst ]. name > 0 {
78
78
l += syscall .CmsgSpace (ctlOpts [ctlDst ].length )
79
79
}
80
- if opt .isset (FlagInterface ) {
80
+ if opt .isset (FlagInterface ) && ctlOpts [ ctlInterface ]. name > 0 {
81
81
l += syscall .CmsgSpace (ctlOpts [ctlInterface ].length )
82
82
}
83
83
}
84
84
if l > 0 {
85
85
oob = make ([]byte , l )
86
86
b := oob
87
- if opt .isset (FlagTTL ) {
87
+ if opt .isset (FlagTTL ) && ctlOpts [ ctlTTL ]. name > 0 {
88
88
b = ctlOpts [ctlTTL ].marshal (b , nil )
89
89
}
90
90
if ctlOpts [ctlPacketInfo ].name > 0 {
91
91
if opt .isset (FlagSrc | FlagDst | FlagInterface ) {
92
92
b = ctlOpts [ctlPacketInfo ].marshal (b , nil )
93
93
}
94
94
} else {
95
- if opt .isset (FlagDst ) {
95
+ if opt .isset (FlagDst ) && ctlOpts [ ctlDst ]. name > 0 {
96
96
b = ctlOpts [ctlDst ].marshal (b , nil )
97
97
}
98
- if opt .isset (FlagInterface ) {
98
+ if opt .isset (FlagInterface ) && ctlOpts [ ctlInterface ]. name > 0 {
99
99
b = ctlOpts [ctlInterface ].marshal (b , nil )
100
100
}
101
101
}
@@ -136,18 +136,16 @@ func marshalControlMessage(cm *ControlMessage) (oob []byte) {
136
136
return nil
137
137
}
138
138
var l int
139
- if ctlOpts [ ctlPacketInfo ]. name > 0 {
140
- if cm .Src .To4 () != nil || cm .IfIndex > 0 {
141
- l += syscall . CmsgSpace ( ctlOpts [ ctlPacketInfo ]. length )
142
- }
139
+ pktinfo := false
140
+ if ctlOpts [ ctlPacketInfo ]. name > 0 && ( cm .Src .To4 () != nil || cm .IfIndex > 0 ) {
141
+ pktinfo = true
142
+ l += syscall . CmsgSpace ( ctlOpts [ ctlPacketInfo ]. length )
143
143
}
144
144
if l > 0 {
145
145
oob = make ([]byte , l )
146
146
b := oob
147
- if ctlOpts [ctlPacketInfo ].name > 0 {
148
- if cm .Src .To4 () != nil || cm .IfIndex > 0 {
149
- b = ctlOpts [ctlPacketInfo ].marshal (b , cm )
150
- }
147
+ if pktinfo {
148
+ b = ctlOpts [ctlPacketInfo ].marshal (b , cm )
151
149
}
152
150
}
153
151
return
0 commit comments