Home | History | Annotate | Download | only in route
      1 // Copyright 2016 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 
      5 package route
      6 
      7 func (*wireFormat) parseInterfaceMessage(_ RIBType, b []byte) (Message, error) {
      8 	if len(b) < 32 {
      9 		return nil, errMessageTooShort
     10 	}
     11 	l := int(nativeEndian.Uint16(b[:2]))
     12 	if len(b) < l {
     13 		return nil, errInvalidMessage
     14 	}
     15 	attrs := uint(nativeEndian.Uint32(b[12:16]))
     16 	if attrs&sysRTA_IFP == 0 {
     17 		return nil, nil
     18 	}
     19 	m := &InterfaceMessage{
     20 		Version: int(b[2]),
     21 		Type:    int(b[3]),
     22 		Flags:   int(nativeEndian.Uint32(b[16:20])),
     23 		Index:   int(nativeEndian.Uint16(b[6:8])),
     24 		Addrs:   make([]Addr, sysRTAX_MAX),
     25 		raw:     b[:l],
     26 	}
     27 	ll := int(nativeEndian.Uint16(b[4:6]))
     28 	if len(b) < ll {
     29 		return nil, errInvalidMessage
     30 	}
     31 	a, err := parseLinkAddr(b[ll:])
     32 	if err != nil {
     33 		return nil, err
     34 	}
     35 	m.Addrs[sysRTAX_IFP] = a
     36 	m.Name = a.(*LinkAddr).Name
     37 	return m, nil
     38 }
     39 
     40 func (*wireFormat) parseInterfaceAddrMessage(_ RIBType, b []byte) (Message, error) {
     41 	if len(b) < 24 {
     42 		return nil, errMessageTooShort
     43 	}
     44 	l := int(nativeEndian.Uint16(b[:2]))
     45 	if len(b) < l {
     46 		return nil, errInvalidMessage
     47 	}
     48 	bodyOff := int(nativeEndian.Uint16(b[4:6]))
     49 	if len(b) < bodyOff {
     50 		return nil, errInvalidMessage
     51 	}
     52 	m := &InterfaceAddrMessage{
     53 		Version: int(b[2]),
     54 		Type:    int(b[3]),
     55 		Flags:   int(nativeEndian.Uint32(b[12:16])),
     56 		Index:   int(nativeEndian.Uint16(b[6:8])),
     57 		raw:     b[:l],
     58 	}
     59 	var err error
     60 	m.Addrs, err = parseAddrs(uint(nativeEndian.Uint32(b[12:16])), parseKernelInetAddr, b[bodyOff:])
     61 	if err != nil {
     62 		return nil, err
     63 	}
     64 	return m, nil
     65 }
     66 
     67 func (*wireFormat) parseInterfaceAnnounceMessage(_ RIBType, b []byte) (Message, error) {
     68 	if len(b) < 26 {
     69 		return nil, errMessageTooShort
     70 	}
     71 	l := int(nativeEndian.Uint16(b[:2]))
     72 	if len(b) < l {
     73 		return nil, errInvalidMessage
     74 	}
     75 	m := &InterfaceAnnounceMessage{
     76 		Version: int(b[2]),
     77 		Type:    int(b[3]),
     78 		Index:   int(nativeEndian.Uint16(b[6:8])),
     79 		What:    int(nativeEndian.Uint16(b[8:10])),
     80 		raw:     b[:l],
     81 	}
     82 	for i := 0; i < 16; i++ {
     83 		if b[10+i] != 0 {
     84 			continue
     85 		}
     86 		m.Name = string(b[10 : 10+i])
     87 		break
     88 	}
     89 	return m, nil
     90 }
     91