mirror of
https://github.com/golang/net.git
synced 2026-03-31 18:37:08 +09:00
go.net/ipv4: drop DIffServ and ECN constants, add ICMPType
This CL removes DiffServ and ECN constants assigned by IANA because for now we don't have an appropriate package to put those constants as part of API. There were used for the type-of-service field of IPv4 header and the traffic class field of IPv6 header. Also adds ICMPType for convenience, makes use of internal IANA protocol number constants instead of syscall's to prevent churning of package syscall in the near future. R=dave CC=golang-dev https://golang.org/cl/9353045
This commit is contained in:
@@ -55,7 +55,7 @@ func newControlMessage(opt *rawOpt) (oob []byte) {
|
||||
if opt.isset(FlagTTL) {
|
||||
b := make([]byte, syscall.CmsgSpace(1))
|
||||
cmsg := (*syscall.Cmsghdr)(unsafe.Pointer(&b[0]))
|
||||
cmsg.Level = syscall.IPPROTO_IP
|
||||
cmsg.Level = ianaProtocolIP
|
||||
cmsg.Type = syscall.IP_RECVTTL
|
||||
cmsg.SetLen(syscall.CmsgLen(1))
|
||||
oob = append(oob, b...)
|
||||
@@ -63,7 +63,7 @@ func newControlMessage(opt *rawOpt) (oob []byte) {
|
||||
if opt.isset(FlagDst) {
|
||||
b := make([]byte, syscall.CmsgSpace(net.IPv4len))
|
||||
cmsg := (*syscall.Cmsghdr)(unsafe.Pointer(&b[0]))
|
||||
cmsg.Level = syscall.IPPROTO_IP
|
||||
cmsg.Level = ianaProtocolIP
|
||||
cmsg.Type = syscall.IP_RECVDSTADDR
|
||||
cmsg.SetLen(syscall.CmsgLen(net.IPv4len))
|
||||
oob = append(oob, b...)
|
||||
@@ -71,7 +71,7 @@ func newControlMessage(opt *rawOpt) (oob []byte) {
|
||||
if opt.isset(FlagInterface) {
|
||||
b := make([]byte, syscall.CmsgSpace(syscall.SizeofSockaddrDatalink))
|
||||
cmsg := (*syscall.Cmsghdr)(unsafe.Pointer(&b[0]))
|
||||
cmsg.Level = syscall.IPPROTO_IP
|
||||
cmsg.Level = ianaProtocolIP
|
||||
cmsg.Type = syscall.IP_RECVIF
|
||||
cmsg.SetLen(syscall.CmsgLen(syscall.SizeofSockaddrDatalink))
|
||||
oob = append(oob, b...)
|
||||
@@ -89,7 +89,7 @@ func parseControlMessage(b []byte) (*ControlMessage, error) {
|
||||
}
|
||||
cm := &ControlMessage{}
|
||||
for _, m := range cmsgs {
|
||||
if m.Header.Level != syscall.IPPROTO_IP {
|
||||
if m.Header.Level != ianaProtocolIP {
|
||||
continue
|
||||
}
|
||||
switch m.Header.Type {
|
||||
|
||||
@@ -47,7 +47,7 @@ func newControlMessage(opt *rawOpt) (oob []byte) {
|
||||
if opt.isset(FlagTTL) {
|
||||
b := make([]byte, syscall.CmsgSpace(1))
|
||||
cmsg := (*syscall.Cmsghdr)(unsafe.Pointer(&b[0]))
|
||||
cmsg.Level = syscall.IPPROTO_IP
|
||||
cmsg.Level = ianaProtocolIP
|
||||
cmsg.Type = syscall.IP_RECVTTL
|
||||
cmsg.SetLen(syscall.CmsgLen(1))
|
||||
oob = append(oob, b...)
|
||||
@@ -55,7 +55,7 @@ func newControlMessage(opt *rawOpt) (oob []byte) {
|
||||
if opt.isset(pktinfo) {
|
||||
b := make([]byte, syscall.CmsgSpace(syscall.SizeofInet4Pktinfo))
|
||||
cmsg := (*syscall.Cmsghdr)(unsafe.Pointer(&b[0]))
|
||||
cmsg.Level = syscall.IPPROTO_IP
|
||||
cmsg.Level = ianaProtocolIP
|
||||
cmsg.Type = syscall.IP_PKTINFO
|
||||
cmsg.SetLen(syscall.CmsgLen(syscall.SizeofInet4Pktinfo))
|
||||
oob = append(oob, b...)
|
||||
@@ -73,7 +73,7 @@ func parseControlMessage(b []byte) (*ControlMessage, error) {
|
||||
}
|
||||
cm := &ControlMessage{}
|
||||
for _, m := range cmsgs {
|
||||
if m.Header.Level != syscall.IPPROTO_IP {
|
||||
if m.Header.Level != ianaProtocolIP {
|
||||
continue
|
||||
}
|
||||
switch m.Header.Type {
|
||||
@@ -105,7 +105,7 @@ func marshalControlMessage(cm *ControlMessage) (oob []byte) {
|
||||
if pion {
|
||||
b := make([]byte, syscall.CmsgSpace(syscall.SizeofInet4Pktinfo))
|
||||
cmsg := (*syscall.Cmsghdr)(unsafe.Pointer(&b[0]))
|
||||
cmsg.Level = syscall.IPPROTO_IP
|
||||
cmsg.Level = ianaProtocolIP
|
||||
cmsg.Type = syscall.IP_PKTINFO
|
||||
cmsg.SetLen(syscall.CmsgLen(syscall.SizeofInet4Pktinfo))
|
||||
data := b[syscall.CmsgLen(0):]
|
||||
|
||||
@@ -8,9 +8,7 @@
|
||||
// The package provides IP-level socket options that allow
|
||||
// manipulation of IPv4 facilities. The IPv4 and basic host
|
||||
// requirements for IPv4 are defined in RFC 791, RFC 1112 and RFC
|
||||
// 1122. A series of RFC 2474, RFC 2475, RFC 2597, RFC 2598 and RFC
|
||||
// 3168 describe how to use the type-of-service field in a DiffServ,
|
||||
// differentiated services environment.
|
||||
// 1122.
|
||||
//
|
||||
//
|
||||
// Unicasting
|
||||
@@ -38,7 +36,7 @@
|
||||
// The outgoing packets will be labeled DiffServ assured forwarding
|
||||
// class 1 low drop precedence, as known as AF11 packets.
|
||||
//
|
||||
// err := ipv4.NewConn(c).SetTOS(ipv4.DSCP_AF11)
|
||||
// err := ipv4.NewConn(c).SetTOS(DiffServAF11)
|
||||
// if err != nil {
|
||||
// // error handling
|
||||
// }
|
||||
@@ -125,7 +123,7 @@
|
||||
//
|
||||
// The application can also send both unicast and multicast packets.
|
||||
//
|
||||
// p.SetTOS(ipv4.DSCP_CS0)
|
||||
// p.SetTOS(DiffServCS0)
|
||||
// p.SetTTL(16)
|
||||
// _, err = p.WriteTo(data, nil, src)
|
||||
// if err != nil {
|
||||
|
||||
@@ -23,7 +23,7 @@ func ExampleUnicastTCPListener() {
|
||||
}
|
||||
go func(c net.Conn) {
|
||||
defer c.Close()
|
||||
err := ipv4.NewConn(c).SetTOS(ipv4.DSCP_AF11)
|
||||
err := ipv4.NewConn(c).SetTOS(DiffServAF11)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
@@ -81,7 +81,7 @@ func ExampleMulticastUDPListener() {
|
||||
continue
|
||||
}
|
||||
}
|
||||
p.SetTOS(ipv4.DSCP_CS7)
|
||||
p.SetTOS(DiffServCS7)
|
||||
p.SetTTL(16)
|
||||
_, err = p.WriteTo(b[:n], nil, src)
|
||||
if err != nil {
|
||||
@@ -150,7 +150,7 @@ func ExampleIPOSPFListener() {
|
||||
}
|
||||
ifs = append(ifs, en1)
|
||||
|
||||
c, err := net.ListenPacket("ip4:89", "0.0.0.0")
|
||||
c, err := net.ListenPacket("ip4:89", "0.0.0.0") // OSFP for IPv4
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
@@ -175,7 +175,7 @@ func ExampleIPOSPFListener() {
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
r.SetTOS(ipv4.DSCP_CS6)
|
||||
r.SetTOS(DiffServCS6)
|
||||
|
||||
parseOSPFHeader := func(b []byte) *OSPFHeader {
|
||||
if len(b) < OSPFHeaderLen {
|
||||
@@ -235,7 +235,7 @@ func ExampleWriteIPOSPFHello() {
|
||||
}
|
||||
ifs = append(ifs, en1)
|
||||
|
||||
c, err := net.ListenPacket("ip4:89", "0.0.0.0")
|
||||
c, err := net.ListenPacket("ip4:89", "0.0.0.0") // OSPF for IPv4
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
@@ -264,7 +264,7 @@ func ExampleWriteIPOSPFHello() {
|
||||
iph := &ipv4.Header{}
|
||||
iph.Version = ipv4.Version
|
||||
iph.Len = ipv4.HeaderLen
|
||||
iph.TOS = ipv4.DSCP_CS6
|
||||
iph.TOS = DiffServCS6
|
||||
iph.TotalLen = ipv4.HeaderLen + len(ospf)
|
||||
iph.TTL = 1
|
||||
iph.Protocol = 89
|
||||
|
||||
242
ipv4/gen.go
Normal file
242
ipv4/gen.go
Normal file
@@ -0,0 +1,242 @@
|
||||
// Copyright 2013 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// +build ignore
|
||||
|
||||
// This program generates internet protocol constatns and tables by
|
||||
// reading IANA protocol registries.
|
||||
//
|
||||
// Usage of this program:
|
||||
// go run gen.go > iana.go
|
||||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/xml"
|
||||
"fmt"
|
||||
"go/format"
|
||||
"io"
|
||||
"net/http"
|
||||
"os"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var registries = []struct {
|
||||
url string
|
||||
parse func(io.Writer, io.Reader) error
|
||||
}{
|
||||
{
|
||||
"http://www.iana.org/assignments/icmp-parameters",
|
||||
parseICMPv4Parameters,
|
||||
},
|
||||
{
|
||||
"http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xml",
|
||||
parseProtocolNumbers,
|
||||
},
|
||||
}
|
||||
|
||||
func main() {
|
||||
var bb bytes.Buffer
|
||||
fmt.Fprintf(&bb, "// go run gen.go\n")
|
||||
fmt.Fprintf(&bb, "// GENERATED BY THE COMMAND ABOVE; DO NOT EDIT\n\n")
|
||||
fmt.Fprintf(&bb, "package ipv4\n\n")
|
||||
for _, r := range registries {
|
||||
resp, err := http.Get(r.url)
|
||||
if err != nil {
|
||||
fmt.Fprintln(os.Stderr, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
if resp.StatusCode != http.StatusOK {
|
||||
fmt.Fprintf(os.Stderr, "got HTTP status code %v for %v\n", resp.StatusCode, r.url)
|
||||
os.Exit(1)
|
||||
}
|
||||
if err := r.parse(&bb, resp.Body); err != nil {
|
||||
fmt.Fprintln(os.Stderr, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
fmt.Fprintf(&bb, "\n")
|
||||
}
|
||||
b, err := format.Source(bb.Bytes())
|
||||
if err != nil {
|
||||
fmt.Fprintln(os.Stderr, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
os.Stdout.Write(b)
|
||||
}
|
||||
|
||||
func parseICMPv4Parameters(w io.Writer, r io.Reader) error {
|
||||
dec := xml.NewDecoder(r)
|
||||
var icp icmpv4Parameters
|
||||
if err := dec.Decode(&icp); err != nil {
|
||||
return err
|
||||
}
|
||||
prs := icp.escape(0)
|
||||
fmt.Fprintf(w, "// %s, Updated: %s\n", icp.Title, icp.Updated)
|
||||
fmt.Fprintf(w, "const (\n")
|
||||
for _, pr := range prs {
|
||||
if pr.Descr == "" {
|
||||
continue
|
||||
}
|
||||
fmt.Fprintf(w, "ICMPType%s ICMPType = %d", pr.Descr, pr.Value)
|
||||
fmt.Fprintf(w, "// %s\n", pr.OrigDescr)
|
||||
}
|
||||
fmt.Fprintf(w, ")\n\n")
|
||||
fmt.Fprintf(w, "// %s, Updated: %s\n", icp.Title, icp.Updated)
|
||||
fmt.Fprintf(w, "var icmpTypes = map[ICMPType]string{\n")
|
||||
for _, pr := range prs {
|
||||
if pr.Descr == "" {
|
||||
continue
|
||||
}
|
||||
fmt.Fprintf(w, "%d: %q,\n", pr.Value, strings.ToLower(pr.OrigDescr))
|
||||
}
|
||||
fmt.Fprintf(w, "}\n")
|
||||
return nil
|
||||
}
|
||||
|
||||
type icmpv4Parameters struct {
|
||||
XMLName xml.Name `xml:"registry"`
|
||||
Title string `xml:"title"`
|
||||
Updated string `xml:"updated"`
|
||||
Registries []icmpv4ParamRegistry `xml:"registry"`
|
||||
}
|
||||
|
||||
type icmpv4ParamRegistry struct {
|
||||
Title string `xml:"title"`
|
||||
Records []icmpv4ParamRecord `xml:"record"`
|
||||
}
|
||||
|
||||
type icmpv4ParamRecord struct {
|
||||
Value string `xml:"value"`
|
||||
Descr string `xml:"description"`
|
||||
}
|
||||
|
||||
type canonICMPv4ParamRecord struct {
|
||||
OrigDescr string
|
||||
Descr string
|
||||
Value int
|
||||
}
|
||||
|
||||
func (icp *icmpv4Parameters) escape(id int) []canonICMPv4ParamRecord {
|
||||
prs := make([]canonICMPv4ParamRecord, len(icp.Registries[id].Records))
|
||||
sr := strings.NewReplacer(
|
||||
"Messages", "",
|
||||
"Message", "",
|
||||
"ICMP", "",
|
||||
"+", "P",
|
||||
"-", "",
|
||||
"/", "",
|
||||
".", "",
|
||||
" ", "",
|
||||
)
|
||||
for i, pr := range icp.Registries[id].Records {
|
||||
if strings.Contains(pr.Descr, "Reserved") ||
|
||||
strings.Contains(pr.Descr, "Unassigned") ||
|
||||
strings.Contains(pr.Descr, "Deprecated") ||
|
||||
strings.Contains(pr.Descr, "Experiment") ||
|
||||
strings.Contains(pr.Descr, "experiment") {
|
||||
continue
|
||||
}
|
||||
ss := strings.Split(pr.Descr, "\n")
|
||||
if len(ss) > 1 {
|
||||
prs[i].Descr = strings.Join(ss, " ")
|
||||
} else {
|
||||
prs[i].Descr = ss[0]
|
||||
}
|
||||
s := strings.TrimSpace(prs[i].Descr)
|
||||
prs[i].OrigDescr = s
|
||||
prs[i].Descr = sr.Replace(s)
|
||||
prs[i].Value, _ = strconv.Atoi(pr.Value)
|
||||
}
|
||||
return prs
|
||||
}
|
||||
|
||||
func parseProtocolNumbers(w io.Writer, r io.Reader) error {
|
||||
dec := xml.NewDecoder(r)
|
||||
var pn protocolNumbers
|
||||
if err := dec.Decode(&pn); err != nil {
|
||||
return err
|
||||
}
|
||||
prs := pn.escape()
|
||||
prs = append([]canonProtocolRecord{{
|
||||
Name: "IP",
|
||||
Descr: "IPv4 encapsulation, pseudo protocol number",
|
||||
Value: 0,
|
||||
}}, prs...)
|
||||
fmt.Fprintf(w, "// %s, Updated: %s\n", pn.Title, pn.Updated)
|
||||
fmt.Fprintf(w, "const (\n")
|
||||
for _, pr := range prs {
|
||||
if pr.Name == "" {
|
||||
continue
|
||||
}
|
||||
fmt.Fprintf(w, "ianaProtocol%s = %d", pr.Name, pr.Value)
|
||||
s := pr.Descr
|
||||
if s == "" {
|
||||
s = pr.OrigName
|
||||
}
|
||||
fmt.Fprintf(w, "// %s\n", s)
|
||||
}
|
||||
fmt.Fprintf(w, ")\n")
|
||||
return nil
|
||||
}
|
||||
|
||||
type protocolNumbers struct {
|
||||
XMLName xml.Name `xml:"registry"`
|
||||
Title string `xml:"title"`
|
||||
Updated string `xml:"updated"`
|
||||
RegTitle string `xml:"registry>title"`
|
||||
Note string `xml:"registry>note"`
|
||||
Records []protocolRecord `xml:"registry>record"`
|
||||
}
|
||||
|
||||
type protocolRecord struct {
|
||||
Value string `xml:"value"`
|
||||
Name string `xml:"name"`
|
||||
Descr string `xml:"description"`
|
||||
}
|
||||
|
||||
type canonProtocolRecord struct {
|
||||
OrigName string
|
||||
Name string
|
||||
Descr string
|
||||
Value int
|
||||
}
|
||||
|
||||
func (pn *protocolNumbers) escape() []canonProtocolRecord {
|
||||
prs := make([]canonProtocolRecord, len(pn.Records))
|
||||
sr := strings.NewReplacer(
|
||||
"-in-", "in",
|
||||
"-within-", "within",
|
||||
"-over-", "over",
|
||||
"+", "P",
|
||||
"-", "",
|
||||
"/", "",
|
||||
".", "",
|
||||
" ", "",
|
||||
)
|
||||
for i, pr := range pn.Records {
|
||||
prs[i].OrigName = pr.Name
|
||||
s := strings.TrimSpace(pr.Name)
|
||||
switch pr.Name {
|
||||
case "ISIS over IPv4":
|
||||
prs[i].Name = "ISIS"
|
||||
case "manet":
|
||||
prs[i].Name = "MANET"
|
||||
default:
|
||||
prs[i].Name = sr.Replace(s)
|
||||
}
|
||||
ss := strings.Split(pr.Descr, "\n")
|
||||
for i := range ss {
|
||||
ss[i] = strings.TrimSpace(ss[i])
|
||||
}
|
||||
if len(ss) > 1 {
|
||||
prs[i].Descr = strings.Join(ss, " ")
|
||||
} else {
|
||||
prs[i].Descr = ss[0]
|
||||
}
|
||||
prs[i].Value, _ = strconv.Atoi(pr.Value)
|
||||
}
|
||||
return prs
|
||||
}
|
||||
196
ipv4/gentest.go
Normal file
196
ipv4/gentest.go
Normal file
@@ -0,0 +1,196 @@
|
||||
// Copyright 2013 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// +build ignore
|
||||
|
||||
// This program generates internet protocol constants by reading IANA
|
||||
// protocol registries.
|
||||
//
|
||||
// Usage:
|
||||
// go run gentest.go > iana_test.go
|
||||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/xml"
|
||||
"fmt"
|
||||
"go/format"
|
||||
"io"
|
||||
"net/http"
|
||||
"os"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var registries = []struct {
|
||||
url string
|
||||
parse func(io.Writer, io.Reader) error
|
||||
}{
|
||||
{
|
||||
"http://www.iana.org/assignments/dscp-registry/dscp-registry.xml",
|
||||
parseDSCPRegistry,
|
||||
},
|
||||
{
|
||||
"http://www.iana.org/assignments/ipv4-tos-byte/ipv4-tos-byte.xml",
|
||||
parseTOSTCByte,
|
||||
},
|
||||
}
|
||||
|
||||
func main() {
|
||||
var bb bytes.Buffer
|
||||
fmt.Fprintf(&bb, "// go run gentv.go\n")
|
||||
fmt.Fprintf(&bb, "// GENERATED BY THE COMMAND ABOVE; DO NOT EDIT\n\n")
|
||||
fmt.Fprintf(&bb, "package ipv4_test\n\n")
|
||||
for _, r := range registries {
|
||||
resp, err := http.Get(r.url)
|
||||
if err != nil {
|
||||
fmt.Fprintln(os.Stderr, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
if resp.StatusCode != http.StatusOK {
|
||||
fmt.Fprintf(os.Stderr, "got HTTP status code %v for %v\n", resp.StatusCode, r.url)
|
||||
os.Exit(1)
|
||||
}
|
||||
if err := r.parse(&bb, resp.Body); err != nil {
|
||||
fmt.Fprintln(os.Stderr, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
fmt.Fprintf(&bb, "\n")
|
||||
}
|
||||
b, err := format.Source(bb.Bytes())
|
||||
if err != nil {
|
||||
fmt.Fprintln(os.Stderr, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
os.Stdout.Write(b)
|
||||
}
|
||||
|
||||
func parseDSCPRegistry(w io.Writer, r io.Reader) error {
|
||||
dec := xml.NewDecoder(r)
|
||||
var dr dscpRegistry
|
||||
if err := dec.Decode(&dr); err != nil {
|
||||
return err
|
||||
}
|
||||
drs := dr.escape()
|
||||
fmt.Fprintf(w, "// %s, Updated: %s\n", dr.Title, dr.Updated)
|
||||
fmt.Fprintf(w, "const (\n")
|
||||
for _, dr := range drs {
|
||||
fmt.Fprintf(w, "DiffServ%s = %#x", dr.Name, dr.Value)
|
||||
fmt.Fprintf(w, "// %s\n", dr.OrigName)
|
||||
}
|
||||
fmt.Fprintf(w, ")\n")
|
||||
return nil
|
||||
}
|
||||
|
||||
type dscpRegistry struct {
|
||||
XMLName xml.Name `xml:"registry"`
|
||||
Title string `xml:"title"`
|
||||
Updated string `xml:"updated"`
|
||||
Note string `xml:"note"`
|
||||
RegTitle string `xml:"registry>title"`
|
||||
PoolRecords []dscpRecord `xml:"registry>record"`
|
||||
Records []dscpRecord `xml:"registry>registry>record"`
|
||||
}
|
||||
|
||||
type dscpRecord struct {
|
||||
Name string `xml:"name"`
|
||||
Space string `xml:"space"`
|
||||
}
|
||||
|
||||
type canonDSCPRecord struct {
|
||||
OrigName string
|
||||
Name string
|
||||
Value int
|
||||
}
|
||||
|
||||
func (drr *dscpRegistry) escape() []canonDSCPRecord {
|
||||
drs := make([]canonDSCPRecord, len(drr.Records))
|
||||
sr := strings.NewReplacer(
|
||||
"+", "",
|
||||
"-", "",
|
||||
"/", "",
|
||||
".", "",
|
||||
" ", "",
|
||||
)
|
||||
for i, dr := range drr.Records {
|
||||
s := strings.TrimSpace(dr.Name)
|
||||
drs[i].OrigName = s
|
||||
drs[i].Name = sr.Replace(s)
|
||||
n, err := strconv.ParseUint(dr.Space, 2, 8)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
drs[i].Value = int(n) << 2
|
||||
}
|
||||
return drs
|
||||
}
|
||||
|
||||
func parseTOSTCByte(w io.Writer, r io.Reader) error {
|
||||
dec := xml.NewDecoder(r)
|
||||
var ttb tosTCByte
|
||||
if err := dec.Decode(&ttb); err != nil {
|
||||
return err
|
||||
}
|
||||
trs := ttb.escape()
|
||||
fmt.Fprintf(w, "// %s, Updated: %s\n", ttb.Title, ttb.Updated)
|
||||
fmt.Fprintf(w, "const (\n")
|
||||
for _, tr := range trs {
|
||||
fmt.Fprintf(w, "%s = %#x", tr.Keyword, tr.Value)
|
||||
fmt.Fprintf(w, "// %s\n", tr.OrigKeyword)
|
||||
}
|
||||
fmt.Fprintf(w, ")\n")
|
||||
return nil
|
||||
}
|
||||
|
||||
type tosTCByte struct {
|
||||
XMLName xml.Name `xml:"registry"`
|
||||
Title string `xml:"title"`
|
||||
Updated string `xml:"updated"`
|
||||
Note string `xml:"note"`
|
||||
RegTitle string `xml:"registry>title"`
|
||||
Records []tosTCByteRecord `xml:"registry>record"`
|
||||
}
|
||||
|
||||
type tosTCByteRecord struct {
|
||||
Binary string `xml:"binary"`
|
||||
Keyword string `xml:"keyword"`
|
||||
}
|
||||
|
||||
type canonTOSTCByteRecord struct {
|
||||
OrigKeyword string
|
||||
Keyword string
|
||||
Value int
|
||||
}
|
||||
|
||||
func (ttb *tosTCByte) escape() []canonTOSTCByteRecord {
|
||||
trs := make([]canonTOSTCByteRecord, len(ttb.Records))
|
||||
sr := strings.NewReplacer(
|
||||
"Capable", "",
|
||||
"(", "",
|
||||
")", "",
|
||||
"+", "",
|
||||
"-", "",
|
||||
"/", "",
|
||||
".", "",
|
||||
" ", "",
|
||||
)
|
||||
for i, tr := range ttb.Records {
|
||||
s := strings.TrimSpace(tr.Keyword)
|
||||
trs[i].OrigKeyword = s
|
||||
ss := strings.Split(s, " ")
|
||||
if len(ss) > 1 {
|
||||
trs[i].Keyword = strings.Join(ss[1:], " ")
|
||||
} else {
|
||||
trs[i].Keyword = ss[0]
|
||||
}
|
||||
trs[i].Keyword = sr.Replace(trs[i].Keyword)
|
||||
n, err := strconv.ParseUint(tr.Binary, 2, 8)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
trs[i].Value = int(n)
|
||||
}
|
||||
return trs
|
||||
}
|
||||
@@ -29,18 +29,6 @@ var (
|
||||
// http://tools.ietf.org/html/rfc1112
|
||||
// RFC 1122 Requirements for Internet Hosts
|
||||
// http://tools.ietf.org/html/rfc1122
|
||||
// RFC 2474 Definition of the Differentiated Services Field (DS Field) in the IPv4 and IPv6 Headers
|
||||
// http://tools.ietf.org/html/rfc2474
|
||||
// RFC 2475 An Architecture for Differentiated Services
|
||||
// http://tools.ietf.org/html/rfc2475
|
||||
// RFC 2597 Assured Forwarding PHB Group
|
||||
// http://tools.ietf.org/html/rfc2597
|
||||
// RFC 2598 An Expedited Forwarding PHB
|
||||
// http://tools.ietf.org/html/rfc2598
|
||||
// RFC 3168 The Addition of Explicit Congestion Notification (ECN) to IP
|
||||
// http://tools.ietf.org/html/rfc3168
|
||||
// RFC 3260 New Terminology and Clarifications for Diffserv
|
||||
// http://tools.ietf.org/html/rfc3260
|
||||
|
||||
const (
|
||||
Version = 4 // protocol version
|
||||
@@ -48,39 +36,6 @@ const (
|
||||
maxHeaderLen = 60 // sensible default, revisit if later RFCs define new usage of version and header length fields
|
||||
)
|
||||
|
||||
const (
|
||||
// DiffServ class selector codepoints in RFC 2474.
|
||||
DSCP_CS0 = 0x00 // best effort
|
||||
DSCP_CS1 = 0x20 // class 1
|
||||
DSCP_CS2 = 0x40 // class 2
|
||||
DSCP_CS3 = 0x60 // class 3
|
||||
DSCP_CS4 = 0x80 // class 4
|
||||
DSCP_CS5 = 0xa0 // expedited forwarding
|
||||
DSCP_CS6 = 0xc0 // subsume deprecated IP precedence, internet control (routing information update)
|
||||
DSCP_CS7 = 0xe0 // subsume deprecated IP precedence, network control (link, neighbor liveliness check)
|
||||
|
||||
// DiffServ assured forwarding codepoints in RFC 2474, 2475, 2597 and 3260.
|
||||
DSCP_AF11 = 0x28 // class 1 low drop precedence
|
||||
DSCP_AF12 = 0x30 // class 1 medium drop precedence
|
||||
DSCP_AF13 = 0x38 // class 1 high drop precedence
|
||||
DSCP_AF21 = 0x48 // class 2 low drop precedence
|
||||
DSCP_AF22 = 0x50 // class 2 medium drop precedence
|
||||
DSCP_AF23 = 0x58 // class 2 high drop precedence
|
||||
DSCP_AF31 = 0x68 // class 3 low drop precedence
|
||||
DSCP_AF32 = 0x70 // class 3 medium drop precedence
|
||||
DSCP_AF33 = 0x78 // class 3 high drop precedence
|
||||
DSCP_AF41 = 0x88 // class 4 low drop precedence
|
||||
DSCP_AF42 = 0x90 // class 4 medium drop precedence
|
||||
DSCP_AF43 = 0x98 // class 4 high drop precedence
|
||||
DSCP_EF = 0xb8 // expedited forwarding
|
||||
|
||||
// ECN codepoints in RFC 3168.
|
||||
ECN_NOTECT = 0x00 // not ECN-capable transport
|
||||
ECN_ECT1 = 0x01 // ECN-capable transport, ECT(1)
|
||||
ECN_ECT0 = 0x02 // ECN-capable transport, ECT(0)
|
||||
ECN_CE = 0x03 // congestion experienced
|
||||
)
|
||||
|
||||
type headerField int
|
||||
|
||||
const (
|
||||
|
||||
179
ipv4/iana.go
Normal file
179
ipv4/iana.go
Normal file
@@ -0,0 +1,179 @@
|
||||
// go run gen.go
|
||||
// GENERATED BY THE COMMAND ABOVE; DO NOT EDIT
|
||||
|
||||
package ipv4
|
||||
|
||||
// Internet Control Message Protocol (ICMP) Parameters, Updated: 2013-04-19
|
||||
const (
|
||||
ICMPTypeEchoReply ICMPType = 0 // Echo Reply
|
||||
ICMPTypeDestinationUnreachable ICMPType = 3 // Destination Unreachable
|
||||
ICMPTypeRedirect ICMPType = 5 // Redirect
|
||||
ICMPTypeEcho ICMPType = 8 // Echo
|
||||
ICMPTypeRouterAdvertisement ICMPType = 9 // Router Advertisement
|
||||
ICMPTypeRouterSolicitation ICMPType = 10 // Router Solicitation
|
||||
ICMPTypeTimeExceeded ICMPType = 11 // Time Exceeded
|
||||
ICMPTypeParameterProblem ICMPType = 12 // Parameter Problem
|
||||
ICMPTypeTimestamp ICMPType = 13 // Timestamp
|
||||
ICMPTypeTimestampReply ICMPType = 14 // Timestamp Reply
|
||||
ICMPTypePhoturis ICMPType = 40 // Photuris
|
||||
)
|
||||
|
||||
// Internet Control Message Protocol (ICMP) Parameters, Updated: 2013-04-19
|
||||
var icmpTypes = map[ICMPType]string{
|
||||
0: "echo reply",
|
||||
3: "destination unreachable",
|
||||
5: "redirect",
|
||||
8: "echo",
|
||||
9: "router advertisement",
|
||||
10: "router solicitation",
|
||||
11: "time exceeded",
|
||||
12: "parameter problem",
|
||||
13: "timestamp",
|
||||
14: "timestamp reply",
|
||||
40: "photuris",
|
||||
}
|
||||
|
||||
// Protocol Numbers, Updated: 2013-02-17
|
||||
const (
|
||||
ianaProtocolIP = 0 // IPv4 encapsulation, pseudo protocol number
|
||||
ianaProtocolHOPOPT = 0 // IPv6 Hop-by-Hop Option
|
||||
ianaProtocolICMP = 1 // Internet Control Message
|
||||
ianaProtocolIGMP = 2 // Internet Group Management
|
||||
ianaProtocolGGP = 3 // Gateway-to-Gateway
|
||||
ianaProtocolIPv4 = 4 // IPv4 encapsulation
|
||||
ianaProtocolST = 5 // Stream
|
||||
ianaProtocolTCP = 6 // Transmission Control
|
||||
ianaProtocolCBT = 7 // CBT
|
||||
ianaProtocolEGP = 8 // Exterior Gateway Protocol
|
||||
ianaProtocolIGP = 9 // any private interior gateway (used by Cisco for their IGRP)
|
||||
ianaProtocolBBNRCCMON = 10 // BBN RCC Monitoring
|
||||
ianaProtocolNVPII = 11 // Network Voice Protocol
|
||||
ianaProtocolPUP = 12 // PUP
|
||||
ianaProtocolARGUS = 13 // ARGUS
|
||||
ianaProtocolEMCON = 14 // EMCON
|
||||
ianaProtocolXNET = 15 // Cross Net Debugger
|
||||
ianaProtocolCHAOS = 16 // Chaos
|
||||
ianaProtocolUDP = 17 // User Datagram
|
||||
ianaProtocolMUX = 18 // Multiplexing
|
||||
ianaProtocolDCNMEAS = 19 // DCN Measurement Subsystems
|
||||
ianaProtocolHMP = 20 // Host Monitoring
|
||||
ianaProtocolPRM = 21 // Packet Radio Measurement
|
||||
ianaProtocolXNSIDP = 22 // XEROX NS IDP
|
||||
ianaProtocolTRUNK1 = 23 // Trunk-1
|
||||
ianaProtocolTRUNK2 = 24 // Trunk-2
|
||||
ianaProtocolLEAF1 = 25 // Leaf-1
|
||||
ianaProtocolLEAF2 = 26 // Leaf-2
|
||||
ianaProtocolRDP = 27 // Reliable Data Protocol
|
||||
ianaProtocolIRTP = 28 // Internet Reliable Transaction
|
||||
ianaProtocolISOTP4 = 29 // ISO Transport Protocol Class 4
|
||||
ianaProtocolNETBLT = 30 // Bulk Data Transfer Protocol
|
||||
ianaProtocolMFENSP = 31 // MFE Network Services Protocol
|
||||
ianaProtocolMERITINP = 32 // MERIT Internodal Protocol
|
||||
ianaProtocolDCCP = 33 // Datagram Congestion Control Protocol
|
||||
ianaProtocol3PC = 34 // Third Party Connect Protocol
|
||||
ianaProtocolIDPR = 35 // Inter-Domain Policy Routing Protocol
|
||||
ianaProtocolXTP = 36 // XTP
|
||||
ianaProtocolDDP = 37 // Datagram Delivery Protocol
|
||||
ianaProtocolIDPRCMTP = 38 // IDPR Control Message Transport Proto
|
||||
ianaProtocolTPPP = 39 // TP++ Transport Protocol
|
||||
ianaProtocolIL = 40 // IL Transport Protocol
|
||||
ianaProtocolIPv6 = 41 // IPv6 encapsulation
|
||||
ianaProtocolSDRP = 42 // Source Demand Routing Protocol
|
||||
ianaProtocolIPv6Route = 43 // Routing Header for IPv6
|
||||
ianaProtocolIPv6Frag = 44 // Fragment Header for IPv6
|
||||
ianaProtocolIDRP = 45 // Inter-Domain Routing Protocol
|
||||
ianaProtocolRSVP = 46 // Reservation Protocol
|
||||
ianaProtocolGRE = 47 // Generic Routing Encapsulation
|
||||
ianaProtocolDSR = 48 // Dynamic Source Routing Protocol
|
||||
ianaProtocolBNA = 49 // BNA
|
||||
ianaProtocolESP = 50 // Encap Security Payload
|
||||
ianaProtocolAH = 51 // Authentication Header
|
||||
ianaProtocolINLSP = 52 // Integrated Net Layer Security TUBA
|
||||
ianaProtocolSWIPE = 53 // IP with Encryption
|
||||
ianaProtocolNARP = 54 // NBMA Address Resolution Protocol
|
||||
ianaProtocolMOBILE = 55 // IP Mobility
|
||||
ianaProtocolTLSP = 56 // Transport Layer Security Protocol using Kryptonet key management
|
||||
ianaProtocolSKIP = 57 // SKIP
|
||||
ianaProtocolIPv6ICMP = 58 // ICMP for IPv6
|
||||
ianaProtocolIPv6NoNxt = 59 // No Next Header for IPv6
|
||||
ianaProtocolIPv6Opts = 60 // Destination Options for IPv6
|
||||
ianaProtocolCFTP = 62 // CFTP
|
||||
ianaProtocolSATEXPAK = 64 // SATNET and Backroom EXPAK
|
||||
ianaProtocolKRYPTOLAN = 65 // Kryptolan
|
||||
ianaProtocolRVD = 66 // MIT Remote Virtual Disk Protocol
|
||||
ianaProtocolIPPC = 67 // Internet Pluribus Packet Core
|
||||
ianaProtocolSATMON = 69 // SATNET Monitoring
|
||||
ianaProtocolVISA = 70 // VISA Protocol
|
||||
ianaProtocolIPCV = 71 // Internet Packet Core Utility
|
||||
ianaProtocolCPNX = 72 // Computer Protocol Network Executive
|
||||
ianaProtocolCPHB = 73 // Computer Protocol Heart Beat
|
||||
ianaProtocolWSN = 74 // Wang Span Network
|
||||
ianaProtocolPVP = 75 // Packet Video Protocol
|
||||
ianaProtocolBRSATMON = 76 // Backroom SATNET Monitoring
|
||||
ianaProtocolSUNND = 77 // SUN ND PROTOCOL-Temporary
|
||||
ianaProtocolWBMON = 78 // WIDEBAND Monitoring
|
||||
ianaProtocolWBEXPAK = 79 // WIDEBAND EXPAK
|
||||
ianaProtocolISOIP = 80 // ISO Internet Protocol
|
||||
ianaProtocolVMTP = 81 // VMTP
|
||||
ianaProtocolSECUREVMTP = 82 // SECURE-VMTP
|
||||
ianaProtocolVINES = 83 // VINES
|
||||
ianaProtocolTTP = 84 // TTP
|
||||
ianaProtocolIPTM = 84 // Protocol Internet Protocol Traffic Manager
|
||||
ianaProtocolNSFNETIGP = 85 // NSFNET-IGP
|
||||
ianaProtocolDGP = 86 // Dissimilar Gateway Protocol
|
||||
ianaProtocolTCF = 87 // TCF
|
||||
ianaProtocolEIGRP = 88 // EIGRP
|
||||
ianaProtocolOSPFIGP = 89 // OSPFIGP
|
||||
ianaProtocolSpriteRPC = 90 // Sprite RPC Protocol
|
||||
ianaProtocolLARP = 91 // Locus Address Resolution Protocol
|
||||
ianaProtocolMTP = 92 // Multicast Transport Protocol
|
||||
ianaProtocolAX25 = 93 // AX.25 Frames
|
||||
ianaProtocolIPIP = 94 // IP-within-IP Encapsulation Protocol
|
||||
ianaProtocolMICP = 95 // Mobile Internetworking Control Pro.
|
||||
ianaProtocolSCCSP = 96 // Semaphore Communications Sec. Pro.
|
||||
ianaProtocolETHERIP = 97 // Ethernet-within-IP Encapsulation
|
||||
ianaProtocolENCAP = 98 // Encapsulation Header
|
||||
ianaProtocolGMTP = 100 // GMTP
|
||||
ianaProtocolIFMP = 101 // Ipsilon Flow Management Protocol
|
||||
ianaProtocolPNNI = 102 // PNNI over IP
|
||||
ianaProtocolPIM = 103 // Protocol Independent Multicast
|
||||
ianaProtocolARIS = 104 // ARIS
|
||||
ianaProtocolSCPS = 105 // SCPS
|
||||
ianaProtocolQNX = 106 // QNX
|
||||
ianaProtocolAN = 107 // Active Networks
|
||||
ianaProtocolIPComp = 108 // IP Payload Compression Protocol
|
||||
ianaProtocolSNP = 109 // Sitara Networks Protocol
|
||||
ianaProtocolCompaqPeer = 110 // Compaq Peer Protocol
|
||||
ianaProtocolIPXinIP = 111 // IPX in IP
|
||||
ianaProtocolVRRP = 112 // Virtual Router Redundancy Protocol
|
||||
ianaProtocolPGM = 113 // PGM Reliable Transport Protocol
|
||||
ianaProtocolL2TP = 115 // Layer Two Tunneling Protocol
|
||||
ianaProtocolDDX = 116 // D-II Data Exchange (DDX)
|
||||
ianaProtocolIATP = 117 // Interactive Agent Transfer Protocol
|
||||
ianaProtocolSTP = 118 // Schedule Transfer Protocol
|
||||
ianaProtocolSRP = 119 // SpectraLink Radio Protocol
|
||||
ianaProtocolUTI = 120 // UTI
|
||||
ianaProtocolSMP = 121 // Simple Message Protocol
|
||||
ianaProtocolSM = 122 // SM
|
||||
ianaProtocolPTP = 123 // Performance Transparency Protocol
|
||||
ianaProtocolISIS = 124 // ISIS over IPv4
|
||||
ianaProtocolFIRE = 125 // FIRE
|
||||
ianaProtocolCRTP = 126 // Combat Radio Transport Protocol
|
||||
ianaProtocolCRUDP = 127 // Combat Radio User Datagram
|
||||
ianaProtocolSSCOPMCE = 128 // SSCOPMCE
|
||||
ianaProtocolIPLT = 129 // IPLT
|
||||
ianaProtocolSPS = 130 // Secure Packet Shield
|
||||
ianaProtocolPIPE = 131 // Private IP Encapsulation within IP
|
||||
ianaProtocolSCTP = 132 // Stream Control Transmission Protocol
|
||||
ianaProtocolFC = 133 // Fibre Channel
|
||||
ianaProtocolRSVPE2EIGNORE = 134 // RSVP-E2E-IGNORE
|
||||
ianaProtocolMobilityHeader = 135 // Mobility Header
|
||||
ianaProtocolUDPLite = 136 // UDPLite
|
||||
ianaProtocolMPLSinIP = 137 // MPLS-in-IP
|
||||
ianaProtocolMANET = 138 // MANET Protocols
|
||||
ianaProtocolHIP = 139 // Host Identity Protocol
|
||||
ianaProtocolShim6 = 140 // Shim6 Protocol
|
||||
ianaProtocolWESP = 141 // Wrapped Encapsulating Security Payload
|
||||
ianaProtocolROHC = 142 // Robust Header Compression
|
||||
ianaProtocolReserved = 255 // Reserved
|
||||
)
|
||||
38
ipv4/iana_test.go
Normal file
38
ipv4/iana_test.go
Normal file
@@ -0,0 +1,38 @@
|
||||
// go run gentv.go
|
||||
// GENERATED BY THE COMMAND ABOVE; DO NOT EDIT
|
||||
|
||||
package ipv4_test
|
||||
|
||||
// Differentiated Services Field Codepoints, Updated: 2010-05-11
|
||||
const (
|
||||
DiffServCS0 = 0x0 // CS0
|
||||
DiffServCS1 = 0x20 // CS1
|
||||
DiffServCS2 = 0x40 // CS2
|
||||
DiffServCS3 = 0x60 // CS3
|
||||
DiffServCS4 = 0x80 // CS4
|
||||
DiffServCS5 = 0xa0 // CS5
|
||||
DiffServCS6 = 0xc0 // CS6
|
||||
DiffServCS7 = 0xe0 // CS7
|
||||
DiffServAF11 = 0x28 // AF11
|
||||
DiffServAF12 = 0x30 // AF12
|
||||
DiffServAF13 = 0x38 // AF13
|
||||
DiffServAF21 = 0x48 // AF21
|
||||
DiffServAF22 = 0x50 // AF22
|
||||
DiffServAF23 = 0x58 // AF23
|
||||
DiffServAF31 = 0x68 // AF31
|
||||
DiffServAF32 = 0x70 // AF32
|
||||
DiffServAF33 = 0x78 // AF33
|
||||
DiffServAF41 = 0x88 // AF41
|
||||
DiffServAF42 = 0x90 // AF42
|
||||
DiffServAF43 = 0x98 // AF43
|
||||
DiffServEFPHB = 0xb8 // EF PHB
|
||||
DiffServVOICEADMIT = 0xb0 // VOICE-ADMIT
|
||||
)
|
||||
|
||||
// IPv4 TOS Byte and IPv6 Traffic Class Octet, Updated: 2001-09-06
|
||||
const (
|
||||
NotECNTransport = 0x0 // Not-ECT (Not ECN-Capable Transport)
|
||||
ECNTransport1 = 0x1 // ECT(1) (ECN-Capable Transport(1))
|
||||
ECNTransport0 = 0x2 // ECT(0) (ECN-Capable Transport(0))
|
||||
CongestionExperienced = 0x3 // CE (Congestion Experienced)
|
||||
)
|
||||
16
ipv4/icmp.go
Normal file
16
ipv4/icmp.go
Normal file
@@ -0,0 +1,16 @@
|
||||
// Copyright 2013 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package ipv4
|
||||
|
||||
// An ICMPType represents a type of ICMP message.
|
||||
type ICMPType int
|
||||
|
||||
func (typ ICMPType) String() string {
|
||||
s, ok := icmpTypes[typ]
|
||||
if !ok {
|
||||
return "<nil>"
|
||||
}
|
||||
return s
|
||||
}
|
||||
@@ -5,22 +5,16 @@
|
||||
package ipv4_test
|
||||
|
||||
import (
|
||||
"code.google.com/p/go.net/ipv4"
|
||||
"errors"
|
||||
"flag"
|
||||
)
|
||||
|
||||
var testExternal = flag.Bool("external", true, "allow use of external networks during long test")
|
||||
|
||||
const (
|
||||
icmpv4EchoRequest = 8
|
||||
icmpv4EchoReply = 0
|
||||
icmpv6EchoRequest = 128
|
||||
icmpv6EchoReply = 129
|
||||
)
|
||||
|
||||
// icmpMessage represents an ICMP message.
|
||||
type icmpMessage struct {
|
||||
Type int // type
|
||||
Type ipv4.ICMPType // type
|
||||
Code int // code
|
||||
Checksum int // checksum
|
||||
Body icmpMessageBody // body
|
||||
@@ -43,10 +37,6 @@ func (m *icmpMessage) Marshal() ([]byte, error) {
|
||||
}
|
||||
b = append(b, mb...)
|
||||
}
|
||||
switch m.Type {
|
||||
case icmpv6EchoRequest, icmpv6EchoReply:
|
||||
return b, nil
|
||||
}
|
||||
csumcv := len(b) - 1 // checksum coverage
|
||||
s := uint32(0)
|
||||
for i := 0; i < csumcv; i += 2 {
|
||||
@@ -70,11 +60,11 @@ func parseICMPMessage(b []byte) (*icmpMessage, error) {
|
||||
if msglen < 4 {
|
||||
return nil, errors.New("message too short")
|
||||
}
|
||||
m := &icmpMessage{Type: int(b[0]), Code: int(b[1]), Checksum: int(b[2])<<8 | int(b[3])}
|
||||
m := &icmpMessage{Type: ipv4.ICMPType(b[0]), Code: int(b[1]), Checksum: int(b[2])<<8 | int(b[3])}
|
||||
if msglen > 4 {
|
||||
var err error
|
||||
switch m.Type {
|
||||
case icmpv4EchoRequest, icmpv4EchoReply, icmpv6EchoRequest, icmpv6EchoReply:
|
||||
case ipv4.ICMPTypeEcho, ipv4.ICMPTypeEchoReply:
|
||||
m.Body, err = parseICMPEcho(b[4:])
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
||||
@@ -85,7 +85,7 @@ func TestReadWriteMulticastIPPayloadICMP(t *testing.T) {
|
||||
cf := ipv4.FlagTTL | ipv4.FlagDst | ipv4.FlagInterface
|
||||
for i, toggle := range []bool{true, false, true} {
|
||||
wb, err := (&icmpMessage{
|
||||
Type: icmpv4EchoRequest, Code: 0,
|
||||
Type: ipv4.ICMPTypeEcho, Code: 0,
|
||||
Body: &icmpEcho{
|
||||
ID: os.Getpid() & 0xffff, Seq: i + 1,
|
||||
Data: []byte("HELLO-R-U-THERE"),
|
||||
@@ -102,8 +102,8 @@ func TestReadWriteMulticastIPPayloadICMP(t *testing.T) {
|
||||
if err != nil {
|
||||
t.Fatalf("parseICMPMessage failed: %v", err)
|
||||
}
|
||||
if m.Type != icmpv4EchoReply || m.Code != 0 {
|
||||
t.Fatalf("got type=%v, code=%v; expected type=%v, code=%v", m.Type, m.Code, icmpv4EchoReply, 0)
|
||||
if m.Type != ipv4.ICMPTypeEchoReply || m.Code != 0 {
|
||||
t.Fatalf("got type=%v, code=%v; expected type=%v, code=%v", m.Type, m.Code, ipv4.ICMPTypeEchoReply, 0)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -144,7 +144,7 @@ func TestReadWriteMulticastIPDatagram(t *testing.T) {
|
||||
cf := ipv4.FlagTTL | ipv4.FlagDst | ipv4.FlagInterface
|
||||
for i, toggle := range []bool{true, false, true} {
|
||||
wb, err := (&icmpMessage{
|
||||
Type: icmpv4EchoRequest, Code: 0,
|
||||
Type: ipv4.ICMPTypeEcho, Code: 0,
|
||||
Body: &icmpEcho{
|
||||
ID: os.Getpid() & 0xffff, Seq: i + 1,
|
||||
Data: []byte("HELLO-R-U-THERE"),
|
||||
@@ -161,8 +161,8 @@ func TestReadWriteMulticastIPDatagram(t *testing.T) {
|
||||
if err != nil {
|
||||
t.Fatalf("parseICMPMessage failed: %v", err)
|
||||
}
|
||||
if m.Type != icmpv4EchoReply || m.Code != 0 {
|
||||
t.Fatalf("got type=%v, code=%v; expected type=%v, code=%v", m.Type, m.Code, icmpv4EchoReply, 0)
|
||||
if m.Type != ipv4.ICMPTypeEchoReply || m.Code != 0 {
|
||||
t.Fatalf("got type=%v, code=%v; expected type=%v, code=%v", m.Type, m.Code, ipv4.ICMPTypeEchoReply, 0)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,8 +33,8 @@ type multicastSockoptTest struct {
|
||||
}
|
||||
|
||||
var multicastSockoptTests = []multicastSockoptTest{
|
||||
{ipv4.DSCP_CS0 | ipv4.ECN_NOTECT, 127, 128, false, net.IPv4(224, 0, 0, 249)}, // see RFC 4727
|
||||
{ipv4.DSCP_AF11 | ipv4.ECN_NOTECT, 255, 254, true, net.IPv4(224, 0, 0, 250)}, // see RFC 4727
|
||||
{DiffServCS0 | NotECNTransport, 127, 128, false, net.IPv4(224, 0, 0, 249)}, // see RFC 4727
|
||||
{DiffServAF11 | NotECNTransport, 255, 254, true, net.IPv4(224, 0, 0, 250)}, // see RFC 4727
|
||||
}
|
||||
|
||||
func TestUDPMulticastSockopt(t *testing.T) {
|
||||
|
||||
@@ -13,7 +13,7 @@ import (
|
||||
)
|
||||
|
||||
func ipv4MulticastTTL(fd int) (int, error) {
|
||||
v, err := syscall.GetsockoptByte(fd, syscall.IPPROTO_IP, syscall.IP_MULTICAST_TTL)
|
||||
v, err := syscall.GetsockoptByte(fd, ianaProtocolIP, syscall.IP_MULTICAST_TTL)
|
||||
if err != nil {
|
||||
return 0, os.NewSyscallError("getsockopt", err)
|
||||
}
|
||||
@@ -21,7 +21,7 @@ func ipv4MulticastTTL(fd int) (int, error) {
|
||||
}
|
||||
|
||||
func setIPv4MulticastTTL(fd int, v int) error {
|
||||
err := syscall.SetsockoptByte(fd, syscall.IPPROTO_IP, syscall.IP_MULTICAST_TTL, byte(v))
|
||||
err := syscall.SetsockoptByte(fd, ianaProtocolIP, syscall.IP_MULTICAST_TTL, byte(v))
|
||||
if err != nil {
|
||||
return os.NewSyscallError("setsockopt", err)
|
||||
}
|
||||
@@ -29,7 +29,7 @@ func setIPv4MulticastTTL(fd int, v int) error {
|
||||
}
|
||||
|
||||
func ipv4ReceiveDestinationAddress(fd int) (bool, error) {
|
||||
v, err := syscall.GetsockoptInt(fd, syscall.IPPROTO_IP, syscall.IP_RECVDSTADDR)
|
||||
v, err := syscall.GetsockoptInt(fd, ianaProtocolIP, syscall.IP_RECVDSTADDR)
|
||||
if err != nil {
|
||||
return false, os.NewSyscallError("getsockopt", err)
|
||||
}
|
||||
@@ -37,7 +37,7 @@ func ipv4ReceiveDestinationAddress(fd int) (bool, error) {
|
||||
}
|
||||
|
||||
func setIPv4ReceiveDestinationAddress(fd int, v bool) error {
|
||||
err := syscall.SetsockoptInt(fd, syscall.IPPROTO_IP, syscall.IP_RECVDSTADDR, boolint(v))
|
||||
err := syscall.SetsockoptInt(fd, ianaProtocolIP, syscall.IP_RECVDSTADDR, boolint(v))
|
||||
if err != nil {
|
||||
return os.NewSyscallError("setsockopt", err)
|
||||
}
|
||||
@@ -45,7 +45,7 @@ func setIPv4ReceiveDestinationAddress(fd int, v bool) error {
|
||||
}
|
||||
|
||||
func ipv4ReceiveInterface(fd int) (bool, error) {
|
||||
v, err := syscall.GetsockoptInt(fd, syscall.IPPROTO_IP, syscall.IP_RECVIF)
|
||||
v, err := syscall.GetsockoptInt(fd, ianaProtocolIP, syscall.IP_RECVIF)
|
||||
if err != nil {
|
||||
return false, os.NewSyscallError("getsockopt", err)
|
||||
}
|
||||
@@ -53,7 +53,7 @@ func ipv4ReceiveInterface(fd int) (bool, error) {
|
||||
}
|
||||
|
||||
func setIPv4ReceiveInterface(fd int, v bool) error {
|
||||
err := syscall.SetsockoptInt(fd, syscall.IPPROTO_IP, syscall.IP_RECVIF, boolint(v))
|
||||
err := syscall.SetsockoptInt(fd, ianaProtocolIP, syscall.IP_RECVIF, boolint(v))
|
||||
if err != nil {
|
||||
return os.NewSyscallError("setsockopt", err)
|
||||
}
|
||||
@@ -61,7 +61,7 @@ func setIPv4ReceiveInterface(fd int, v bool) error {
|
||||
}
|
||||
|
||||
func ipv4MulticastInterface(fd int) (*net.Interface, error) {
|
||||
a, err := syscall.GetsockoptInet4Addr(fd, syscall.IPPROTO_IP, syscall.IP_MULTICAST_IF)
|
||||
a, err := syscall.GetsockoptInet4Addr(fd, ianaProtocolIP, syscall.IP_MULTICAST_IF)
|
||||
if err != nil {
|
||||
return nil, os.NewSyscallError("getsockopt", err)
|
||||
}
|
||||
@@ -75,7 +75,7 @@ func setIPv4MulticastInterface(fd int, ifi *net.Interface) error {
|
||||
}
|
||||
var a [4]byte
|
||||
copy(a[:], ip.To4())
|
||||
err = syscall.SetsockoptInet4Addr(fd, syscall.IPPROTO_IP, syscall.IP_MULTICAST_IF, a)
|
||||
err = syscall.SetsockoptInet4Addr(fd, ianaProtocolIP, syscall.IP_MULTICAST_IF, a)
|
||||
if err != nil {
|
||||
return os.NewSyscallError("setsockopt", err)
|
||||
}
|
||||
@@ -83,7 +83,7 @@ func setIPv4MulticastInterface(fd int, ifi *net.Interface) error {
|
||||
}
|
||||
|
||||
func ipv4MulticastLoopback(fd int) (bool, error) {
|
||||
v, err := syscall.GetsockoptByte(fd, syscall.IPPROTO_IP, syscall.IP_MULTICAST_LOOP)
|
||||
v, err := syscall.GetsockoptByte(fd, ianaProtocolIP, syscall.IP_MULTICAST_LOOP)
|
||||
if err != nil {
|
||||
return false, os.NewSyscallError("getsockopt", err)
|
||||
}
|
||||
@@ -91,7 +91,7 @@ func ipv4MulticastLoopback(fd int) (bool, error) {
|
||||
}
|
||||
|
||||
func setIPv4MulticastLoopback(fd int, v bool) error {
|
||||
err := syscall.SetsockoptByte(fd, syscall.IPPROTO_IP, syscall.IP_MULTICAST_LOOP, byte(boolint(v)))
|
||||
err := syscall.SetsockoptByte(fd, ianaProtocolIP, syscall.IP_MULTICAST_LOOP, byte(boolint(v)))
|
||||
if err != nil {
|
||||
return os.NewSyscallError("setsockopt", err)
|
||||
}
|
||||
@@ -103,7 +103,7 @@ func joinIPv4Group(fd int, ifi *net.Interface, grp net.IP) error {
|
||||
if err := setSyscallIPMreq(mreq, ifi); err != nil {
|
||||
return err
|
||||
}
|
||||
err := syscall.SetsockoptIPMreq(fd, syscall.IPPROTO_IP, syscall.IP_ADD_MEMBERSHIP, mreq)
|
||||
err := syscall.SetsockoptIPMreq(fd, ianaProtocolIP, syscall.IP_ADD_MEMBERSHIP, mreq)
|
||||
if err != nil {
|
||||
return os.NewSyscallError("setsockopt", err)
|
||||
}
|
||||
@@ -115,7 +115,7 @@ func leaveIPv4Group(fd int, ifi *net.Interface, grp net.IP) error {
|
||||
if err := setSyscallIPMreq(mreq, ifi); err != nil {
|
||||
return err
|
||||
}
|
||||
err := syscall.SetsockoptIPMreq(fd, syscall.IPPROTO_IP, syscall.IP_DROP_MEMBERSHIP, mreq)
|
||||
err := syscall.SetsockoptIPMreq(fd, ianaProtocolIP, syscall.IP_DROP_MEMBERSHIP, mreq)
|
||||
if err != nil {
|
||||
return os.NewSyscallError("setsockopt", err)
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ import (
|
||||
)
|
||||
|
||||
func ipv4SendSourceAddress(fd int) (bool, error) {
|
||||
v, err := syscall.GetsockoptInt(fd, syscall.IPPROTO_IP, syscall.IP_SENDSRCADDR)
|
||||
v, err := syscall.GetsockoptInt(fd, ianaProtocolIP, syscall.IP_SENDSRCADDR)
|
||||
if err != nil {
|
||||
return false, os.NewSyscallError("getsockopt", err)
|
||||
}
|
||||
@@ -18,7 +18,7 @@ func ipv4SendSourceAddress(fd int) (bool, error) {
|
||||
}
|
||||
|
||||
func setIPv4SendSourceAddress(fd int, v bool) error {
|
||||
err := syscall.SetsockoptInt(fd, syscall.IPPROTO_IP, syscall.IP_SENDSRCADDR, boolint(v))
|
||||
err := syscall.SetsockoptInt(fd, ianaProtocolIP, syscall.IP_SENDSRCADDR, boolint(v))
|
||||
if err != nil {
|
||||
return os.NewSyscallError("setsockopt", err)
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ import (
|
||||
)
|
||||
|
||||
func ipv4ReceiveTOS(fd int) (bool, error) {
|
||||
v, err := syscall.GetsockoptInt(fd, syscall.IPPROTO_IP, syscall.IP_RECVTOS)
|
||||
v, err := syscall.GetsockoptInt(fd, ianaProtocolIP, syscall.IP_RECVTOS)
|
||||
if err != nil {
|
||||
return false, os.NewSyscallError("getsockopt", err)
|
||||
}
|
||||
@@ -19,7 +19,7 @@ func ipv4ReceiveTOS(fd int) (bool, error) {
|
||||
}
|
||||
|
||||
func setIPv4ReceiveTOS(fd int, v bool) error {
|
||||
err := syscall.SetsockoptInt(fd, syscall.IPPROTO_IP, syscall.IP_RECVTOS, boolint(v))
|
||||
err := syscall.SetsockoptInt(fd, ianaProtocolIP, syscall.IP_RECVTOS, boolint(v))
|
||||
if err != nil {
|
||||
return os.NewSyscallError("setsockopt", err)
|
||||
}
|
||||
@@ -27,7 +27,7 @@ func setIPv4ReceiveTOS(fd int, v bool) error {
|
||||
}
|
||||
|
||||
func ipv4MulticastTTL(fd int) (int, error) {
|
||||
v, err := syscall.GetsockoptInt(fd, syscall.IPPROTO_IP, syscall.IP_MULTICAST_TTL)
|
||||
v, err := syscall.GetsockoptInt(fd, ianaProtocolIP, syscall.IP_MULTICAST_TTL)
|
||||
if err != nil {
|
||||
return 0, os.NewSyscallError("getsockopt", err)
|
||||
}
|
||||
@@ -35,7 +35,7 @@ func ipv4MulticastTTL(fd int) (int, error) {
|
||||
}
|
||||
|
||||
func setIPv4MulticastTTL(fd int, v int) error {
|
||||
err := syscall.SetsockoptInt(fd, syscall.IPPROTO_IP, syscall.IP_MULTICAST_TTL, v)
|
||||
err := syscall.SetsockoptInt(fd, ianaProtocolIP, syscall.IP_MULTICAST_TTL, v)
|
||||
if err != nil {
|
||||
return os.NewSyscallError("setsockopt", err)
|
||||
}
|
||||
@@ -43,7 +43,7 @@ func setIPv4MulticastTTL(fd int, v int) error {
|
||||
}
|
||||
|
||||
func ipv4PacketInfo(fd int) (bool, error) {
|
||||
v, err := syscall.GetsockoptInt(fd, syscall.IPPROTO_IP, syscall.IP_PKTINFO)
|
||||
v, err := syscall.GetsockoptInt(fd, ianaProtocolIP, syscall.IP_PKTINFO)
|
||||
if err != nil {
|
||||
return false, os.NewSyscallError("getsockopt", err)
|
||||
}
|
||||
@@ -51,7 +51,7 @@ func ipv4PacketInfo(fd int) (bool, error) {
|
||||
}
|
||||
|
||||
func setIPv4PacketInfo(fd int, v bool) error {
|
||||
err := syscall.SetsockoptInt(fd, syscall.IPPROTO_IP, syscall.IP_PKTINFO, boolint(v))
|
||||
err := syscall.SetsockoptInt(fd, ianaProtocolIP, syscall.IP_PKTINFO, boolint(v))
|
||||
if err != nil {
|
||||
return os.NewSyscallError("setsockopt", err)
|
||||
}
|
||||
@@ -59,7 +59,7 @@ func setIPv4PacketInfo(fd int, v bool) error {
|
||||
}
|
||||
|
||||
func ipv4MulticastInterface(fd int) (*net.Interface, error) {
|
||||
mreqn, err := syscall.GetsockoptIPMreqn(fd, syscall.IPPROTO_IP, syscall.IP_MULTICAST_IF)
|
||||
mreqn, err := syscall.GetsockoptIPMreqn(fd, ianaProtocolIP, syscall.IP_MULTICAST_IF)
|
||||
if err != nil {
|
||||
return nil, os.NewSyscallError("getsockopt", err)
|
||||
}
|
||||
@@ -74,7 +74,7 @@ func setIPv4MulticastInterface(fd int, ifi *net.Interface) error {
|
||||
if ifi != nil {
|
||||
mreqn.Ifindex = int32(ifi.Index)
|
||||
}
|
||||
err := syscall.SetsockoptIPMreqn(fd, syscall.IPPROTO_IP, syscall.IP_MULTICAST_IF, mreqn)
|
||||
err := syscall.SetsockoptIPMreqn(fd, ianaProtocolIP, syscall.IP_MULTICAST_IF, mreqn)
|
||||
if err != nil {
|
||||
return os.NewSyscallError("setsockopt", err)
|
||||
}
|
||||
@@ -82,7 +82,7 @@ func setIPv4MulticastInterface(fd int, ifi *net.Interface) error {
|
||||
}
|
||||
|
||||
func ipv4MulticastLoopback(fd int) (bool, error) {
|
||||
v, err := syscall.GetsockoptInt(fd, syscall.IPPROTO_IP, syscall.IP_MULTICAST_LOOP)
|
||||
v, err := syscall.GetsockoptInt(fd, ianaProtocolIP, syscall.IP_MULTICAST_LOOP)
|
||||
if err != nil {
|
||||
return false, os.NewSyscallError("getsockopt", err)
|
||||
}
|
||||
@@ -90,7 +90,7 @@ func ipv4MulticastLoopback(fd int) (bool, error) {
|
||||
}
|
||||
|
||||
func setIPv4MulticastLoopback(fd int, v bool) error {
|
||||
err := syscall.SetsockoptInt(fd, syscall.IPPROTO_IP, syscall.IP_MULTICAST_LOOP, boolint(v))
|
||||
err := syscall.SetsockoptInt(fd, ianaProtocolIP, syscall.IP_MULTICAST_LOOP, boolint(v))
|
||||
if err != nil {
|
||||
return os.NewSyscallError("setsockopt", err)
|
||||
}
|
||||
@@ -102,7 +102,7 @@ func joinIPv4Group(fd int, ifi *net.Interface, grp net.IP) error {
|
||||
if ifi != nil {
|
||||
mreqn.Ifindex = int32(ifi.Index)
|
||||
}
|
||||
err := syscall.SetsockoptIPMreqn(fd, syscall.IPPROTO_IP, syscall.IP_ADD_MEMBERSHIP, mreqn)
|
||||
err := syscall.SetsockoptIPMreqn(fd, ianaProtocolIP, syscall.IP_ADD_MEMBERSHIP, mreqn)
|
||||
if err != nil {
|
||||
return os.NewSyscallError("setsockopt", err)
|
||||
}
|
||||
@@ -114,7 +114,7 @@ func leaveIPv4Group(fd int, ifi *net.Interface, grp net.IP) error {
|
||||
if ifi != nil {
|
||||
mreqn.Ifindex = int32(ifi.Index)
|
||||
}
|
||||
err := syscall.SetsockoptIPMreqn(fd, syscall.IPPROTO_IP, syscall.IP_DROP_MEMBERSHIP, mreqn)
|
||||
err := syscall.SetsockoptIPMreqn(fd, ianaProtocolIP, syscall.IP_DROP_MEMBERSHIP, mreqn)
|
||||
if err != nil {
|
||||
return os.NewSyscallError("setsockopt", err)
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ import (
|
||||
)
|
||||
|
||||
func ipv4TOS(fd int) (int, error) {
|
||||
v, err := syscall.GetsockoptInt(fd, syscall.IPPROTO_IP, syscall.IP_TOS)
|
||||
v, err := syscall.GetsockoptInt(fd, ianaProtocolIP, syscall.IP_TOS)
|
||||
if err != nil {
|
||||
return 0, os.NewSyscallError("getsockopt", err)
|
||||
}
|
||||
@@ -20,7 +20,7 @@ func ipv4TOS(fd int) (int, error) {
|
||||
}
|
||||
|
||||
func setIPv4TOS(fd int, v int) error {
|
||||
err := syscall.SetsockoptInt(fd, syscall.IPPROTO_IP, syscall.IP_TOS, v)
|
||||
err := syscall.SetsockoptInt(fd, ianaProtocolIP, syscall.IP_TOS, v)
|
||||
if err != nil {
|
||||
return os.NewSyscallError("setsockopt", err)
|
||||
}
|
||||
@@ -28,7 +28,7 @@ func setIPv4TOS(fd int, v int) error {
|
||||
}
|
||||
|
||||
func ipv4TTL(fd int) (int, error) {
|
||||
v, err := syscall.GetsockoptInt(fd, syscall.IPPROTO_IP, syscall.IP_TTL)
|
||||
v, err := syscall.GetsockoptInt(fd, ianaProtocolIP, syscall.IP_TTL)
|
||||
if err != nil {
|
||||
return 0, os.NewSyscallError("getsockopt", err)
|
||||
}
|
||||
@@ -36,7 +36,7 @@ func ipv4TTL(fd int) (int, error) {
|
||||
}
|
||||
|
||||
func setIPv4TTL(fd int, v int) error {
|
||||
err := syscall.SetsockoptInt(fd, syscall.IPPROTO_IP, syscall.IP_TTL, v)
|
||||
err := syscall.SetsockoptInt(fd, ianaProtocolIP, syscall.IP_TTL, v)
|
||||
if err != nil {
|
||||
return os.NewSyscallError("setsockopt", err)
|
||||
}
|
||||
@@ -44,7 +44,7 @@ func setIPv4TTL(fd int, v int) error {
|
||||
}
|
||||
|
||||
func ipv4ReceiveTTL(fd int) (bool, error) {
|
||||
v, err := syscall.GetsockoptInt(fd, syscall.IPPROTO_IP, syscall.IP_RECVTTL)
|
||||
v, err := syscall.GetsockoptInt(fd, ianaProtocolIP, syscall.IP_RECVTTL)
|
||||
if err != nil {
|
||||
return false, os.NewSyscallError("getsockopt", err)
|
||||
}
|
||||
@@ -52,7 +52,7 @@ func ipv4ReceiveTTL(fd int) (bool, error) {
|
||||
}
|
||||
|
||||
func setIPv4ReceiveTTL(fd int, v bool) error {
|
||||
err := syscall.SetsockoptInt(fd, syscall.IPPROTO_IP, syscall.IP_RECVTTL, boolint(v))
|
||||
err := syscall.SetsockoptInt(fd, ianaProtocolIP, syscall.IP_RECVTTL, boolint(v))
|
||||
if err != nil {
|
||||
return os.NewSyscallError("setsockopt", err)
|
||||
}
|
||||
@@ -60,7 +60,7 @@ func setIPv4ReceiveTTL(fd int, v bool) error {
|
||||
}
|
||||
|
||||
func ipv4HeaderPrepend(fd int) (bool, error) {
|
||||
v, err := syscall.GetsockoptInt(fd, syscall.IPPROTO_IP, syscall.IP_HDRINCL)
|
||||
v, err := syscall.GetsockoptInt(fd, ianaProtocolIP, syscall.IP_HDRINCL)
|
||||
if err != nil {
|
||||
return false, os.NewSyscallError("getsockopt", err)
|
||||
}
|
||||
@@ -68,7 +68,7 @@ func ipv4HeaderPrepend(fd int) (bool, error) {
|
||||
}
|
||||
|
||||
func setIPv4HeaderPrepend(fd int, v bool) error {
|
||||
err := syscall.SetsockoptInt(fd, syscall.IPPROTO_IP, syscall.IP_HDRINCL, boolint(v))
|
||||
err := syscall.SetsockoptInt(fd, ianaProtocolIP, syscall.IP_HDRINCL, boolint(v))
|
||||
if err != nil {
|
||||
return os.NewSyscallError("setsockopt", err)
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@ import (
|
||||
func ipv4TOS(fd syscall.Handle) (int, error) {
|
||||
var v int32
|
||||
l := int32(4)
|
||||
err := syscall.Getsockopt(fd, int32(syscall.IPPROTO_IP), int32(syscall.IP_TOS), (*byte)(unsafe.Pointer(&v)), &l)
|
||||
err := syscall.Getsockopt(fd, ianaProtocolIP, syscall.IP_TOS, (*byte)(unsafe.Pointer(&v)), &l)
|
||||
if err != nil {
|
||||
return 0, os.NewSyscallError("getsockopt", err)
|
||||
}
|
||||
@@ -26,7 +26,7 @@ func ipv4TOS(fd syscall.Handle) (int, error) {
|
||||
|
||||
func setIPv4TOS(fd syscall.Handle, v int) error {
|
||||
vv := int32(v)
|
||||
err := syscall.Setsockopt(fd, int32(syscall.IPPROTO_IP), int32(syscall.IP_TOS), (*byte)(unsafe.Pointer(&vv)), 4)
|
||||
err := syscall.Setsockopt(fd, ianaProtocolIP, syscall.IP_TOS, (*byte)(unsafe.Pointer(&vv)), 4)
|
||||
if err != nil {
|
||||
return os.NewSyscallError("setsockopt", err)
|
||||
}
|
||||
@@ -36,7 +36,7 @@ func setIPv4TOS(fd syscall.Handle, v int) error {
|
||||
func ipv4TTL(fd syscall.Handle) (int, error) {
|
||||
var v int32
|
||||
l := int32(4)
|
||||
err := syscall.Getsockopt(fd, int32(syscall.IPPROTO_IP), int32(syscall.IP_TTL), (*byte)(unsafe.Pointer(&v)), &l)
|
||||
err := syscall.Getsockopt(fd, ianaProtocolIP, syscall.IP_TTL, (*byte)(unsafe.Pointer(&v)), &l)
|
||||
if err != nil {
|
||||
return 0, os.NewSyscallError("getsockopt", err)
|
||||
}
|
||||
@@ -45,7 +45,7 @@ func ipv4TTL(fd syscall.Handle) (int, error) {
|
||||
|
||||
func setIPv4TTL(fd syscall.Handle, v int) error {
|
||||
vv := int32(v)
|
||||
err := syscall.Setsockopt(fd, int32(syscall.IPPROTO_IP), int32(syscall.IP_TTL), (*byte)(unsafe.Pointer(&vv)), 4)
|
||||
err := syscall.Setsockopt(fd, ianaProtocolIP, syscall.IP_TTL, (*byte)(unsafe.Pointer(&vv)), 4)
|
||||
if err != nil {
|
||||
return os.NewSyscallError("setsockopt", err)
|
||||
}
|
||||
@@ -55,7 +55,7 @@ func setIPv4TTL(fd syscall.Handle, v int) error {
|
||||
func ipv4MulticastTTL(fd syscall.Handle) (int, error) {
|
||||
var v int32
|
||||
l := int32(4)
|
||||
err := syscall.Getsockopt(fd, int32(syscall.IPPROTO_IP), int32(syscall.IP_MULTICAST_TTL), (*byte)(unsafe.Pointer(&v)), &l)
|
||||
err := syscall.Getsockopt(fd, ianaProtocolIP, syscall.IP_MULTICAST_TTL, (*byte)(unsafe.Pointer(&v)), &l)
|
||||
if err != nil {
|
||||
return 0, os.NewSyscallError("getsockopt", err)
|
||||
}
|
||||
@@ -64,7 +64,7 @@ func ipv4MulticastTTL(fd syscall.Handle) (int, error) {
|
||||
|
||||
func setIPv4MulticastTTL(fd syscall.Handle, v int) error {
|
||||
vv := int32(v)
|
||||
err := syscall.Setsockopt(fd, int32(syscall.IPPROTO_IP), int32(syscall.IP_MULTICAST_TTL), (*byte)(unsafe.Pointer(&vv)), 4)
|
||||
err := syscall.Setsockopt(fd, ianaProtocolIP, syscall.IP_MULTICAST_TTL, (*byte)(unsafe.Pointer(&vv)), 4)
|
||||
if err != nil {
|
||||
return os.NewSyscallError("setsockopt", err)
|
||||
}
|
||||
@@ -114,7 +114,7 @@ func setIPv4ReceiveInterface(fd syscall.Handle, v bool) error {
|
||||
func ipv4MulticastInterface(fd syscall.Handle) (*net.Interface, error) {
|
||||
var a [4]byte
|
||||
l := int32(4)
|
||||
err := syscall.Getsockopt(fd, int32(syscall.IPPROTO_IP), int32(syscall.IP_MULTICAST_IF), (*byte)(unsafe.Pointer(&a[0])), &l)
|
||||
err := syscall.Getsockopt(fd, ianaProtocolIP, syscall.IP_MULTICAST_IF, (*byte)(unsafe.Pointer(&a[0])), &l)
|
||||
if err != nil {
|
||||
return nil, os.NewSyscallError("getsockopt", err)
|
||||
}
|
||||
@@ -128,7 +128,7 @@ func setIPv4MulticastInterface(fd syscall.Handle, ifi *net.Interface) error {
|
||||
}
|
||||
var a [4]byte
|
||||
copy(a[:], ip.To4())
|
||||
err = syscall.Setsockopt(fd, int32(syscall.IPPROTO_IP), int32(syscall.IP_MULTICAST_IF), (*byte)(unsafe.Pointer(&a[0])), 4)
|
||||
err = syscall.Setsockopt(fd, ianaProtocolIP, syscall.IP_MULTICAST_IF, (*byte)(unsafe.Pointer(&a[0])), 4)
|
||||
if err != nil {
|
||||
return os.NewSyscallError("setsockopt", err)
|
||||
}
|
||||
@@ -138,7 +138,7 @@ func setIPv4MulticastInterface(fd syscall.Handle, ifi *net.Interface) error {
|
||||
func ipv4MulticastLoopback(fd syscall.Handle) (bool, error) {
|
||||
var v int32
|
||||
l := int32(4)
|
||||
err := syscall.Getsockopt(fd, int32(syscall.IPPROTO_IP), int32(syscall.IP_MULTICAST_LOOP), (*byte)(unsafe.Pointer(&v)), &l)
|
||||
err := syscall.Getsockopt(fd, ianaProtocolIP, syscall.IP_MULTICAST_LOOP, (*byte)(unsafe.Pointer(&v)), &l)
|
||||
if err != nil {
|
||||
return false, os.NewSyscallError("getsockopt", err)
|
||||
}
|
||||
@@ -147,7 +147,7 @@ func ipv4MulticastLoopback(fd syscall.Handle) (bool, error) {
|
||||
|
||||
func setIPv4MulticastLoopback(fd syscall.Handle, v bool) error {
|
||||
vv := int32(boolint(v))
|
||||
err := syscall.Setsockopt(fd, int32(syscall.IPPROTO_IP), int32(syscall.IP_MULTICAST_LOOP), (*byte)(unsafe.Pointer(&vv)), 4)
|
||||
err := syscall.Setsockopt(fd, ianaProtocolIP, syscall.IP_MULTICAST_LOOP, (*byte)(unsafe.Pointer(&vv)), 4)
|
||||
if err != nil {
|
||||
return os.NewSyscallError("setsockopt", err)
|
||||
}
|
||||
@@ -159,7 +159,7 @@ func joinIPv4Group(fd syscall.Handle, ifi *net.Interface, grp net.IP) error {
|
||||
if err := setSyscallIPMreq(mreq, ifi); err != nil {
|
||||
return err
|
||||
}
|
||||
err := syscall.Setsockopt(fd, int32(syscall.IPPROTO_IP), int32(syscall.IP_ADD_MEMBERSHIP), (*byte)(unsafe.Pointer(mreq)), int32(unsafe.Sizeof(*mreq)))
|
||||
err := syscall.Setsockopt(fd, ianaProtocolIP, syscall.IP_ADD_MEMBERSHIP, (*byte)(unsafe.Pointer(mreq)), int32(unsafe.Sizeof(*mreq)))
|
||||
if err != nil {
|
||||
return os.NewSyscallError("setsockopt", err)
|
||||
}
|
||||
@@ -171,7 +171,7 @@ func leaveIPv4Group(fd syscall.Handle, ifi *net.Interface, grp net.IP) error {
|
||||
if err := setSyscallIPMreq(mreq, ifi); err != nil {
|
||||
return err
|
||||
}
|
||||
err := syscall.Setsockopt(fd, int32(syscall.IPPROTO_IP), int32(syscall.IP_DROP_MEMBERSHIP), (*byte)(unsafe.Pointer(mreq)), int32(unsafe.Sizeof(*mreq)))
|
||||
err := syscall.Setsockopt(fd, ianaProtocolIP, syscall.IP_DROP_MEMBERSHIP, (*byte)(unsafe.Pointer(mreq)), int32(unsafe.Sizeof(*mreq)))
|
||||
if err != nil {
|
||||
return os.NewSyscallError("setsockopt", err)
|
||||
}
|
||||
|
||||
@@ -53,7 +53,7 @@ func TestReadWriteUnicastIPPayloadICMP(t *testing.T) {
|
||||
cf := ipv4.FlagTTL | ipv4.FlagDst | ipv4.FlagInterface
|
||||
for i, toggle := range []bool{true, false, true} {
|
||||
wb, err := (&icmpMessage{
|
||||
Type: icmpv4EchoRequest, Code: 0,
|
||||
Type: ipv4.ICMPTypeEcho, Code: 0,
|
||||
Body: &icmpEcho{
|
||||
ID: os.Getpid() & 0xffff, Seq: i + 1,
|
||||
Data: []byte("HELLO-R-U-THERE"),
|
||||
@@ -70,8 +70,8 @@ func TestReadWriteUnicastIPPayloadICMP(t *testing.T) {
|
||||
if err != nil {
|
||||
t.Fatalf("parseICMPMessage failed: %v", err)
|
||||
}
|
||||
if m.Type != icmpv4EchoReply || m.Code != 0 {
|
||||
t.Fatalf("got type=%v, code=%v; expected type=%v, code=%v", m.Type, m.Code, icmpv4EchoReply, 0)
|
||||
if m.Type != ipv4.ICMPTypeEchoReply || m.Code != 0 {
|
||||
t.Fatalf("got type=%v, code=%v; expected type=%v, code=%v", m.Type, m.Code, ipv4.ICMPTypeEchoReply, 0)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -98,7 +98,7 @@ func TestReadWriteUnicastIPDatagram(t *testing.T) {
|
||||
cf := ipv4.FlagTTL | ipv4.FlagDst | ipv4.FlagInterface
|
||||
for i, toggle := range []bool{true, false, true} {
|
||||
wb, err := (&icmpMessage{
|
||||
Type: icmpv4EchoRequest, Code: 0,
|
||||
Type: ipv4.ICMPTypeEcho, Code: 0,
|
||||
Body: &icmpEcho{
|
||||
ID: os.Getpid() & 0xffff, Seq: i + 1,
|
||||
Data: []byte("HELLO-R-U-THERE"),
|
||||
@@ -115,8 +115,8 @@ func TestReadWriteUnicastIPDatagram(t *testing.T) {
|
||||
if err != nil {
|
||||
t.Fatalf("parseICMPMessage failed: %v", err)
|
||||
}
|
||||
if m.Type != icmpv4EchoReply || m.Code != 0 {
|
||||
t.Fatalf("got type=%v, code=%v; expected type=%v, code=%v", m.Type, m.Code, icmpv4EchoReply, 0)
|
||||
if m.Type != ipv4.ICMPTypeEchoReply || m.Code != 0 {
|
||||
t.Fatalf("got type=%v, code=%v; expected type=%v, code=%v", m.Type, m.Code, ipv4.ICMPTypeEchoReply, 0)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,8 +28,8 @@ type unicastSockoptTest struct {
|
||||
}
|
||||
|
||||
var unicastSockoptTests = []unicastSockoptTest{
|
||||
{ipv4.DSCP_CS0 | ipv4.ECN_NOTECT, 127},
|
||||
{ipv4.DSCP_AF11 | ipv4.ECN_NOTECT, 255},
|
||||
{DiffServCS0 | NotECNTransport, 127},
|
||||
{DiffServAF11 | NotECNTransport, 255},
|
||||
}
|
||||
|
||||
func TestTCPUnicastSockopt(t *testing.T) {
|
||||
|
||||
Reference in New Issue
Block a user