example_test.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  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. package ipv4_test
  5. import (
  6. "code.google.com/p/go.net/ipv4"
  7. "log"
  8. "net"
  9. )
  10. func ExampleUnicastTCPListener() {
  11. ln, err := net.Listen("tcp4", "0.0.0.0:1024")
  12. if err != nil {
  13. log.Fatal(err)
  14. }
  15. defer ln.Close()
  16. for {
  17. c, err := ln.Accept()
  18. if err != nil {
  19. log.Fatal(err)
  20. }
  21. go func(c net.Conn) {
  22. defer c.Close()
  23. err := ipv4.NewConn(c).SetTOS(DiffServAF11)
  24. if err != nil {
  25. log.Fatal(err)
  26. }
  27. _, err = c.Write([]byte("HELLO-R-U-THERE-ACK"))
  28. if err != nil {
  29. log.Fatal(err)
  30. }
  31. }(c)
  32. }
  33. }
  34. func ExampleMulticastUDPListener() {
  35. en0, err := net.InterfaceByName("en0")
  36. if err != nil {
  37. log.Fatal(err)
  38. }
  39. en1, err := net.InterfaceByIndex(911)
  40. if err != nil {
  41. log.Fatal(err)
  42. }
  43. group := net.IPv4(224, 0, 0, 250)
  44. c, err := net.ListenPacket("udp4", "0.0.0.0:1024")
  45. if err != nil {
  46. log.Fatal(err)
  47. }
  48. defer c.Close()
  49. p := ipv4.NewPacketConn(c)
  50. err = p.JoinGroup(en0, &net.UDPAddr{IP: group})
  51. if err != nil {
  52. log.Fatal(err)
  53. }
  54. err = p.JoinGroup(en1, &net.UDPAddr{IP: group})
  55. if err != nil {
  56. log.Fatal(err)
  57. }
  58. err = p.SetControlMessage(ipv4.FlagDst, true)
  59. if err != nil {
  60. log.Fatal(err)
  61. }
  62. b := make([]byte, 1500)
  63. for {
  64. n, cm, src, err := p.ReadFrom(b)
  65. if err != nil {
  66. log.Fatal(err)
  67. }
  68. if cm.Dst.IsMulticast() {
  69. if cm.Dst.Equal(group) {
  70. // joined group, do something
  71. } else {
  72. // unknown group, discard
  73. continue
  74. }
  75. }
  76. p.SetTOS(DiffServCS7)
  77. p.SetTTL(16)
  78. _, err = p.WriteTo(b[:n], nil, src)
  79. if err != nil {
  80. log.Fatal(err)
  81. }
  82. dst := &net.UDPAddr{IP: group, Port: 1024}
  83. for _, ifi := range []*net.Interface{en0, en1} {
  84. err := p.SetMulticastInterface(ifi)
  85. if err != nil {
  86. log.Fatal(err)
  87. }
  88. p.SetMulticastTTL(2)
  89. _, err = p.WriteTo(b[:n], nil, dst)
  90. if err != nil {
  91. log.Fatal(err)
  92. }
  93. }
  94. }
  95. err = p.LeaveGroup(en1, &net.UDPAddr{IP: group})
  96. if err != nil {
  97. log.Fatal(err)
  98. }
  99. newgroup := net.IPv4(224, 0, 0, 249)
  100. err = p.JoinGroup(en1, &net.UDPAddr{IP: newgroup})
  101. if err != nil {
  102. log.Fatal(err)
  103. }
  104. }
  105. type OSPFHeader struct {
  106. Version byte
  107. Type byte
  108. Len uint16
  109. RouterID uint32
  110. AreaID uint32
  111. Checksum uint16
  112. }
  113. const (
  114. OSPFHeaderLen = 14
  115. OSPFHelloHeaderLen = 20
  116. OSPF_VERSION = 2
  117. OSPF_TYPE_HELLO = iota + 1
  118. OSPF_TYPE_DB_DESCRIPTION
  119. OSPF_TYPE_LS_REQUEST
  120. OSPF_TYPE_LS_UPDATE
  121. OSPF_TYPE_LS_ACK
  122. )
  123. var (
  124. AllSPFRouters = net.IPv4(224, 0, 0, 5)
  125. AllDRouters = net.IPv4(224, 0, 0, 6)
  126. )
  127. func ExampleIPOSPFListener() {
  128. var ifs []*net.Interface
  129. en0, err := net.InterfaceByName("en0")
  130. if err != nil {
  131. log.Fatal(err)
  132. }
  133. ifs = append(ifs, en0)
  134. en1, err := net.InterfaceByIndex(911)
  135. if err != nil {
  136. log.Fatal(err)
  137. }
  138. ifs = append(ifs, en1)
  139. c, err := net.ListenPacket("ip4:89", "0.0.0.0") // OSFP for IPv4
  140. if err != nil {
  141. log.Fatal(err)
  142. }
  143. defer c.Close()
  144. r, err := ipv4.NewRawConn(c)
  145. if err != nil {
  146. log.Fatal(err)
  147. }
  148. for _, ifi := range ifs {
  149. err := r.JoinGroup(ifi, &net.IPAddr{IP: AllSPFRouters})
  150. if err != nil {
  151. log.Fatal(err)
  152. }
  153. err = r.JoinGroup(ifi, &net.IPAddr{IP: AllDRouters})
  154. if err != nil {
  155. log.Fatal(err)
  156. }
  157. }
  158. err = r.SetControlMessage(ipv4.FlagDst|ipv4.FlagInterface, true)
  159. if err != nil {
  160. log.Fatal(err)
  161. }
  162. r.SetTOS(DiffServCS6)
  163. parseOSPFHeader := func(b []byte) *OSPFHeader {
  164. if len(b) < OSPFHeaderLen {
  165. return nil
  166. }
  167. return &OSPFHeader{
  168. Version: b[0],
  169. Type: b[1],
  170. Len: uint16(b[2])<<8 | uint16(b[3]),
  171. RouterID: uint32(b[4])<<24 | uint32(b[5])<<16 | uint32(b[6])<<8 | uint32(b[7]),
  172. AreaID: uint32(b[8])<<24 | uint32(b[9])<<16 | uint32(b[10])<<8 | uint32(b[11]),
  173. Checksum: uint16(b[12])<<8 | uint16(b[13]),
  174. }
  175. }
  176. b := make([]byte, 1500)
  177. for {
  178. iph, p, _, err := r.ReadFrom(b)
  179. if err != nil {
  180. log.Fatal(err)
  181. }
  182. if iph.Version != ipv4.Version {
  183. continue
  184. }
  185. if iph.Dst.IsMulticast() {
  186. if !iph.Dst.Equal(AllSPFRouters) && !iph.Dst.Equal(AllDRouters) {
  187. continue
  188. }
  189. }
  190. ospfh := parseOSPFHeader(p)
  191. if ospfh == nil {
  192. continue
  193. }
  194. if ospfh.Version != OSPF_VERSION {
  195. continue
  196. }
  197. switch ospfh.Type {
  198. case OSPF_TYPE_HELLO:
  199. case OSPF_TYPE_DB_DESCRIPTION:
  200. case OSPF_TYPE_LS_REQUEST:
  201. case OSPF_TYPE_LS_UPDATE:
  202. case OSPF_TYPE_LS_ACK:
  203. }
  204. }
  205. }
  206. func ExampleWriteIPOSPFHello() {
  207. var ifs []*net.Interface
  208. en0, err := net.InterfaceByName("en0")
  209. if err != nil {
  210. log.Fatal(err)
  211. }
  212. ifs = append(ifs, en0)
  213. en1, err := net.InterfaceByIndex(911)
  214. if err != nil {
  215. log.Fatal(err)
  216. }
  217. ifs = append(ifs, en1)
  218. c, err := net.ListenPacket("ip4:89", "0.0.0.0") // OSPF for IPv4
  219. if err != nil {
  220. log.Fatal(err)
  221. }
  222. defer c.Close()
  223. r, err := ipv4.NewRawConn(c)
  224. if err != nil {
  225. log.Fatal(err)
  226. }
  227. for _, ifi := range ifs {
  228. err := r.JoinGroup(ifi, &net.IPAddr{IP: AllSPFRouters})
  229. if err != nil {
  230. log.Fatal(err)
  231. }
  232. err = r.JoinGroup(ifi, &net.IPAddr{IP: AllDRouters})
  233. if err != nil {
  234. log.Fatal(err)
  235. }
  236. }
  237. hello := make([]byte, OSPFHelloHeaderLen)
  238. ospf := make([]byte, OSPFHeaderLen)
  239. ospf[0] = OSPF_VERSION
  240. ospf[1] = OSPF_TYPE_HELLO
  241. ospf = append(ospf, hello...)
  242. iph := &ipv4.Header{}
  243. iph.Version = ipv4.Version
  244. iph.Len = ipv4.HeaderLen
  245. iph.TOS = DiffServCS6
  246. iph.TotalLen = ipv4.HeaderLen + len(ospf)
  247. iph.TTL = 1
  248. iph.Protocol = 89
  249. iph.Dst = AllSPFRouters
  250. for _, ifi := range ifs {
  251. err := r.SetMulticastInterface(ifi)
  252. if err != nil {
  253. return
  254. }
  255. err = r.WriteTo(iph, ospf, nil)
  256. if err != nil {
  257. return
  258. }
  259. }
  260. }