blob: 6b2fd4f7b058c59a25f39be6ed09f56bbcf8caf2 [file] [log] [blame]
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* SPDX-License-Identifier: LGPL-2.1-or-later */
/*
* libmbim-glib -- GLib/GIO based library to control MBIM devices
*
* Copyright (C) 2021 Aleksander Morgado <aleksander@aleksander.es>
* Copyright (C) 2021 Intel Corporation
*/
#ifndef _LIBMBIM_GLIB_MBIM_TLV_H_
#define _LIBMBIM_GLIB_MBIM_TLV_H_
#if !defined (__LIBMBIM_GLIB_H_INSIDE__) && !defined (LIBMBIM_GLIB_COMPILATION)
#error "Only <libmbim-glib.h> can be included directly."
#endif
#include <glib.h>
#include <glib-object.h>
#include "mbim-uuid.h"
G_BEGIN_DECLS
/**
* SECTION:mbim-tlv
* @title: MbimTlv
* @short_description: A variable-sized data structure specified in Microsoft
* MBIM extension v3.0.
*
* The #MbimTlv structure is capable of exchanging a wide range of information
* between an MBIM host and an MBIM device.
*
* CID payloads for requests, responses, and/or notifications may contain zero
* or more unnamed and optional Information Elements (IE) encoded as #MbimTlv
* fields.
*/
/**
* MbimTlv:
*
* An opaque type representing a MBIM TLV.
*
* Since: 1.28
*/
typedef struct _MbimTlv MbimTlv;
GType mbim_tlv_get_type (void) G_GNUC_CONST;
#define MBIM_TYPE_TLV (mbim_tlv_get_type ())
/*****************************************************************************/
/* Generic TLV interface */
/**
* MbimTlvType:
* @MBIM_TLV_TYPE_INVALID: Invalid TLV type.
* @MBIM_TLV_TYPE_UE_POLICITES: UE policies.
* @MBIM_TLV_TYPE_SINGLE_NSSAI: Single NSSAI.
* @MBIM_TLV_TYPE_ALLOWED_NSSAI: Allowed NSSAI.
* @MBIM_TLV_TYPE_CFG_NSSAI: Configured NSSAI.
* @MBIM_TLV_TYPE_DFLT_CFG_NSSAI: Default configured NSSAI.
* @MBIM_TLV_TYPE_PRECFG_DFLT_CFG_NSSAI: Preconfigured default configured NSSAI.
* @MBIM_TLV_TYPE_REJ_NSSAI: Rejected NSSAI.
* @MBIM_TLV_TYPE_LADN: Local Area Data Network (LADN).
* @MBIM_TLV_TYPE_TAI: Tracking Area Identity (TAI).
* @MBIM_TLV_TYPE_WCHAR_STR: WCHAR string.
* @MBIM_TLV_TYPE_UINT16_TBL: Array of 1 or more @guint16 entries.
* @MBIM_TLV_TYPE_EAP_PACKET: Extensible Authentication Protocol packet.
* @MBIM_TLV_TYPE_PCO: Protocol Configuration Option (PCO).
* @MBIM_TLV_TYPE_ROUTE_SELECTION_DESCRIPTORS: One or more route selection descriptors.
* @MBIM_TLV_TYPE_TRAFFIC_PARAMETERS: A traffic parameters record.
* @MBIM_TLV_TYPE_WAKE_COMMAND: Wake command.
* @MBIM_TLV_TYPE_WAKE_PACKET: Wake packet.
*
* Type of the MBIM TLV.
*
* Since: 1.28
*/
typedef enum { /*< since=1.28 >*/
MBIM_TLV_TYPE_INVALID = 0,
MBIM_TLV_TYPE_UE_POLICITES = 1,
MBIM_TLV_TYPE_SINGLE_NSSAI = 2,
MBIM_TLV_TYPE_ALLOWED_NSSAI = 3,
MBIM_TLV_TYPE_CFG_NSSAI = 4,
MBIM_TLV_TYPE_DFLT_CFG_NSSAI = 5,
MBIM_TLV_TYPE_PRECFG_DFLT_CFG_NSSAI = 6,
MBIM_TLV_TYPE_REJ_NSSAI = 7,
MBIM_TLV_TYPE_LADN = 8,
MBIM_TLV_TYPE_TAI = 9,
MBIM_TLV_TYPE_WCHAR_STR = 10,
MBIM_TLV_TYPE_UINT16_TBL = 11,
MBIM_TLV_TYPE_EAP_PACKET = 12,
MBIM_TLV_TYPE_PCO = 13,
MBIM_TLV_TYPE_ROUTE_SELECTION_DESCRIPTORS = 14,
MBIM_TLV_TYPE_TRAFFIC_PARAMETERS = 15,
MBIM_TLV_TYPE_WAKE_COMMAND = 16,
MBIM_TLV_TYPE_WAKE_PACKET = 17,
} MbimTlvType;
/**
* mbim_tlv_new:
* @type: a #MbimTlvType.
* @data: contents of the TLV.
* @data_length: length of the message.
*
* Create a #MbimTlv with the given contents.
*
* Returns: (transfer full): a newly created #MbimTlv, which should be freed with mbim_tlv_unref().
*
* Since: 1.28
*/
MbimTlv *mbim_tlv_new (MbimTlvType type,
const guint8 *data,
guint32 data_length);
/**
* mbim_tlv_dup:
* @self: a #MbimTlv to duplicate.
*
* Create a #MbimTlv with the same contents as @self.
*
* Returns: (transfer full): a newly created #MbimTlv, which should be freed with mbim_tlv_unref().
*
* Since: 1.28
*/
MbimTlv *mbim_tlv_dup (const MbimTlv *self);
/**
* mbim_tlv_ref:
* @self: a #MbimTlv.
*
* Atomically increments the reference count of @self by one.
*
* Returns: (transfer full): the new reference to @self.
*
* Since: 1.28
*/
MbimTlv *mbim_tlv_ref (MbimTlv *self);
/**
* mbim_tlv_unref:
* @self: a #MbimTlv.
*
* Atomically decrements the reference count of @self by one.
* If the reference count drops to 0, @self is completely disposed.
*
* Since: 1.28
*/
void mbim_tlv_unref (MbimTlv *self);
/**
* mbim_tlv_get_raw:
* @self: a #MbimTlv.
* @length: (out): return location for the size of the output buffer.
* @error: return location for error or %NULL.
*
* Gets the whole raw data buffer of the #MbimTlv.
*
* Returns: The raw data buffer, or #NULL if @error is set.
*
* Since: 1.28
*/
const guint8 *mbim_tlv_get_raw (const MbimTlv *self,
guint32 *length,
GError **error);
/**
* mbim_tlv_get_tlv_type:
* @self: a #MbimTlv.
*
* Gets the message type.
*
* Returns: a #MbimTlvType.
*
* Since: 1.28
*/
MbimTlvType mbim_tlv_get_tlv_type (const MbimTlv *self);
/**
* mbim_tlv_get_tlv_data:
* @self: a #MbimTlv.
* @out_length: (out): return location for the size of the output buffer.
*
* Gets the TLV raw data.
*
* Returns: (transfer none): The raw data buffer, or #NULL if empty.
*
* Since: 1.28
*/
const guint8 *mbim_tlv_get_tlv_data (const MbimTlv *self,
guint32 *out_length);
G_DEFINE_AUTOPTR_CLEANUP_FUNC (MbimTlv, mbim_tlv_unref)
/*****************************************************************************/
/* String TLV type helpers */
/**
* mbim_tlv_string_new:
* @str: a string.
* @error: return location for error or %NULL.
*
* Create a #MbimTlv of type %MBIM_TLV_TYPE_WCHAR_STR with the given contents.
*
* Returns: (transfer full): a newly created #MbimTlv which should be freed with mbim_tlv_unref(), or %NULL if @error is set.
*
* Since: 1.28
*/
MbimTlv *mbim_tlv_string_new (const gchar *str,
GError **error);
/**
* mbim_tlv_string_get:
* @self: a #MbimTlv of type %MBIM_TLV_TYPE_WCHAR_STR.
* @error: return location for error or %NULL.
*
* Get a string with the contents in the #MbimTlv.
*
* Returns: (transfer full): a newly created string, which should be freed with g_free(), or %NULL if @error is set.
*
* Since: 1.28
*/
gchar *mbim_tlv_string_get (const MbimTlv *self,
GError **error);
/*****************************************************************************/
/* guint16 array type helpers */
/**
* mbim_tlv_guint16_array_get:
* @self: a #MbimTlv of type %MBIM_TLV_TYPE_UINT16_TBL.
* @array_size: (out)(optional)(transfer none): return location for a #guint32,
* or %NULL if the field is not needed.
* @array: (out)(optional)(transfer full)(type guint16): return location for a
* newly allocated array of #guint16 values, or %NULL if the field is not
* needed. Free the returned value with g_free().
* @error: return location for error or %NULL.
*
* Get an array of #guint16 values with the contents in the #MbimTlv.
*
* The method may return a successful return even with on empty arrays (i.e.
* with @array_size set to 0 and @array set to %NULL).
*
* Returns: %TRUE if on success, %FALSE if @error is set.
*
* Since: 1.28
*/
gboolean mbim_tlv_guint16_array_get (const MbimTlv *self,
guint32 *array_size,
guint16 **array,
GError **error);
/*****************************************************************************/
/* wake command type helpers */
/**
* mbim_tlv_wake_command_get:
* @self: a #MbimTlv of type %MBIM_TLV_TYPE_WAKE_COMMAND.
* @service: (out)(optional)(transfer none): return location for a #MbimUuid
* specifying the service that triggered the wake.
* @cid: (out)(optional)(transfer none): return location for the command id that
* triggered the wake.
* @payload_size: (out)(optional)(transfer none): return location for a #guint32,
* or %NULL if the field is not needed.
* @payload: (out)(optional)(transfer full)(type guint8): return location for a
* newly allocated array of #guint8 values, or %NULL if the field is not
* needed. Free the returned value with g_free().
* @error: return location for error or %NULL.
*
* Get the contents of a wake command TLV.
*
* The method may return a successful return even with on empty payload (i.e.
* with @payload_size set to 0 and @payload set to %NULL).
*
* Returns: %TRUE if on success, %FALSE if @error is set.
*
* Since: 1.28
*/
gboolean mbim_tlv_wake_command_get (const MbimTlv *self,
const MbimUuid **service,
guint32 *cid,
guint32 *payload_size,
guint8 **payload,
GError **error);
/*****************************************************************************/
/* wake packet type helpers */
/**
* mbim_tlv_wake_packet_get:
* @self: a #MbimTlv of type %MBIM_TLV_TYPE_WAKE_PACKET.
* @filter_id: (out)(optional)(transfer none): return location for a #guint32
* specifying the filter id.
* @original_packet_size: (out)(optional)(transfer none): return location for a
* #guint32, or %NULL if the field is not needed.
* @packet_size: (out)(optional)(transfer none): return location for a #guint32,
* or %NULL if the field is not needed.
* @packet: (out)(optional)(transfer full)(type guint8): return location for a
* newly allocated array of #guint8 values, or %NULL if the field is not
* needed. Free the returned value with g_free().
* @error: return location for error or %NULL.
*
* Get the contents of a wake packet TLV.
*
* Returns: %TRUE if on success, %FALSE if @error is set.
*
* Since: 1.28
*/
gboolean mbim_tlv_wake_packet_get (const MbimTlv *self,
guint32 *filter_id,
guint32 *original_packet_size,
guint32 *packet_size,
guint8 **packet,
GError **error);
G_END_DECLS
#endif /* _LIBMBIM_GLIB_MBIM_TLV_H_ */