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  }