code: func (m *Message) SendCallback(fn CallbackFunc, arg interface{}) error {
  	s, err := newSocket()
  	if err != nil {
  		return err
  	}
  	defer s.free()
  
  	if errno := C.genl_connect(s.nls); errno != 0 {
  		return &Error{errno, "failed to connect to netlink"}
  	}
  	defer C.nl_close(s.nls)
  
  	cbArg := &callbackArg{fn: fn, arg: arg}
  	cbID := registerCallback(cbArg)
  	defer unregisterCallback(cbArg)
  
  	if errno := C._nl_socket_modify_cb(s.nls, C.NL_CB_VALID, C.NL_CB_CUSTOM, (C.nl_recvmsg_msg_cb_t)(unsafe.Pointer(C.callbackGateway)), C.uintptr_t(cbID)); errno != 0 {
  		return &Error{errno, "failed to modify callback"}
  	}
  	// nl_send_auto_complete returns number of bytes sent or a negative
  	// errno on failure.
  	if errno := C.nl_send_auto_complete(s.nls, m.nlm); errno < 0 {
  		return &Error{errno, "failed to send netlink message"}
  	}
  	if errno := C.nl_recvmsgs_default(s.nls); errno != 0 {
  		return &Error{errno, "failed to receive messages"}
  	}
  	return nil
  }
docs: // SendCallback sends the netlink message. The specified callback function
  // will be called for each message that is received in response.