Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code | Sign in
(765)

Delta Between Two Patch Sets: ipv4/example_test.go

Issue 6482044: code review 6482044: go.net/ipv4: new package (Closed)
Left Patch Set: diff -r 147c4a6dca9b https://code.google.com/p/go.net Created 11 years, 7 months ago
Right Patch Set: diff -r 2513e9008213 https://code.google.com/p/go.net Created 11 years, 6 months ago
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments. Please Sign in to add in-line comments.
Jump to:
Right: Side by side diff | Download
« no previous file with change/comment | « ipv4/endpoint.go ('k') | ipv4/genericopt_plan9.go » ('j') | no next file with change/comment »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
LEFTRIGHT
(no file at all)
1 // Copyright 2012 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
4
5 package ipv4_test
6
7 import (
8 "code.google.com/p/go.net/ipv4"
9 "log"
10 "net"
11 )
12
13 func ExampleUnicastTCPListener() {
14 ln, err := net.Listen("tcp4", "0.0.0.0:1024")
15 if err != nil {
16 log.Fatal(err)
17 }
18 defer ln.Close()
19 for {
20 c, err := ln.Accept()
21 if err != nil {
22 log.Fatal(err)
23 }
24 go func(c net.Conn) {
25 defer c.Close()
26 err := ipv4.NewConn(c).SetTOS(ipv4.DSCP_AF11)
27 if err != nil {
28 log.Fatal(err)
29 }
30 _, err = c.Write([]byte("HELLO-R-U-THERE-ACK"))
31 if err != nil {
32 log.Fatal(err)
33 }
34 }(c)
35 }
36 }
37
38 func ExampleMulticastUDPListener() {
39 en0, err := net.InterfaceByName("en0")
40 if err != nil {
41 log.Fatal(err)
42 }
43 en1, err := net.InterfaceByIndex(911)
44 if err != nil {
45 log.Fatal(err)
46 }
47 group := net.IPv4(224, 0, 0, 250)
48
49 c, err := net.ListenPacket("udp4", "0.0.0.0:1024")
50 if err != nil {
51 log.Fatal(err)
52 }
53 defer c.Close()
54
55 p := ipv4.NewPacketConn(c)
56 err = p.JoinGroup(en0, &net.UDPAddr{IP: group})
57 if err != nil {
58 log.Fatal(err)
59 }
60 err = p.JoinGroup(en1, &net.UDPAddr{IP: group})
61 if err != nil {
62 log.Fatal(err)
63 }
64
65 err = p.SetControlMessage(ipv4.FlagDst, true)
66 if err != nil {
67 log.Fatal(err)
68 }
69
70 b := make([]byte, 1500)
71 for {
72 n, cm, src, err := p.Read(b)
73 if err != nil {
74 log.Fatal(err)
75 }
76 if cm.Dst.IsMulticast() {
77 if cm.Dst.Equal(group) {
78 // joined group, do something
79 } else {
80 // unknown group, discard
81 continue
82 }
83 }
84 p.SetTOS(ipv4.DSCP_CS7)
85 p.SetTTL(16)
86 _, err = p.Write(b[:n], nil, src)
87 if err != nil {
88 log.Fatal(err)
89 }
90 dst := &net.UDPAddr{IP: group, Port: 1024}
91 for _, ifi := range []*net.Interface{en0, en1} {
92 err := p.SetMulticastInterface(ifi)
93 if err != nil {
94 log.Fatal(err)
95 }
96 p.SetMulticastTTL(2)
97 _, err = p.Write(b[:n], nil, dst)
98 if err != nil {
99 log.Fatal(err)
100 }
101 }
102 }
103
104 err = p.LeaveGroup(en1, &net.UDPAddr{IP: group})
105 if err != nil {
106 log.Fatal(err)
107 }
108 newgroup := net.IPv4(224, 0, 0, 249)
109 err = p.JoinGroup(en1, &net.UDPAddr{IP: newgroup})
110 if err != nil {
111 log.Fatal(err)
112 }
113 }
114
115 type OSPFHeader struct {
116 Version byte
117 Type byte
118 Len uint16
119 RouterID uint32
120 AreaID uint32
121 Checksum uint16
122 }
123
124 const (
125 OSPFHeaderLen = 14
126 OSPFHelloHeaderLen = 20
127 OSPF_VERSION = 2
128 OSPF_TYPE_HELLO = iota + 1
129 OSPF_TYPE_DB_DESCRIPTION
130 OSPF_TYPE_LS_REQUEST
131 OSPF_TYPE_LS_UPDATE
132 OSPF_TYPE_LS_ACK
133 )
134
135 var (
136 AllSPFRouters = net.IPv4(224, 0, 0, 5)
137 AllDRouters = net.IPv4(224, 0, 0, 6)
138 )
139
140 func ExampleIPOSPFListener() {
141 var ifs []*net.Interface
142 en0, err := net.InterfaceByName("en0")
143 if err != nil {
144 log.Fatal(err)
145 }
146 ifs = append(ifs, en0)
147 en1, err := net.InterfaceByIndex(911)
148 if err != nil {
149 log.Fatal(err)
150 }
151 ifs = append(ifs, en1)
152
153 c, err := net.ListenPacket("ip4:89", "0.0.0.0")
154 if err != nil {
155 log.Fatal(err)
156 }
157 defer c.Close()
158
159 r, err := ipv4.NewRawConn(c)
160 if err != nil {
161 log.Fatal(err)
162 }
163 for _, ifi := range ifs {
164 err := r.JoinGroup(ifi, &net.IPAddr{IP: AllSPFRouters})
165 if err != nil {
166 log.Fatal(err)
167 }
168 err = r.JoinGroup(ifi, &net.IPAddr{IP: AllDRouters})
169 if err != nil {
170 log.Fatal(err)
171 }
172 }
173
174 err = r.SetControlMessage(ipv4.FlagDst|ipv4.FlagInterface, true)
175 if err != nil {
176 log.Fatal(err)
177 }
178 r.SetTOS(ipv4.DSCP_CS6)
179
180 parseOSPFHeader := func(b []byte) *OSPFHeader {
181 if len(b) < OSPFHeaderLen {
182 return nil
183 }
184 return &OSPFHeader{
185 Version: b[0],
186 Type: b[1],
187 Len: uint16(b[2])<<8 | uint16(b[3]),
188 RouterID: uint32(b[4])<<24 | uint32(b[5])<<16 | uint32(b [6])<<8 | uint32(b[7]),
189 AreaID: uint32(b[8])<<24 | uint32(b[9])<<16 | uint32(b [10])<<8 | uint32(b[11]),
190 Checksum: uint16(b[12])<<8 | uint16(b[13]),
191 }
192 }
193
194 b := make([]byte, 1500)
195 for {
196 iph, p, _, err := r.Read(b)
197 if err != nil {
198 log.Fatal(err)
199 }
200 if iph.Version != ipv4.Version {
201 continue
202 }
203 if iph.Dst.IsMulticast() {
204 if !iph.Dst.Equal(AllSPFRouters) && !iph.Dst.Equal(AllDR outers) {
205 continue
206 }
207 }
208 ospfh := parseOSPFHeader(p)
209 if ospfh == nil {
210 continue
211 }
212 if ospfh.Version != OSPF_VERSION {
213 continue
214 }
215 switch ospfh.Type {
216 case OSPF_TYPE_HELLO:
217 case OSPF_TYPE_DB_DESCRIPTION:
218 case OSPF_TYPE_LS_REQUEST:
219 case OSPF_TYPE_LS_UPDATE:
220 case OSPF_TYPE_LS_ACK:
221 }
222 }
223 }
224
225 func ExampleWriteIPOSPFHello(c *ipv4.RawConn, ifs []*net.Interface) {
226 hello := make([]byte, OSPFHelloHeaderLen)
227
228 ospf := make([]byte, OSPFHeaderLen)
229 ospf[0] = OSPF_VERSION
230 ospf[1] = OSPF_TYPE_HELLO
231 ospf = append(ospf, hello...)
232
233 iph := &ipv4.Header{}
234 iph.Version = ipv4.Version
235 iph.Len = ipv4.HeaderLen
236 iph.TOS = ipv4.DSCP_CS6
237 iph.TotalLen = ipv4.HeaderLen + len(ospf)
238 iph.TTL = 1
239 iph.Protocol = 89
240 iph.Dst = AllSPFRouters
241
242 for _, ifi := range ifs {
243 err := c.SetMulticastInterface(ifi)
244 if err != nil {
245 return
246 }
247 err = c.Write(iph, ospf, nil)
248 if err != nil {
249 return
250 }
251 }
252 }
LEFTRIGHT

Powered by Google App Engine
RSS Feeds Recent Issues | This issue
This is Rietveld f62528b