Dmitri Shuralyov | 5d99779 | 2016-11-07 15:05:57 -0800 | [diff] [blame] | 1 | // Copyright 2012 The Go Authors. All rights reserved. |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style |
| 3 | // license that can be found in the LICENSE file. |
| 4 | |
Mikio Hara | c8c327c | 2016-10-03 18:44:56 +0900 | [diff] [blame] | 5 | // +build darwin dragonfly freebsd linux netbsd openbsd solaris windows |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 6 | |
| 7 | package ipv4 |
| 8 | |
Mikio Hara | 7625277 | 2016-08-25 06:13:12 +0900 | [diff] [blame] | 9 | import ( |
| 10 | "syscall" |
| 11 | |
| 12 | "golang.org/x/net/internal/netreflect" |
| 13 | ) |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 14 | |
| 15 | // TOS returns the type-of-service field value for outgoing packets. |
| 16 | func (c *genericOpt) TOS() (int, error) { |
| 17 | if !c.ok() { |
| 18 | return 0, syscall.EINVAL |
| 19 | } |
Mikio Hara | 7625277 | 2016-08-25 06:13:12 +0900 | [diff] [blame] | 20 | s, err := netreflect.SocketOf(c.Conn) |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 21 | if err != nil { |
| 22 | return 0, err |
| 23 | } |
Mikio Hara | 7625277 | 2016-08-25 06:13:12 +0900 | [diff] [blame] | 24 | return getInt(s, &sockOpts[ssoTOS]) |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 25 | } |
| 26 | |
| 27 | // SetTOS sets the type-of-service field value for future outgoing |
| 28 | // packets. |
| 29 | func (c *genericOpt) SetTOS(tos int) error { |
| 30 | if !c.ok() { |
| 31 | return syscall.EINVAL |
| 32 | } |
Mikio Hara | 7625277 | 2016-08-25 06:13:12 +0900 | [diff] [blame] | 33 | s, err := netreflect.SocketOf(c.Conn) |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 34 | if err != nil { |
| 35 | return err |
| 36 | } |
Mikio Hara | 7625277 | 2016-08-25 06:13:12 +0900 | [diff] [blame] | 37 | return setInt(s, &sockOpts[ssoTOS], tos) |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 38 | } |
| 39 | |
| 40 | // TTL returns the time-to-live field value for outgoing packets. |
| 41 | func (c *genericOpt) TTL() (int, error) { |
| 42 | if !c.ok() { |
| 43 | return 0, syscall.EINVAL |
| 44 | } |
Mikio Hara | 7625277 | 2016-08-25 06:13:12 +0900 | [diff] [blame] | 45 | s, err := netreflect.SocketOf(c.Conn) |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 46 | if err != nil { |
| 47 | return 0, err |
| 48 | } |
Mikio Hara | 7625277 | 2016-08-25 06:13:12 +0900 | [diff] [blame] | 49 | return getInt(s, &sockOpts[ssoTTL]) |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 50 | } |
| 51 | |
| 52 | // SetTTL sets the time-to-live field value for future outgoing |
| 53 | // packets. |
| 54 | func (c *genericOpt) SetTTL(ttl int) error { |
| 55 | if !c.ok() { |
| 56 | return syscall.EINVAL |
| 57 | } |
Mikio Hara | 7625277 | 2016-08-25 06:13:12 +0900 | [diff] [blame] | 58 | s, err := netreflect.SocketOf(c.Conn) |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 59 | if err != nil { |
| 60 | return err |
| 61 | } |
Mikio Hara | 7625277 | 2016-08-25 06:13:12 +0900 | [diff] [blame] | 62 | return setInt(s, &sockOpts[ssoTTL], ttl) |
Mikio Hara | d2e5a12 | 2012-09-26 21:03:09 +0900 | [diff] [blame] | 63 | } |