+int xbee_recv_data(struct xbee_recv_hdr *recvframe, unsigned len)
+{
+ int datalen = len - sizeof(*recvframe);
+ struct rc_proto_hdr *rch = (struct rc_proto_hdr *) &recvframe->data;
+
+ if (datalen < sizeof(struct rc_proto_hdr))
+ return -1;
+
+ switch (rch->type) {
+ case RC_PROTO_TYPE_CHANNEL:
+ if (datalen != sizeof(struct rc_proto_channel))
+ return -1;
+ break;
+ case RC_PROTO_TYPE_RANGE: {
+ struct rc_proto_range *rcr =
+ (struct rc_proto_range *) recvframe->data;
+
+ if (datalen != sizeof(struct rc_proto_range))
+ return -1;
+
+ if (rcr->power_level >= MAX_POWER_LEVEL)
+ return -1;
+
+ rc_proto_rx_range(rcr->power_level);
+
+ break;
+ }
+ default:
+ return -1;
+ }
+
+ return 0;
+}
+
+