blob: 5d9d509a3be78712de349cf71dc19d9a9130b70f [file] [log] [blame]
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* libmbim-glib -- GLib/GIO based library to control MBIM devices
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301 USA.
*
* Copyright (C) 2013 Aleksander Morgado <aleksander@gnu.org>
*
* This is a private non-installed header
*/
#ifndef _LIBMBIM_GLIB_MBIM_MESSAGE_PRIVATE_H_
#define _LIBMBIM_GLIB_MBIM_MESSAGE_PRIVATE_H_
#if !defined (LIBMBIM_GLIB_COMPILATION)
#error "This is a private header!!"
#endif
#include <glib.h>
#include "mbim-message.h"
G_BEGIN_DECLS
/*****************************************************************************/
/* The MbimMessage */
/* Defined in the same way as GByteArray */
struct _MbimMessage {
guint8 *data;
guint len;
};
/*****************************************************************************/
/* Basic message types */
struct header {
guint32 type;
guint32 length;
guint32 transaction_id;
} __attribute__((packed));
#define MBIM_MESSAGE_GET_MESSAGE_TYPE(self) \
(MbimMessageType) GUINT32_FROM_LE (((struct header *)(self->data))->type)
#define MBIM_MESSAGE_GET_MESSAGE_LENGTH(self) \
GUINT32_FROM_LE (((struct header *)(self->data))->length)
#define MBIM_MESSAGE_GET_TRANSACTION_ID(self) \
GUINT32_FROM_LE (((struct header *)(self->data))->transaction_id)
struct open_message {
guint32 max_control_transfer;
} __attribute__((packed));
struct open_done_message {
guint32 status_code;
} __attribute__((packed));
struct close_done_message {
guint32 status_code;
} __attribute__((packed));
struct error_message {
guint32 error_status_code;
} __attribute__((packed));
struct fragment_header {
guint32 total;
guint32 current;
} __attribute__((packed));
struct fragment_message {
struct fragment_header fragment_header;
guint8 buffer[];
} __attribute__((packed));
struct command_message {
struct fragment_header fragment_header;
guint8 service_id[16];
guint32 command_id;
guint32 command_type;
guint32 buffer_length;
guint8 buffer[];
} __attribute__((packed));
struct command_done_message {
struct fragment_header fragment_header;
guint8 service_id[16];
guint32 command_id;
guint32 status_code;
guint32 buffer_length;
guint8 buffer[];
} __attribute__((packed));
struct indicate_status_message {
struct fragment_header fragment_header;
guint8 service_id[16];
guint32 command_id;
guint32 buffer_length;
guint8 buffer[];
} __attribute__((packed));
struct full_message {
struct header header;
union {
struct open_message open;
struct open_done_message open_done;
/* nothing needed for close_message */
struct close_done_message close_done;
struct error_message error;
struct fragment_message fragment;
struct command_message command;
struct command_done_message command_done;
struct indicate_status_message indicate_status;
} message;
} __attribute__((packed));
/*****************************************************************************/
/* Fragment interface */
gboolean _mbim_message_is_fragment (const MbimMessage *self);
guint32 _mbim_message_fragment_get_total (const MbimMessage *self);
guint32 _mbim_message_fragment_get_current (const MbimMessage *self);
const guint8 *_mbim_message_fragment_get_payload (const MbimMessage *self,
guint32 *length);
/* Merge fragments into a message... */
MbimMessage *_mbim_message_fragment_collector_init (const MbimMessage *fragment,
GError **error);
gboolean _mbim_message_fragment_collector_add (MbimMessage *self,
const MbimMessage *fragment,
GError **error);
gboolean _mbim_message_fragment_collector_complete (MbimMessage *self);
/* Split message into fragments... */
struct fragment_info {
struct header header;
struct fragment_header fragment_header;
guint32 data_length;
const guint8 *data;
} __attribute__((packed));
struct fragment_info *_mbim_message_split_fragments (const MbimMessage *self,
guint32 max_fragment_size,
guint *n_fragments);
/*****************************************************************************/
/* Struct builder */
typedef struct {
GByteArray *fixed_buffer;
GByteArray *variable_buffer;
GArray *offsets;
} MbimStructBuilder;
MbimStructBuilder *_mbim_struct_builder_new (void);
GByteArray *_mbim_struct_builder_complete (MbimStructBuilder *builder);
void _mbim_struct_builder_append_byte_array (MbimStructBuilder *builder,
gboolean with_offset,
gboolean with_length,
const guint8 *buffer,
guint32 buffer_len);
void _mbim_struct_builder_append_uuid (MbimStructBuilder *builder,
const MbimUuid *value);
void _mbim_struct_builder_append_guint32 (MbimStructBuilder *builder,
guint32 value);
void _mbim_struct_builder_append_guint32_array (MbimStructBuilder *builder,
const guint32 *values,
guint32 n_values);
void _mbim_struct_builder_append_guint64 (MbimStructBuilder *builder,
guint64 value);
void _mbim_struct_builder_append_guint64_array (MbimStructBuilder *builder,
const guint64 *values,
guint32 n_values);
void _mbim_struct_builder_append_string (MbimStructBuilder *builder,
const gchar *value);
void _mbim_struct_builder_append_string_array (MbimStructBuilder *builder,
const gchar *const *values,
guint32 n_values);
void _mbim_struct_builder_append_ipv4 (MbimStructBuilder *builder,
const MbimIPv4 *value,
gboolean ref);
void _mbim_struct_builder_append_ipv4_array (MbimStructBuilder *builder,
const MbimIPv4 *values,
guint32 n_values);
void _mbim_struct_builder_append_ipv6 (MbimStructBuilder *builder,
const MbimIPv6 *value,
gboolean ref);
void _mbim_struct_builder_append_ipv6_array (MbimStructBuilder *builder,
const MbimIPv6 *values,
guint32 n_values);
/*****************************************************************************/
/* Message builder */
typedef struct {
MbimMessage *message;
MbimStructBuilder *contents_builder;
} MbimMessageCommandBuilder;
MbimMessageCommandBuilder *_mbim_message_command_builder_new (guint32 transaction_id,
MbimService service,
guint32 cid,
MbimMessageCommandType command_type);
MbimMessage *_mbim_message_command_builder_complete (MbimMessageCommandBuilder *builder);
void _mbim_message_command_builder_append_byte_array (MbimMessageCommandBuilder *builder,
gboolean with_offset,
gboolean with_length,
const guint8 *buffer,
guint32 buffer_len);
void _mbim_message_command_builder_append_uuid (MbimMessageCommandBuilder *builder,
const MbimUuid *value);
void _mbim_message_command_builder_append_guint32 (MbimMessageCommandBuilder *builder,
guint32 value);
void _mbim_message_command_builder_append_guint32_array (MbimMessageCommandBuilder *builder,
const guint32 *values,
guint32 n_values);
void _mbim_message_command_builder_append_guint64 (MbimMessageCommandBuilder *builder,
guint64 value);
void _mbim_message_command_builder_append_guint64_array (MbimMessageCommandBuilder *builder,
const guint64 *values,
guint32 n_values);
void _mbim_message_command_builder_append_string (MbimMessageCommandBuilder *builder,
const gchar *value);
void _mbim_message_command_builder_append_string_array (MbimMessageCommandBuilder *builder,
const gchar *const *values,
guint32 n_values);
void _mbim_message_command_builder_append_ipv4 (MbimMessageCommandBuilder *builder,
const MbimIPv4 *value,
gboolean ref);
void _mbim_message_command_builder_append_ipv4_array (MbimMessageCommandBuilder *builder,
const MbimIPv4 *values,
guint32 n_values);
void _mbim_message_command_builder_append_ipv6 (MbimMessageCommandBuilder *builder,
const MbimIPv6 *value,
gboolean ref);
void _mbim_message_command_builder_append_ipv6_array (MbimMessageCommandBuilder *builder,
const MbimIPv6 *values,
guint32 n_values);
/*****************************************************************************/
/* Message parser */
const guint8 *_mbim_message_read_byte_array (const MbimMessage *self,
guint32 struct_start_offset,
guint32 relative_offset,
gboolean has_offset,
gboolean has_length,
guint32 *array_size);
const MbimUuid *_mbim_message_read_uuid (const MbimMessage *self,
guint32 relative_offset);
guint32 _mbim_message_read_guint32 (const MbimMessage *self,
guint32 relative_offset);
guint32 *_mbim_message_read_guint32_array (const MbimMessage *self,
guint32 array_size,
guint32 relative_offset_array_start);
guint64 _mbim_message_read_guint64 (const MbimMessage *self,
guint64 relative_offset);
gchar *_mbim_message_read_string (const MbimMessage *self,
guint32 struct_start_offset,
guint32 relative_offset);
gchar **_mbim_message_read_string_array (const MbimMessage *self,
guint32 array_size,
guint32 struct_start_offset,
guint32 relative_offset_array_start);
const MbimIPv4 *_mbim_message_read_ipv4 (const MbimMessage *self,
guint32 relative_offset,
gboolean ref);
MbimIPv4 *_mbim_message_read_ipv4_array (const MbimMessage *self,
guint32 array_size,
guint32 relative_offset_array_start);
const MbimIPv6 *_mbim_message_read_ipv6 (const MbimMessage *self,
guint32 relative_offset,
gboolean ref);
MbimIPv6 *_mbim_message_read_ipv6_array (const MbimMessage *self,
guint32 array_size,
guint32 relative_offset_array_start);
G_END_DECLS
#endif /* _LIBMBIM_GLIB_MBIM_MESSAGE_PRIVATE_H_ */