]> rtime.felk.cvut.cz Git - can-utils.git/blobdiff - canframelen.h
canbusload: Add exact CAN frame length calculation (including bitstuffing)
[can-utils.git] / canframelen.h
diff --git a/canframelen.h b/canframelen.h
new file mode 100644 (file)
index 0000000..225bc09
--- /dev/null
@@ -0,0 +1,35 @@
+#ifndef CANFRAMELEN_H
+#define CANFRAMELEN_H
+
+#include <linux/can.h>
+
+/**
+ * Frame length calculation modes.
+ *
+ * CFL_WORSTCASE corresponds to Ken Tindells *worst* case calculation
+ * for stuff-bits (see "Guaranteeing Message Latencies on Controller
+ * Area Network" 1st ICC'94) the needed bits on the wire can be
+ * calculated as:
+ *
+ * (34 + 8n)/5 + 47 + 8n for SFF frames (11 bit CAN-ID) => (269 + 48n)/5
+ * (54 + 8n)/5 + 67 + 8n for EFF frames (29 bit CAN-ID) => (389 + 48n)/5
+ *
+ * while 'n' is the data length code (number of payload bytes)
+ *
+ */
+enum cfl_mode {
+       CFL_NO_BITSTUFFING, /* plain bit calculation without bitstuffing */
+       CFL_WORSTCASE, /* with bitstuffing following Tindells estimation */
+       CFL_EXACT, /* exact calculation of stuffed bits based on frame
+                   * content and CRC */
+};
+
+/**
+ * Calculates the number of bits a frame needs on the wire (including
+ * inter frame space).
+ *
+ * Mode determines how to deal with stuffed bits.
+ */
+unsigned can_frame_length(struct canfd_frame *frame, enum cfl_mode mode, int mtu);
+
+#endif