code: func (m *Message) Marshal(v interface{}) error {
  	val := reflect.Indirect(reflect.ValueOf(v))
  	if val.Kind() != reflect.Struct {
  		return fmt.Errorf("%v is not a struct or a pointer to a struct", reflect.TypeOf(v))
  	}
  	return marshal(val, "", nil, m.nlm)
  }
docs: // Marshal converts the given struct into a netlink message. Each field within
  // the struct is added as netlink data, with structs and pointers to structs
  // being recursively added as nested data.
  //
  // Supported data types and their netlink mappings are as follows:
  //
  //	uint8:		NLA_U8
  //	uint16:		NLA_U16
  //	uint32:		NLA_U32
  //	uint64:		NLA_U64
  //	string:		NLA_STRING
  //	byte array:	NLA_UNSPEC
  //	struct:		NLA_NESTED
  //	net.IP:		NLA_UNSPEC
  //
  // Each field must have a `netlink' tag, which can contain the following
  // comma separated options:
  //
  //	attr:x		specify the netlink attribute for this field (required)
  //	network		value will be converted to its network byte order
  //	omitempty	if the field has a zero value it will be omitted
  //	optional	mark the field as being an optional (for unmarshalling)
  //
  // Other Go data types are unsupported and an error will be returned if one
  // is encountered.