()
| 83 | ) |
| 84 | |
| 85 | func (p *Packet) decodeNextLayer() error { |
| 86 | |
| 87 | var ( |
| 88 | proto int |
| 89 | len int |
| 90 | ) |
| 91 | |
| 92 | switch p.L3.(type) { |
| 93 | case IPv4Header: |
| 94 | proto = p.L3.(IPv4Header).Protocol |
| 95 | case IPv6Header: |
| 96 | proto = p.L3.(IPv6Header).NextHeader |
| 97 | default: |
| 98 | return errUnknownL3Protocol |
| 99 | } |
| 100 | |
| 101 | switch proto { |
| 102 | case IANAProtoICMP, IANAProtoIPv6ICMP: |
| 103 | icmp, err := decodeICMP(p.data) |
| 104 | if err != nil { |
| 105 | return err |
| 106 | } |
| 107 | |
| 108 | p.L4 = icmp |
| 109 | len = 4 |
| 110 | case IANAProtoTCP: |
| 111 | tcp, err := decodeTCP(p.data) |
| 112 | if err != nil { |
| 113 | return err |
| 114 | } |
| 115 | |
| 116 | p.L4 = tcp |
| 117 | len = 20 |
| 118 | case IANAProtoUDP: |
| 119 | udp, err := decodeUDP(p.data) |
| 120 | if err != nil { |
| 121 | return err |
| 122 | } |
| 123 | |
| 124 | p.L4 = udp |
| 125 | len = 8 |
| 126 | default: |
| 127 | return errUnknownTransportLayer |
| 128 | } |
| 129 | |
| 130 | p.data = p.data[len:] |
| 131 | |
| 132 | return nil |
| 133 | } |
| 134 | |
| 135 | func (p *Packet) decodeIPv6Header() error { |
| 136 | if len(p.data) < IPv6HLen { |
no test coverage detected