~smoser/ubuntu/precise/juju-core/cloud-tools

« back to all changes in this revision

Viewing changes to src/code.google.com/p/go.net/ipv4/header.go

  • Committer: Scott Moser
  • Date: 2014-04-14 16:22:55 UTC
  • mfrom: (24.1.11 trusty-proposed)
  • Revision ID: smoser@ubuntu.com-20140414162255-1gco8gmo03v3aff6
* New update for the Ubuntu Cloud Archive.
* New upstream point release, including fixes for:
  - Upgrading juju 1.16.6 -> 1.18.x fails (LP: #1299802).
  - Peer relation disappears during juju-upgrade (LP: #1303697).
  - public-address of units changes to internal bridge post upgrade
    (LP: #1303735).
  - Unable to deploy local charms without series (LP: #1303880).
  - juju scp no longer allows multiple extra arguments to be passed
    (LP: #1306208).
  - juju cannot downgrade to same major.minor version with earlier
    patch number (LP: #1306296).

Show diffs side-by-side

added added

removed removed

Lines of Context:
36
36
        maxHeaderLen = 60 // sensible default, revisit if later RFCs define new usage of version and header length fields
37
37
)
38
38
 
39
 
type headerField int
40
 
 
41
 
const (
42
 
        posTOS      headerField = 1  // type-of-service
43
 
        posTotalLen             = 2  // packet total length
44
 
        posID                   = 4  // identification
45
 
        posFragOff              = 6  // fragment offset
46
 
        posTTL                  = 8  // time-to-live
47
 
        posProtocol             = 9  // next protocol
48
 
        posChecksum             = 10 // checksum
49
 
        posSrc                  = 12 // source address
50
 
        posDst                  = 16 // destination address
 
39
const (
 
40
        posTOS      = 1  // type-of-service
 
41
        posTotalLen = 2  // packet total length
 
42
        posID       = 4  // identification
 
43
        posFragOff  = 6  // fragment offset
 
44
        posTTL      = 8  // time-to-live
 
45
        posProtocol = 9  // next protocol
 
46
        posChecksum = 10 // checksum
 
47
        posSrc      = 12 // source address
 
48
        posDst      = 16 // destination address
 
49
)
 
50
 
 
51
type HeaderFlags int
 
52
 
 
53
const (
 
54
        MoreFragments HeaderFlags = 1 << iota // more fragments flag
 
55
        DontFragment                          // don't fragment flag
51
56
)
52
57
 
53
58
// A Header represents an IPv4 header.
54
59
type Header struct {
55
 
        Version  int    // protocol version
56
 
        Len      int    // header length
57
 
        TOS      int    // type-of-service
58
 
        TotalLen int    // packet total length
59
 
        ID       int    // identification
60
 
        FragOff  int    // fragment offset
61
 
        TTL      int    // time-to-live
62
 
        Protocol int    // next protocol
63
 
        Checksum int    // checksum
64
 
        Src      net.IP // source address
65
 
        Dst      net.IP // destination address
66
 
        Options  []byte // options, extension headers
 
60
        Version  int         // protocol version
 
61
        Len      int         // header length
 
62
        TOS      int         // type-of-service
 
63
        TotalLen int         // packet total length
 
64
        ID       int         // identification
 
65
        Flags    HeaderFlags // flags
 
66
        FragOff  int         // fragment offset
 
67
        TTL      int         // time-to-live
 
68
        Protocol int         // next protocol
 
69
        Checksum int         // checksum
 
70
        Src      net.IP      // source address
 
71
        Dst      net.IP      // destination address
 
72
        Options  []byte      // options, extension headers
67
73
}
68
74
 
69
75
func (h *Header) String() string {
70
76
        if h == nil {
71
77
                return "<nil>"
72
78
        }
73
 
        return fmt.Sprintf("ver: %v, hdrlen: %v, tos: %#x, totallen: %v, id: %#x, fragoff: %#x, ttl: %v, proto: %v, cksum: %#x, src: %v, dst: %v", h.Version, h.Len, h.TOS, h.TotalLen, h.ID, h.FragOff, h.TTL, h.Protocol, h.Checksum, h.Src, h.Dst)
 
79
        return fmt.Sprintf("ver: %v, hdrlen: %v, tos: %#x, totallen: %v, id: %#x, flags: %#x, fragoff: %#x, ttl: %v, proto: %v, cksum: %#x, src: %v, dst: %v", h.Version, h.Len, h.TOS, h.TotalLen, h.ID, h.Flags, h.FragOff, h.TTL, h.Protocol, h.Checksum, h.Src, h.Dst)
74
80
}
75
81
 
76
82
// Please refer to the online manual; IP(4) on Darwin, FreeBSD and
89
95
        b := make([]byte, hdrlen)
90
96
        b[0] = byte(Version<<4 | (hdrlen >> 2 & 0x0f))
91
97
        b[posTOS] = byte(h.TOS)
 
98
        flagsAndFragOff := (h.FragOff & 0x1fff) | int(h.Flags<<13)
92
99
        if supportsNewIPInput {
93
100
                b[posTotalLen], b[posTotalLen+1] = byte(h.TotalLen>>8), byte(h.TotalLen)
94
 
                b[posFragOff], b[posFragOff+1] = byte(h.FragOff>>8), byte(h.FragOff)
 
101
                b[posFragOff], b[posFragOff+1] = byte(flagsAndFragOff>>8), byte(flagsAndFragOff)
95
102
        } else {
96
103
                *(*uint16)(unsafe.Pointer(&b[posTotalLen : posTotalLen+1][0])) = uint16(h.TotalLen)
97
 
                *(*uint16)(unsafe.Pointer(&b[posFragOff : posFragOff+1][0])) = uint16(h.FragOff)
 
104
                *(*uint16)(unsafe.Pointer(&b[posFragOff : posFragOff+1][0])) = uint16(flagsAndFragOff)
98
105
        }
99
106
        b[posID], b[posID+1] = byte(h.ID>>8), byte(h.ID)
100
107
        b[posTTL] = byte(h.TTL)
114
121
        return b, nil
115
122
}
116
123
 
 
124
// See http://www.freebsd.org/doc/en/books/porters-handbook/freebsd-versions.html.
 
125
var freebsdVersion uint32
 
126
 
117
127
// ParseHeader parses b as an IPv4 header.
118
128
func ParseHeader(b []byte) (*Header, error) {
119
129
        if len(b) < HeaderLen {
132
142
                h.FragOff = int(b[posFragOff])<<8 | int(b[posFragOff+1])
133
143
        } else {
134
144
                h.TotalLen = int(*(*uint16)(unsafe.Pointer(&b[posTotalLen : posTotalLen+1][0])))
135
 
                h.TotalLen += hdrlen
 
145
                if runtime.GOOS != "freebsd" || freebsdVersion < 1000000 {
 
146
                        h.TotalLen += hdrlen
 
147
                }
136
148
                h.FragOff = int(*(*uint16)(unsafe.Pointer(&b[posFragOff : posFragOff+1][0])))
137
149
        }
 
150
        h.Flags = HeaderFlags(h.FragOff&0xe000) >> 13
 
151
        h.FragOff = h.FragOff & 0x1fff
138
152
        h.ID = int(b[posID])<<8 | int(b[posID+1])
139
153
        h.TTL = int(b[posTTL])
140
154
        h.Protocol = int(b[posProtocol])