diff options
author | Takashi Sakamoto <o-takashi@sakamocchi.jp> | 2022-05-08 15:33:32 +0900 |
---|---|---|
committer | 坂本 貴史 <o-takashi@sakamocchi.jp> | 2022-05-08 15:36:32 +0900 |
commit | 69e521f3dccad945baaa0ce1c8b11fef5c456124 (patch) | |
tree | f31d906bd6735e9e152650f2786de6d9822d4aaf | |
parent | 5bd9aac7914af335eeb9ff5cc52b3cf5d857c3a5 (diff) | |
download | libhinoko-69e521f3dccad945baaa0ce1c8b11fef5c456124.tar.gz |
fw_iso_ctx_private: add helper function for control of isoc packet
Linux FireWire subsystem forces userspace application to compute
control field of fw_cdev_iso_packet structure before system call.
This commit adds helper function for the purpose.
Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
-rw-r--r-- | src/fw_iso_ctx_private.c | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/src/fw_iso_ctx_private.c b/src/fw_iso_ctx_private.c index dde99a8..0a8bfc1 100644 --- a/src/fw_iso_ctx_private.c +++ b/src/fw_iso_ctx_private.c @@ -343,6 +343,21 @@ gboolean fw_iso_ctx_state_register_chunk(struct fw_iso_ctx_state *state, gboolea return TRUE; } +#define FW_CDEV_ISO_PACKET_CONTROL_HEADER_LENGTH_MASK 0xff000000 +#define FW_CDEV_ISO_PACKET_CONTROL_HEADER_LENGTH_SHIFT 24 +#define FW_CDEV_ISO_PACKET_CONTROL_PAYLOAD_MASK 0x0000ffff + +static guint fw_cdev_iso_packet_control_to_header_length(guint control) +{ + return (control & FW_CDEV_ISO_PACKET_CONTROL_HEADER_LENGTH_MASK) >> + FW_CDEV_ISO_PACKET_CONTROL_HEADER_LENGTH_SHIFT; +} + +static guint fw_cdev_iso_packet_control_to_payload_length(guint control) +{ + return (control & FW_CDEV_ISO_PACKET_CONTROL_PAYLOAD_MASK); +} + /** * fw_iso_ctx_state_queue_chunks: * @state: A [struct@FwIsoCtxState]. @@ -374,8 +389,8 @@ gboolean fw_iso_ctx_state_queue_chunks(struct fw_iso_ctx_state *state, GError ** datum = (struct fw_cdev_iso_packet *) (state->data + data_offset + data_length); - payload_length = datum->control & 0x0000ffff; - header_length = (datum->control & 0xff000000) >> 24; + payload_length = fw_cdev_iso_packet_control_to_payload_length(datum->control); + header_length = fw_cdev_iso_packet_control_to_header_length(datum->control); if (buf_offset + buf_length + payload_length > bytes_per_buffer) { |