ospf.go 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715
  1. // Copyright 2017 Google, Inc. All rights reserved.
  2. //
  3. // Use of this source code is governed by a BSD-style license
  4. // that can be found in the LICENSE file in the root of the source
  5. // tree.
  6. package layers
  7. import (
  8. "encoding/binary"
  9. "errors"
  10. "fmt"
  11. "github.com/google/gopacket"
  12. )
  13. // OSPFType denotes what kind of OSPF type it is
  14. type OSPFType uint8
  15. // Potential values for OSPF.Type.
  16. const (
  17. OSPFHello OSPFType = 1
  18. OSPFDatabaseDescription OSPFType = 2
  19. OSPFLinkStateRequest OSPFType = 3
  20. OSPFLinkStateUpdate OSPFType = 4
  21. OSPFLinkStateAcknowledgment OSPFType = 5
  22. )
  23. // LSA Function Codes for LSAheader.LSType
  24. const (
  25. RouterLSAtypeV2 = 0x1
  26. RouterLSAtype = 0x2001
  27. NetworkLSAtypeV2 = 0x2
  28. NetworkLSAtype = 0x2002
  29. SummaryLSANetworktypeV2 = 0x3
  30. InterAreaPrefixLSAtype = 0x2003
  31. SummaryLSAASBRtypeV2 = 0x4
  32. InterAreaRouterLSAtype = 0x2004
  33. ASExternalLSAtypeV2 = 0x5
  34. ASExternalLSAtype = 0x4005
  35. NSSALSAtype = 0x2007
  36. NSSALSAtypeV2 = 0x7
  37. LinkLSAtype = 0x0008
  38. IntraAreaPrefixLSAtype = 0x2009
  39. )
  40. // String conversions for OSPFType
  41. func (i OSPFType) String() string {
  42. switch i {
  43. case OSPFHello:
  44. return "Hello"
  45. case OSPFDatabaseDescription:
  46. return "Database Description"
  47. case OSPFLinkStateRequest:
  48. return "Link State Request"
  49. case OSPFLinkStateUpdate:
  50. return "Link State Update"
  51. case OSPFLinkStateAcknowledgment:
  52. return "Link State Acknowledgment"
  53. default:
  54. return ""
  55. }
  56. }
  57. // Prefix extends IntraAreaPrefixLSA
  58. type Prefix struct {
  59. PrefixLength uint8
  60. PrefixOptions uint8
  61. Metric uint16
  62. AddressPrefix []byte
  63. }
  64. // IntraAreaPrefixLSA is the struct from RFC 5340 A.4.10.
  65. type IntraAreaPrefixLSA struct {
  66. NumOfPrefixes uint16
  67. RefLSType uint16
  68. RefLinkStateID uint32
  69. RefAdvRouter uint32
  70. Prefixes []Prefix
  71. }
  72. // LinkLSA is the struct from RFC 5340 A.4.9.
  73. type LinkLSA struct {
  74. RtrPriority uint8
  75. Options uint32
  76. LinkLocalAddress []byte
  77. NumOfPrefixes uint32
  78. Prefixes []Prefix
  79. }
  80. // ASExternalLSAV2 is the struct from RFC 2328 A.4.5.
  81. type ASExternalLSAV2 struct {
  82. NetworkMask uint32
  83. ExternalBit uint8
  84. Metric uint32
  85. ForwardingAddress uint32
  86. ExternalRouteTag uint32
  87. }
  88. // ASExternalLSA is the struct from RFC 5340 A.4.7.
  89. type ASExternalLSA struct {
  90. Flags uint8
  91. Metric uint32
  92. PrefixLength uint8
  93. PrefixOptions uint8
  94. RefLSType uint16
  95. AddressPrefix []byte
  96. ForwardingAddress []byte
  97. ExternalRouteTag uint32
  98. RefLinkStateID uint32
  99. }
  100. // InterAreaRouterLSA is the struct from RFC 5340 A.4.6.
  101. type InterAreaRouterLSA struct {
  102. Options uint32
  103. Metric uint32
  104. DestinationRouterID uint32
  105. }
  106. // InterAreaPrefixLSA is the struct from RFC 5340 A.4.5.
  107. type InterAreaPrefixLSA struct {
  108. Metric uint32
  109. PrefixLength uint8
  110. PrefixOptions uint8
  111. AddressPrefix []byte
  112. }
  113. // NetworkLSA is the struct from RFC 5340 A.4.4.
  114. type NetworkLSA struct {
  115. Options uint32
  116. AttachedRouter []uint32
  117. }
  118. // NetworkLSAV2 is the struct from RFC 2328 A.4.3.
  119. type NetworkLSAV2 struct {
  120. NetworkMask uint32
  121. AttachedRouter []uint32
  122. }
  123. // RouterV2 extends RouterLSAV2
  124. type RouterV2 struct {
  125. Type uint8
  126. LinkID uint32
  127. LinkData uint32
  128. Metric uint16
  129. }
  130. // RouterLSAV2 is the struct from RFC 2328 A.4.2.
  131. type RouterLSAV2 struct {
  132. Flags uint8
  133. Links uint16
  134. Routers []RouterV2
  135. }
  136. // Router extends RouterLSA
  137. type Router struct {
  138. Type uint8
  139. Metric uint16
  140. InterfaceID uint32
  141. NeighborInterfaceID uint32
  142. NeighborRouterID uint32
  143. }
  144. // RouterLSA is the struct from RFC 5340 A.4.3.
  145. type RouterLSA struct {
  146. Flags uint8
  147. Options uint32
  148. Routers []Router
  149. }
  150. // LSAheader is the struct from RFC 5340 A.4.2 and RFC 2328 A.4.1.
  151. type LSAheader struct {
  152. LSAge uint16
  153. LSType uint16
  154. LinkStateID uint32
  155. AdvRouter uint32
  156. LSSeqNumber uint32
  157. LSChecksum uint16
  158. Length uint16
  159. LSOptions uint8
  160. }
  161. // LSA links LSAheader with the structs from RFC 5340 A.4.
  162. type LSA struct {
  163. LSAheader
  164. Content interface{}
  165. }
  166. // LSUpdate is the struct from RFC 5340 A.3.5.
  167. type LSUpdate struct {
  168. NumOfLSAs uint32
  169. LSAs []LSA
  170. }
  171. // LSReq is the struct from RFC 5340 A.3.4.
  172. type LSReq struct {
  173. LSType uint16
  174. LSID uint32
  175. AdvRouter uint32
  176. }
  177. // DbDescPkg is the struct from RFC 5340 A.3.3.
  178. type DbDescPkg struct {
  179. Options uint32
  180. InterfaceMTU uint16
  181. Flags uint16
  182. DDSeqNumber uint32
  183. LSAinfo []LSAheader
  184. }
  185. // HelloPkg is the struct from RFC 5340 A.3.2.
  186. type HelloPkg struct {
  187. InterfaceID uint32
  188. RtrPriority uint8
  189. Options uint32
  190. HelloInterval uint16
  191. RouterDeadInterval uint32
  192. DesignatedRouterID uint32
  193. BackupDesignatedRouterID uint32
  194. NeighborID []uint32
  195. }
  196. // HelloPkgV2 extends the HelloPkg struct with OSPFv2 information
  197. type HelloPkgV2 struct {
  198. HelloPkg
  199. NetworkMask uint32
  200. }
  201. // OSPF is a basic OSPF packet header with common fields of Version 2 and Version 3.
  202. type OSPF struct {
  203. Version uint8
  204. Type OSPFType
  205. PacketLength uint16
  206. RouterID uint32
  207. AreaID uint32
  208. Checksum uint16
  209. Content interface{}
  210. }
  211. //OSPFv2 extend the OSPF head with version 2 specific fields
  212. type OSPFv2 struct {
  213. BaseLayer
  214. OSPF
  215. AuType uint16
  216. Authentication uint64
  217. }
  218. // OSPFv3 extend the OSPF head with version 3 specific fields
  219. type OSPFv3 struct {
  220. BaseLayer
  221. OSPF
  222. Instance uint8
  223. Reserved uint8
  224. }
  225. // getLSAsv2 parses the LSA information from the packet for OSPFv2
  226. func getLSAsv2(num uint32, data []byte) ([]LSA, error) {
  227. var lsas []LSA
  228. var i uint32 = 0
  229. var offset uint32 = 0
  230. for ; i < num; i++ {
  231. lstype := uint16(data[offset+3])
  232. lsalength := binary.BigEndian.Uint16(data[offset+18 : offset+20])
  233. content, err := extractLSAInformation(lstype, lsalength, data[offset:])
  234. if err != nil {
  235. return nil, fmt.Errorf("Could not extract Link State type.")
  236. }
  237. lsa := LSA{
  238. LSAheader: LSAheader{
  239. LSAge: binary.BigEndian.Uint16(data[offset : offset+2]),
  240. LSOptions: data[offset+2],
  241. LSType: lstype,
  242. LinkStateID: binary.BigEndian.Uint32(data[offset+4 : offset+8]),
  243. AdvRouter: binary.BigEndian.Uint32(data[offset+8 : offset+12]),
  244. LSSeqNumber: binary.BigEndian.Uint32(data[offset+12 : offset+16]),
  245. LSChecksum: binary.BigEndian.Uint16(data[offset+16 : offset+18]),
  246. Length: lsalength,
  247. },
  248. Content: content,
  249. }
  250. lsas = append(lsas, lsa)
  251. offset += uint32(lsalength)
  252. }
  253. return lsas, nil
  254. }
  255. // extractLSAInformation extracts all the LSA information
  256. func extractLSAInformation(lstype, lsalength uint16, data []byte) (interface{}, error) {
  257. if lsalength < 20 {
  258. return nil, fmt.Errorf("Link State header length %v too short, %v required", lsalength, 20)
  259. }
  260. if len(data) < int(lsalength) {
  261. return nil, fmt.Errorf("Link State header length %v too short, %v required", len(data), lsalength)
  262. }
  263. var content interface{}
  264. switch lstype {
  265. case RouterLSAtypeV2:
  266. var routers []RouterV2
  267. var j uint32
  268. for j = 24; j < uint32(lsalength); j += 12 {
  269. if len(data) < int(j+12) {
  270. return nil, errors.New("LSAtypeV2 too small")
  271. }
  272. router := RouterV2{
  273. LinkID: binary.BigEndian.Uint32(data[j : j+4]),
  274. LinkData: binary.BigEndian.Uint32(data[j+4 : j+8]),
  275. Type: uint8(data[j+8]),
  276. Metric: binary.BigEndian.Uint16(data[j+10 : j+12]),
  277. }
  278. routers = append(routers, router)
  279. }
  280. if len(data) < 24 {
  281. return nil, errors.New("LSAtypeV2 too small")
  282. }
  283. links := binary.BigEndian.Uint16(data[22:24])
  284. content = RouterLSAV2{
  285. Flags: data[20],
  286. Links: links,
  287. Routers: routers,
  288. }
  289. case NSSALSAtypeV2:
  290. fallthrough
  291. case ASExternalLSAtypeV2:
  292. content = ASExternalLSAV2{
  293. NetworkMask: binary.BigEndian.Uint32(data[20:24]),
  294. ExternalBit: data[24] & 0x80,
  295. Metric: binary.BigEndian.Uint32(data[24:28]) & 0x00FFFFFF,
  296. ForwardingAddress: binary.BigEndian.Uint32(data[28:32]),
  297. ExternalRouteTag: binary.BigEndian.Uint32(data[32:36]),
  298. }
  299. case NetworkLSAtypeV2:
  300. var routers []uint32
  301. var j uint32
  302. for j = 24; j < uint32(lsalength); j += 4 {
  303. routers = append(routers, binary.BigEndian.Uint32(data[j:j+4]))
  304. }
  305. content = NetworkLSAV2{
  306. NetworkMask: binary.BigEndian.Uint32(data[20:24]),
  307. AttachedRouter: routers,
  308. }
  309. case RouterLSAtype:
  310. var routers []Router
  311. var j uint32
  312. for j = 24; j < uint32(lsalength); j += 16 {
  313. router := Router{
  314. Type: uint8(data[j]),
  315. Metric: binary.BigEndian.Uint16(data[j+2 : j+4]),
  316. InterfaceID: binary.BigEndian.Uint32(data[j+4 : j+8]),
  317. NeighborInterfaceID: binary.BigEndian.Uint32(data[j+8 : j+12]),
  318. NeighborRouterID: binary.BigEndian.Uint32(data[j+12 : j+16]),
  319. }
  320. routers = append(routers, router)
  321. }
  322. content = RouterLSA{
  323. Flags: uint8(data[20]),
  324. Options: binary.BigEndian.Uint32(data[20:24]) & 0x00FFFFFF,
  325. Routers: routers,
  326. }
  327. case NetworkLSAtype:
  328. var routers []uint32
  329. var j uint32
  330. for j = 24; j < uint32(lsalength); j += 4 {
  331. routers = append(routers, binary.BigEndian.Uint32(data[j:j+4]))
  332. }
  333. content = NetworkLSA{
  334. Options: binary.BigEndian.Uint32(data[20:24]) & 0x00FFFFFF,
  335. AttachedRouter: routers,
  336. }
  337. case InterAreaPrefixLSAtype:
  338. content = InterAreaPrefixLSA{
  339. Metric: binary.BigEndian.Uint32(data[20:24]) & 0x00FFFFFF,
  340. PrefixLength: uint8(data[24]),
  341. PrefixOptions: uint8(data[25]),
  342. AddressPrefix: data[28:uint32(lsalength)],
  343. }
  344. case InterAreaRouterLSAtype:
  345. content = InterAreaRouterLSA{
  346. Options: binary.BigEndian.Uint32(data[20:24]) & 0x00FFFFFF,
  347. Metric: binary.BigEndian.Uint32(data[24:28]) & 0x00FFFFFF,
  348. DestinationRouterID: binary.BigEndian.Uint32(data[28:32]),
  349. }
  350. case ASExternalLSAtype:
  351. fallthrough
  352. case NSSALSAtype:
  353. flags := uint8(data[20])
  354. prefixLen := uint8(data[24]) / 8
  355. var forwardingAddress []byte
  356. if (flags & 0x02) == 0x02 {
  357. forwardingAddress = data[28+uint32(prefixLen) : 28+uint32(prefixLen)+16]
  358. }
  359. content = ASExternalLSA{
  360. Flags: flags,
  361. Metric: binary.BigEndian.Uint32(data[20:24]) & 0x00FFFFFF,
  362. PrefixLength: prefixLen,
  363. PrefixOptions: uint8(data[25]),
  364. RefLSType: binary.BigEndian.Uint16(data[26:28]),
  365. AddressPrefix: data[28 : 28+uint32(prefixLen)],
  366. ForwardingAddress: forwardingAddress,
  367. }
  368. case LinkLSAtype:
  369. var prefixes []Prefix
  370. var prefixOffset uint32 = 44
  371. var j uint32
  372. numOfPrefixes := binary.BigEndian.Uint32(data[40:44])
  373. for j = 0; j < numOfPrefixes; j++ {
  374. prefixLen := uint8(data[prefixOffset])
  375. prefix := Prefix{
  376. PrefixLength: prefixLen,
  377. PrefixOptions: uint8(data[prefixOffset+1]),
  378. AddressPrefix: data[prefixOffset+4 : prefixOffset+4+uint32(prefixLen)/8],
  379. }
  380. prefixes = append(prefixes, prefix)
  381. prefixOffset = prefixOffset + 4 + uint32(prefixLen)/8
  382. }
  383. content = LinkLSA{
  384. RtrPriority: uint8(data[20]),
  385. Options: binary.BigEndian.Uint32(data[20:24]) & 0x00FFFFFF,
  386. LinkLocalAddress: data[24:40],
  387. NumOfPrefixes: numOfPrefixes,
  388. Prefixes: prefixes,
  389. }
  390. case IntraAreaPrefixLSAtype:
  391. var prefixes []Prefix
  392. var prefixOffset uint32 = 32
  393. var j uint16
  394. numOfPrefixes := binary.BigEndian.Uint16(data[20:22])
  395. for j = 0; j < numOfPrefixes; j++ {
  396. prefixLen := uint8(data[prefixOffset])
  397. prefix := Prefix{
  398. PrefixLength: prefixLen,
  399. PrefixOptions: uint8(data[prefixOffset+1]),
  400. Metric: binary.BigEndian.Uint16(data[prefixOffset+2 : prefixOffset+4]),
  401. AddressPrefix: data[prefixOffset+4 : prefixOffset+4+uint32(prefixLen)/8],
  402. }
  403. prefixes = append(prefixes, prefix)
  404. prefixOffset = prefixOffset + 4 + uint32(prefixLen)
  405. }
  406. content = IntraAreaPrefixLSA{
  407. NumOfPrefixes: numOfPrefixes,
  408. RefLSType: binary.BigEndian.Uint16(data[22:24]),
  409. RefLinkStateID: binary.BigEndian.Uint32(data[24:28]),
  410. RefAdvRouter: binary.BigEndian.Uint32(data[28:32]),
  411. Prefixes: prefixes,
  412. }
  413. default:
  414. return nil, fmt.Errorf("Unknown Link State type.")
  415. }
  416. return content, nil
  417. }
  418. // getLSAs parses the LSA information from the packet for OSPFv3
  419. func getLSAs(num uint32, data []byte) ([]LSA, error) {
  420. var lsas []LSA
  421. var i uint32 = 0
  422. var offset uint32 = 0
  423. for ; i < num; i++ {
  424. var content interface{}
  425. lstype := binary.BigEndian.Uint16(data[offset+2 : offset+4])
  426. lsalength := binary.BigEndian.Uint16(data[offset+18 : offset+20])
  427. content, err := extractLSAInformation(lstype, lsalength, data[offset:])
  428. if err != nil {
  429. return nil, fmt.Errorf("Could not extract Link State type.")
  430. }
  431. lsa := LSA{
  432. LSAheader: LSAheader{
  433. LSAge: binary.BigEndian.Uint16(data[offset : offset+2]),
  434. LSType: lstype,
  435. LinkStateID: binary.BigEndian.Uint32(data[offset+4 : offset+8]),
  436. AdvRouter: binary.BigEndian.Uint32(data[offset+8 : offset+12]),
  437. LSSeqNumber: binary.BigEndian.Uint32(data[offset+12 : offset+16]),
  438. LSChecksum: binary.BigEndian.Uint16(data[offset+16 : offset+18]),
  439. Length: lsalength,
  440. },
  441. Content: content,
  442. }
  443. lsas = append(lsas, lsa)
  444. offset += uint32(lsalength)
  445. }
  446. return lsas, nil
  447. }
  448. // DecodeFromBytes decodes the given bytes into the OSPF layer.
  449. func (ospf *OSPFv2) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error {
  450. if len(data) < 24 {
  451. return fmt.Errorf("Packet too smal for OSPF Version 2")
  452. }
  453. ospf.Version = uint8(data[0])
  454. ospf.Type = OSPFType(data[1])
  455. ospf.PacketLength = binary.BigEndian.Uint16(data[2:4])
  456. ospf.RouterID = binary.BigEndian.Uint32(data[4:8])
  457. ospf.AreaID = binary.BigEndian.Uint32(data[8:12])
  458. ospf.Checksum = binary.BigEndian.Uint16(data[12:14])
  459. ospf.AuType = binary.BigEndian.Uint16(data[14:16])
  460. ospf.Authentication = binary.BigEndian.Uint64(data[16:24])
  461. switch ospf.Type {
  462. case OSPFHello:
  463. var neighbors []uint32
  464. for i := 44; uint16(i+4) <= ospf.PacketLength; i += 4 {
  465. neighbors = append(neighbors, binary.BigEndian.Uint32(data[i:i+4]))
  466. }
  467. ospf.Content = HelloPkgV2{
  468. NetworkMask: binary.BigEndian.Uint32(data[24:28]),
  469. HelloPkg: HelloPkg{
  470. HelloInterval: binary.BigEndian.Uint16(data[28:30]),
  471. Options: uint32(data[30]),
  472. RtrPriority: uint8(data[31]),
  473. RouterDeadInterval: binary.BigEndian.Uint32(data[32:36]),
  474. DesignatedRouterID: binary.BigEndian.Uint32(data[36:40]),
  475. BackupDesignatedRouterID: binary.BigEndian.Uint32(data[40:44]),
  476. NeighborID: neighbors,
  477. },
  478. }
  479. case OSPFDatabaseDescription:
  480. var lsas []LSAheader
  481. for i := 32; uint16(i+20) <= ospf.PacketLength; i += 20 {
  482. lsa := LSAheader{
  483. LSAge: binary.BigEndian.Uint16(data[i : i+2]),
  484. LSType: binary.BigEndian.Uint16(data[i+2 : i+4]),
  485. LinkStateID: binary.BigEndian.Uint32(data[i+4 : i+8]),
  486. AdvRouter: binary.BigEndian.Uint32(data[i+8 : i+12]),
  487. LSSeqNumber: binary.BigEndian.Uint32(data[i+12 : i+16]),
  488. LSChecksum: binary.BigEndian.Uint16(data[i+16 : i+18]),
  489. Length: binary.BigEndian.Uint16(data[i+18 : i+20]),
  490. }
  491. lsas = append(lsas, lsa)
  492. }
  493. ospf.Content = DbDescPkg{
  494. InterfaceMTU: binary.BigEndian.Uint16(data[24:26]),
  495. Options: uint32(data[26]),
  496. Flags: uint16(data[27]),
  497. DDSeqNumber: binary.BigEndian.Uint32(data[28:32]),
  498. LSAinfo: lsas,
  499. }
  500. case OSPFLinkStateRequest:
  501. var lsrs []LSReq
  502. for i := 24; uint16(i+12) <= ospf.PacketLength; i += 12 {
  503. lsr := LSReq{
  504. LSType: binary.BigEndian.Uint16(data[i+2 : i+4]),
  505. LSID: binary.BigEndian.Uint32(data[i+4 : i+8]),
  506. AdvRouter: binary.BigEndian.Uint32(data[i+8 : i+12]),
  507. }
  508. lsrs = append(lsrs, lsr)
  509. }
  510. ospf.Content = lsrs
  511. case OSPFLinkStateUpdate:
  512. num := binary.BigEndian.Uint32(data[24:28])
  513. lsas, err := getLSAsv2(num, data[28:])
  514. if err != nil {
  515. return fmt.Errorf("Cannot parse Link State Update packet: %v", err)
  516. }
  517. ospf.Content = LSUpdate{
  518. NumOfLSAs: num,
  519. LSAs: lsas,
  520. }
  521. case OSPFLinkStateAcknowledgment:
  522. var lsas []LSAheader
  523. for i := 24; uint16(i+20) <= ospf.PacketLength; i += 20 {
  524. lsa := LSAheader{
  525. LSAge: binary.BigEndian.Uint16(data[i : i+2]),
  526. LSOptions: data[i+2],
  527. LSType: uint16(data[i+3]),
  528. LinkStateID: binary.BigEndian.Uint32(data[i+4 : i+8]),
  529. AdvRouter: binary.BigEndian.Uint32(data[i+8 : i+12]),
  530. LSSeqNumber: binary.BigEndian.Uint32(data[i+12 : i+16]),
  531. LSChecksum: binary.BigEndian.Uint16(data[i+16 : i+18]),
  532. Length: binary.BigEndian.Uint16(data[i+18 : i+20]),
  533. }
  534. lsas = append(lsas, lsa)
  535. }
  536. ospf.Content = lsas
  537. }
  538. return nil
  539. }
  540. // DecodeFromBytes decodes the given bytes into the OSPF layer.
  541. func (ospf *OSPFv3) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error {
  542. if len(data) < 16 {
  543. return fmt.Errorf("Packet too smal for OSPF Version 3")
  544. }
  545. ospf.Version = uint8(data[0])
  546. ospf.Type = OSPFType(data[1])
  547. ospf.PacketLength = binary.BigEndian.Uint16(data[2:4])
  548. ospf.RouterID = binary.BigEndian.Uint32(data[4:8])
  549. ospf.AreaID = binary.BigEndian.Uint32(data[8:12])
  550. ospf.Checksum = binary.BigEndian.Uint16(data[12:14])
  551. ospf.Instance = uint8(data[14])
  552. ospf.Reserved = uint8(data[15])
  553. switch ospf.Type {
  554. case OSPFHello:
  555. var neighbors []uint32
  556. for i := 36; uint16(i+4) <= ospf.PacketLength; i += 4 {
  557. neighbors = append(neighbors, binary.BigEndian.Uint32(data[i:i+4]))
  558. }
  559. ospf.Content = HelloPkg{
  560. InterfaceID: binary.BigEndian.Uint32(data[16:20]),
  561. RtrPriority: uint8(data[20]),
  562. Options: binary.BigEndian.Uint32(data[21:25]) >> 8,
  563. HelloInterval: binary.BigEndian.Uint16(data[24:26]),
  564. RouterDeadInterval: uint32(binary.BigEndian.Uint16(data[26:28])),
  565. DesignatedRouterID: binary.BigEndian.Uint32(data[28:32]),
  566. BackupDesignatedRouterID: binary.BigEndian.Uint32(data[32:36]),
  567. NeighborID: neighbors,
  568. }
  569. case OSPFDatabaseDescription:
  570. var lsas []LSAheader
  571. for i := 28; uint16(i+20) <= ospf.PacketLength; i += 20 {
  572. lsa := LSAheader{
  573. LSAge: binary.BigEndian.Uint16(data[i : i+2]),
  574. LSType: binary.BigEndian.Uint16(data[i+2 : i+4]),
  575. LinkStateID: binary.BigEndian.Uint32(data[i+4 : i+8]),
  576. AdvRouter: binary.BigEndian.Uint32(data[i+8 : i+12]),
  577. LSSeqNumber: binary.BigEndian.Uint32(data[i+12 : i+16]),
  578. LSChecksum: binary.BigEndian.Uint16(data[i+16 : i+18]),
  579. Length: binary.BigEndian.Uint16(data[i+18 : i+20]),
  580. }
  581. lsas = append(lsas, lsa)
  582. }
  583. ospf.Content = DbDescPkg{
  584. Options: binary.BigEndian.Uint32(data[16:20]) & 0x00FFFFFF,
  585. InterfaceMTU: binary.BigEndian.Uint16(data[20:22]),
  586. Flags: binary.BigEndian.Uint16(data[22:24]),
  587. DDSeqNumber: binary.BigEndian.Uint32(data[24:28]),
  588. LSAinfo: lsas,
  589. }
  590. case OSPFLinkStateRequest:
  591. var lsrs []LSReq
  592. for i := 16; uint16(i+12) <= ospf.PacketLength; i += 12 {
  593. lsr := LSReq{
  594. LSType: binary.BigEndian.Uint16(data[i+2 : i+4]),
  595. LSID: binary.BigEndian.Uint32(data[i+4 : i+8]),
  596. AdvRouter: binary.BigEndian.Uint32(data[i+8 : i+12]),
  597. }
  598. lsrs = append(lsrs, lsr)
  599. }
  600. ospf.Content = lsrs
  601. case OSPFLinkStateUpdate:
  602. num := binary.BigEndian.Uint32(data[16:20])
  603. lsas, err := getLSAs(num, data[20:])
  604. if err != nil {
  605. return fmt.Errorf("Cannot parse Link State Update packet: %v", err)
  606. }
  607. ospf.Content = LSUpdate{
  608. NumOfLSAs: num,
  609. LSAs: lsas,
  610. }
  611. case OSPFLinkStateAcknowledgment:
  612. var lsas []LSAheader
  613. for i := 16; uint16(i+20) <= ospf.PacketLength; i += 20 {
  614. lsa := LSAheader{
  615. LSAge: binary.BigEndian.Uint16(data[i : i+2]),
  616. LSType: binary.BigEndian.Uint16(data[i+2 : i+4]),
  617. LinkStateID: binary.BigEndian.Uint32(data[i+4 : i+8]),
  618. AdvRouter: binary.BigEndian.Uint32(data[i+8 : i+12]),
  619. LSSeqNumber: binary.BigEndian.Uint32(data[i+12 : i+16]),
  620. LSChecksum: binary.BigEndian.Uint16(data[i+16 : i+18]),
  621. Length: binary.BigEndian.Uint16(data[i+18 : i+20]),
  622. }
  623. lsas = append(lsas, lsa)
  624. }
  625. ospf.Content = lsas
  626. default:
  627. }
  628. return nil
  629. }
  630. // LayerType returns LayerTypeOSPF
  631. func (ospf *OSPFv2) LayerType() gopacket.LayerType {
  632. return LayerTypeOSPF
  633. }
  634. func (ospf *OSPFv3) LayerType() gopacket.LayerType {
  635. return LayerTypeOSPF
  636. }
  637. // NextLayerType returns the layer type contained by this DecodingLayer.
  638. func (ospf *OSPFv2) NextLayerType() gopacket.LayerType {
  639. return gopacket.LayerTypeZero
  640. }
  641. func (ospf *OSPFv3) NextLayerType() gopacket.LayerType {
  642. return gopacket.LayerTypeZero
  643. }
  644. // CanDecode returns the set of layer types that this DecodingLayer can decode.
  645. func (ospf *OSPFv2) CanDecode() gopacket.LayerClass {
  646. return LayerTypeOSPF
  647. }
  648. func (ospf *OSPFv3) CanDecode() gopacket.LayerClass {
  649. return LayerTypeOSPF
  650. }
  651. func decodeOSPF(data []byte, p gopacket.PacketBuilder) error {
  652. if len(data) < 14 {
  653. return fmt.Errorf("Packet too smal for OSPF")
  654. }
  655. switch uint8(data[0]) {
  656. case 2:
  657. ospf := &OSPFv2{}
  658. return decodingLayerDecoder(ospf, data, p)
  659. case 3:
  660. ospf := &OSPFv3{}
  661. return decodingLayerDecoder(ospf, data, p)
  662. default:
  663. }
  664. return fmt.Errorf("Unable to determine OSPF type.")
  665. }