avoid copy by using iovecs
[protos/xbee-avr.git] / rc_proto.c
index 22b6f28..56e8ad6 100644 (file)
@@ -78,22 +78,21 @@ void rc_proto_rx_power_probe(int power_level)
 }
 
 /* send a hello message */
-// XXX iovec for xbee ?
 int8_t rc_proto_send_hello(uint64_t addr, void *data, uint8_t data_len)
 {
-       struct {
-               struct rc_proto_echo_req hdr;
-               char buf[XBEE_MAX_FRAME_LEN - sizeof(struct rc_proto_echo_req)];
-       } frame;
+       struct rc_proto_echo_req hdr;
+       struct xbee_msg msg;
 
-       if (data_len > sizeof(frame.buf))
-               return -1;
+       hdr.type = RC_PROTO_HELLO;
+       hdr.datalen = data_len;
+
+       msg.iovlen = 2;
+       msg.iov[0].buf = &hdr;
+       msg.iov[0].len = sizeof(hdr);
+       msg.iov[1].buf = data;
+       msg.iov[1].len = data_len;
 
-       frame.hdr.type = RC_PROTO_HELLO;
-       frame.hdr.datalen = data_len;
-       memcpy(frame.buf, data, data_len);
-       return xbeeapp_send_msg(addr, &frame,
-                               data_len + sizeof(struct rc_proto_echo_req), 1);
+       return xbeeapp_send_msg(addr, &msg, 1);
 }