github.com/contiv/libOpenflow@v0.0.0-20210609050114-d967b14cc688/protocol/ipv6_test.go (about) 1 package protocol 2 3 import ( 4 "bytes" 5 "encoding/binary" 6 "fmt" 7 "net" 8 "testing" 9 10 "github.com/contiv/libOpenflow/util" 11 ) 12 13 func TestIPv6Option(t *testing.T) { 14 testFunc := func(oriMessage *Option) { 15 data, err := oriMessage.MarshalBinary() 16 if err != nil { 17 t.Fatalf("Failed to Marshal message: %v", err) 18 } 19 newMessage := new(Option) 20 err = newMessage.UnmarshalBinary(data) 21 if err != nil { 22 t.Fatalf("Failed to UnMarshal message: %v", err) 23 } 24 if err := testOptionEqual(oriMessage, newMessage); err != nil { 25 t.Error(err.Error()) 26 } 27 } 28 option := &Option{ 29 Type: 1, 30 Length: 4, 31 Data: []byte{0x00, 0x00, 0x00, 0x00}, 32 } 33 testFunc(option) 34 } 35 36 func testOptionEqual(oriMessage, newMessage *Option) error { 37 if oriMessage.Type != newMessage.Type { 38 return fmt.Errorf("Option Type not equal") 39 } 40 if oriMessage.Length != newMessage.Length { 41 return fmt.Errorf("Option Length not equal") 42 } 43 if !bytes.Equal(oriMessage.Data, newMessage.Data) { 44 return fmt.Errorf("Option Data not equal") 45 } 46 return nil 47 } 48 49 func TestHopByHopHeader(t *testing.T) { 50 testFunc := func(oriMessage *HopByHopHeader) { 51 data, err := oriMessage.MarshalBinary() 52 if err != nil { 53 t.Fatalf("Failed to Marshal message: %v", err) 54 } 55 newMessage := new(HopByHopHeader) 56 err = newMessage.UnmarshalBinary(data) 57 if err != nil { 58 t.Fatalf("Failed to UnMarshal message: %v", err) 59 } 60 if err := testHopByHopHeaderEqual(oriMessage, newMessage); err != nil { 61 t.Errorf(err.Error()) 62 } 63 } 64 msg := &HopByHopHeader{ 65 NextHeader: 59, 66 HEL: 0, 67 Options: []*Option{ 68 { 69 Type: 1, 70 Length: 4, 71 Data: []byte{0x00, 0x00, 0x00, 0x00}, 72 }, 73 }, 74 } 75 76 testFunc(msg) 77 } 78 79 func testHopByHopHeaderEqual(oriMessage, newMessage *HopByHopHeader) error { 80 if oriMessage.NextHeader != newMessage.NextHeader { 81 return fmt.Errorf("HopByHopHeader NextHeader not equal") 82 } 83 if oriMessage.HEL != newMessage.HEL { 84 return fmt.Errorf("HopByHopHeader HEL not equal") 85 } 86 if len(oriMessage.Options) != len(newMessage.Options) { 87 return fmt.Errorf("HopByHopHeader Options count not equal") 88 } 89 for i := range oriMessage.Options { 90 if err := testOptionEqual(oriMessage.Options[i], newMessage.Options[i]); err != nil { 91 return err 92 } 93 } 94 return nil 95 } 96 97 func TestRoutingHeader(t *testing.T) { 98 testFunc := func(oriMessage *RoutingHeader) { 99 data, err := oriMessage.MarshalBinary() 100 if err != nil { 101 t.Fatalf("Failed to Marshal message: %v", err) 102 } 103 newMessage := new(RoutingHeader) 104 err = newMessage.UnmarshalBinary(data) 105 if err != nil { 106 t.Fatalf("Failed to UnMarshal message: %v", err) 107 } 108 if err := testRoutingHeaderEqual(oriMessage, newMessage); err != nil { 109 t.Errorf(err.Error()) 110 } 111 } 112 data := make([]byte, 20) 113 binary.BigEndian.PutUint32(data, uint32(0)) 114 nxtIP := net.ParseIP("2001:db8::3") 115 copy(data[4:], nxtIP) 116 msg := &RoutingHeader{ 117 NextHeader: 59, 118 HEL: 2, 119 RoutingType: 0, 120 SegmentsLeft: 1, 121 Data: util.NewBuffer(data), 122 } 123 testFunc(msg) 124 } 125 126 func testRoutingHeaderEqual(oriMessage *RoutingHeader, newMessage *RoutingHeader) error { 127 if oriMessage.NextHeader != newMessage.NextHeader { 128 return fmt.Errorf("RoutingHeader NextHeader not equal") 129 } 130 if oriMessage.HEL != newMessage.HEL { 131 return fmt.Errorf("RoutingHeader HEL not equal") 132 } 133 if oriMessage.RoutingType != newMessage.RoutingType { 134 return fmt.Errorf("RoutingHeader RoutingType not equal") 135 } 136 if oriMessage.SegmentsLeft != newMessage.SegmentsLeft { 137 return fmt.Errorf("RoutingHeader SegmentsLeft not equal") 138 } 139 if (oriMessage.Data != nil && newMessage.Data == nil) || (oriMessage.Data == nil && newMessage.Data != nil) { 140 return fmt.Errorf("RoutingHeader Data not equal") 141 } 142 if (oriMessage.Data != nil && newMessage.Data != nil) && !bytes.Equal(oriMessage.Data.Bytes(), newMessage.Data.Bytes()) { 143 return fmt.Errorf("RoutingHeader Data not equal") 144 } 145 return nil 146 } 147 148 func TestFragmentHeader(t *testing.T) { 149 testFunc := func(oriMessage *FragmentHeader) { 150 data, err := oriMessage.MarshalBinary() 151 if err != nil { 152 t.Fatalf("Failed to Marshal message: %v", err) 153 } 154 newMessage := new(FragmentHeader) 155 err = newMessage.UnmarshalBinary(data) 156 if err != nil { 157 t.Fatalf("Failed to UnMarshal message: %v", err) 158 } 159 if err := testFragmentHeaderEqual(oriMessage, newMessage); err != nil { 160 t.Errorf(err.Error()) 161 } 162 } 163 164 msg := &FragmentHeader{ 165 NextHeader: 59, 166 Reserved: 0, 167 FragmentOffset: 0x1234, 168 MoreFragments: true, 169 Identification: 0xabcd, 170 } 171 testFunc(msg) 172 } 173 174 func testFragmentHeaderEqual(oriMessage *FragmentHeader, newMessage *FragmentHeader) error { 175 if oriMessage.NextHeader != newMessage.NextHeader { 176 return fmt.Errorf("FragmentHeader NextHeader not equal") 177 } 178 if oriMessage.Reserved != newMessage.Reserved { 179 return fmt.Errorf("FragmentHeader Reserved not equal") 180 } 181 if oriMessage.FragmentOffset != newMessage.FragmentOffset { 182 return fmt.Errorf("FragmentHeader FragmentOffset not equal") 183 } 184 if oriMessage.MoreFragments != newMessage.MoreFragments { 185 return fmt.Errorf("FragmentHeader MoreFragment not equal") 186 } 187 if oriMessage.Identification != newMessage.Identification { 188 return fmt.Errorf("FragmentHeader Identification not equal") 189 } 190 return nil 191 } 192 193 func TestIPv6(t *testing.T) { 194 testFunc := func(oriMessage *IPv6) { 195 data, err := oriMessage.MarshalBinary() 196 if err != nil { 197 t.Fatalf("Failed to Marshal message: %v", err) 198 } 199 newMessage := new(IPv6) 200 err = newMessage.UnmarshalBinary(data) 201 if err != nil { 202 t.Fatalf("Failed to UnMarshal message: %v", err) 203 } 204 err = testIPv6Equals(oriMessage, newMessage) 205 if err != nil { 206 t.Error(err.Error()) 207 } 208 } 209 srcIP := net.ParseIP("2001:db8::1") 210 dstIP := net.ParseIP("2001:db8::2") 211 icmpData := make([]byte, 4) 212 binary.BigEndian.PutUint32(icmpData, 0x34567890) 213 uplayerData := &ICMP{ 214 Type: 128, 215 Code: 0, 216 Checksum: 0x2345, 217 Data: icmpData, 218 } 219 220 msg1 := &IPv6{ 221 Version: 6, 222 TrafficClass: 1, 223 FlowLabel: 0x12345, 224 Length: 8, 225 NextHeader: Type_HBH, 226 HopLimit: 64, 227 NWSrc: srcIP, 228 NWDst: dstIP, 229 } 230 msg1.HbhHeader = &HopByHopHeader{ 231 NextHeader: Type_IPv6ICMP, 232 HEL: 0, 233 Options: []*Option{ 234 { 235 Type: 1, 236 Length: 4, 237 Data: []byte{0x00, 0x00, 0x00, 0x00}, 238 }, 239 }, 240 } 241 msg1.Data = uplayerData 242 testFunc(msg1) 243 244 msg2 := &IPv6{ 245 Version: 6, 246 TrafficClass: 1, 247 FlowLabel: 0x12345, 248 Length: 8, 249 NextHeader: Type_Routing, 250 HopLimit: 64, 251 NWSrc: srcIP, 252 NWDst: dstIP, 253 Data: uplayerData, 254 } 255 data := make([]byte, 20) 256 binary.BigEndian.PutUint32(data, uint32(0)) 257 nxtIP := net.ParseIP("2001:db8::3") 258 copy(data[4:], nxtIP) 259 msg2.RoutingHeader = &RoutingHeader{ 260 NextHeader: Type_Fragment, 261 HEL: 2, 262 RoutingType: 0, 263 SegmentsLeft: 1, 264 Data: util.NewBuffer(data), 265 } 266 msg2.FragmentHeader = &FragmentHeader{ 267 NextHeader: Type_IPv6ICMP, 268 Reserved: 0, 269 FragmentOffset: 0x1234, 270 MoreFragments: true, 271 Identification: 0xabcd, 272 } 273 testFunc(msg2) 274 } 275 276 func testIPv6Equals(oriMessage, newMessage *IPv6) error { 277 if oriMessage.Version != newMessage.Version { 278 return fmt.Errorf("IPv6 version not equal") 279 } 280 if oriMessage.TrafficClass != newMessage.TrafficClass { 281 return fmt.Errorf("IPv6 trafficClass not equal") 282 } 283 if oriMessage.FlowLabel != newMessage.FlowLabel { 284 return fmt.Errorf("IPv6 flowLable not equal") 285 } 286 if oriMessage.Length != newMessage.Length { 287 return fmt.Errorf("IPv6 Length not equal") 288 } 289 if oriMessage.NextHeader != newMessage.NextHeader { 290 return fmt.Errorf("IPv6 NextHeader not equal") 291 } 292 if oriMessage.HopLimit != newMessage.HopLimit { 293 return fmt.Errorf("IPv6 HotLimit not equal") 294 } 295 if !bytes.Equal(oriMessage.NWSrc, newMessage.NWSrc) { 296 return fmt.Errorf("IPv6 NWSrc not equal") 297 } 298 if !bytes.Equal(oriMessage.NWDst, newMessage.NWDst) { 299 return fmt.Errorf("IPv6 NWDst not equal") 300 } 301 oriData, err := oriMessage.Data.MarshalBinary() 302 if err != nil { 303 return err 304 } 305 newData, err := newMessage.Data.MarshalBinary() 306 if err != nil { 307 return err 308 } 309 if !bytes.Equal(oriData, newData) { 310 return fmt.Errorf("IPv6 Data not equal") 311 } 312 return nil 313 }