setSockOptTCP implements linux setsockopt(2) when the level is SOL_TCP.
(t *kernel.Task, ep commonEndpoint, name int, optVal []byte)
| 2230 | |
| 2231 | // setSockOptTCP implements linux setsockopt(2) when the level is SOL_TCP. |
| 2232 | func (s *sock) setSockOptTCP(t *kernel.Task, ep commonEndpoint, name int, optVal []byte) *syserr.Error { |
| 2233 | if !socket.IsTCP(s) { |
| 2234 | return syserr.ErrUnknownProtocolOption |
| 2235 | } |
| 2236 | |
| 2237 | switch name { |
| 2238 | case linux.TCP_NODELAY: |
| 2239 | if len(optVal) < sizeOfInt32 { |
| 2240 | return syserr.ErrInvalidArgument |
| 2241 | } |
| 2242 | |
| 2243 | v := hostarch.ByteOrder.Uint32(optVal) |
| 2244 | ep.SocketOptions().SetDelayOption(v == 0) |
| 2245 | return nil |
| 2246 | |
| 2247 | case linux.TCP_CORK: |
| 2248 | if len(optVal) < sizeOfInt32 { |
| 2249 | return syserr.ErrInvalidArgument |
| 2250 | } |
| 2251 | |
| 2252 | v := hostarch.ByteOrder.Uint32(optVal) |
| 2253 | ep.SocketOptions().SetCorkOption(v != 0) |
| 2254 | return nil |
| 2255 | |
| 2256 | case linux.TCP_QUICKACK: |
| 2257 | if len(optVal) < sizeOfInt32 { |
| 2258 | return syserr.ErrInvalidArgument |
| 2259 | } |
| 2260 | |
| 2261 | v := hostarch.ByteOrder.Uint32(optVal) |
| 2262 | ep.SocketOptions().SetQuickAck(v != 0) |
| 2263 | return nil |
| 2264 | |
| 2265 | case linux.TCP_MAXSEG: |
| 2266 | if len(optVal) < sizeOfInt32 { |
| 2267 | return syserr.ErrInvalidArgument |
| 2268 | } |
| 2269 | |
| 2270 | v := hostarch.ByteOrder.Uint32(optVal) |
| 2271 | return syserr.TranslateNetstackError(ep.SetSockOptInt(tcpip.MaxSegOption, int(v))) |
| 2272 | |
| 2273 | case linux.TCP_KEEPIDLE: |
| 2274 | if len(optVal) < sizeOfInt32 { |
| 2275 | return syserr.ErrInvalidArgument |
| 2276 | } |
| 2277 | |
| 2278 | v := hostarch.ByteOrder.Uint32(optVal) |
| 2279 | if v < 1 || v > linux.MAX_TCP_KEEPIDLE { |
| 2280 | return syserr.ErrInvalidArgument |
| 2281 | } |
| 2282 | opt := tcpip.KeepaliveIdleOption(time.Second * time.Duration(v)) |
| 2283 | return syserr.TranslateNetstackError(ep.SetSockOpt(&opt)) |
| 2284 | |
| 2285 | case linux.TCP_KEEPINTVL: |
| 2286 | if len(optVal) < sizeOfInt32 { |
| 2287 | return syserr.ErrInvalidArgument |
| 2288 | } |
| 2289 |
no test coverage detected