code: func (v *VLAN) read(b []byte) (int, error) {
  	// Check for VLAN priority in valid range
  	if v.Priority > PriorityNetworkControl {
  		return 0, ErrInvalidVLAN
  	}
  
  	// Check for VLAN ID in valid range
  	if v.ID >= VLANMax {
  		return 0, ErrInvalidVLAN
  	}
  
  	// 3 bits: priority
  	ub := uint16(v.Priority) << 13
  
  	// 1 bit: drop eligible
  	var drop uint16
  	if v.DropEligible {
  		drop = 1
  	}
  	ub |= drop << 12
  
  	// 12 bits: VLAN ID
  	ub |= v.ID
  
  	binary.BigEndian.PutUint16(b, ub)
  	return 2, nil
  }
docs: // read reads data from a VLAN into b.  read is used to marshal a VLAN into
  // binary form, but does not allocate on its own.