aboutsummaryrefslogtreecommitdiff
path: root/src/mm-port-qmi.h
blob: 793e3b1a1ef81d8cec990ae25dc48e10194eaa26 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program 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 General Public License for more details:
 *
 * Copyright (C) 2012 Google, Inc.
 */

#ifndef MM_PORT_QMI_H
#define MM_PORT_QMI_H

#include <glib.h>
#include <glib-object.h>
#include <gio/gio.h>

#include <libqmi-glib.h>

#include "mm-port.h"

typedef enum { /*< underscore_name=mm_port_qmi_kernel_data_mode >*/
    MM_PORT_QMI_KERNEL_DATA_MODE_NONE = 0,
    /* ethernet packets over the master network interface */
    MM_PORT_QMI_KERNEL_DATA_MODE_802_3 = 1 << 0,
    /* raw-ip packets over the master network interface */
    MM_PORT_QMI_KERNEL_DATA_MODE_RAW_IP = 1 << 1,
    /* multiplexing support setup with rmnet */
    MM_PORT_QMI_KERNEL_DATA_MODE_MUX_RMNET = 1 << 2,
    /* multiplexing support setup with qmi_wwan add_mux/del_mux */
    MM_PORT_QMI_KERNEL_DATA_MODE_MUX_QMIWWAN = 1 << 3,
} MMPortQmiKernelDataMode;

#define MM_PORT_QMI_DAP_IS_SUPPORTED_QMAP(dap)          \
    (dap == QMI_WDA_DATA_AGGREGATION_PROTOCOL_QMAPV5 || \
     dap == QMI_WDA_DATA_AGGREGATION_PROTOCOL_QMAPV4 || \
     dap == QMI_WDA_DATA_AGGREGATION_PROTOCOL_QMAP)

#define MM_TYPE_PORT_QMI            (mm_port_qmi_get_type ())
#define MM_PORT_QMI(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), MM_TYPE_PORT_QMI, MMPortQmi))
#define MM_PORT_QMI_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  MM_TYPE_PORT_QMI, MMPortQmiClass))
#define MM_IS_PORT_QMI(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MM_TYPE_PORT_QMI))
#define MM_IS_PORT_QMI_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  MM_TYPE_PORT_QMI))
#define MM_PORT_QMI_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  MM_TYPE_PORT_QMI, MMPortQmiClass))

typedef struct _MMPortQmi MMPortQmi;
typedef struct _MMPortQmiClass MMPortQmiClass;
typedef struct _MMPortQmiPrivate MMPortQmiPrivate;

struct _MMPortQmi {
    MMPort parent;
    MMPortQmiPrivate *priv;
};

struct _MMPortQmiClass {
    MMPortClass parent;
};

GType mm_port_qmi_get_type (void);
G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMPortQmi, g_object_unref)

MMPortQmi *mm_port_qmi_new          (const gchar          *name,
                                     MMPortSubsys          subsys);
#if QMI_QRTR_SUPPORTED
MMPortQmi *mm_port_qmi_new_from_node (const gchar *name,
                                      QrtrNode    *node);
#endif
void       mm_port_qmi_open         (MMPortQmi            *self,
                                     gboolean              set_data_format,
                                     GCancellable         *cancellable,
                                     GAsyncReadyCallback   callback,
                                     gpointer              user_data);
gboolean   mm_port_qmi_open_finish  (MMPortQmi            *self,
                                     GAsyncResult         *res,
                                     GError              **error);
gboolean   mm_port_qmi_is_open      (MMPortQmi            *self);
void       mm_port_qmi_close        (MMPortQmi            *self,
                                     GAsyncReadyCallback   callback,
                                     gpointer              user_data);
gboolean   mm_port_qmi_close_finish (MMPortQmi            *self,
                                     GAsyncResult         *res,
                                     GError              **error);

void       mm_port_qmi_set_net_driver (MMPortQmi   *self,
                                       const gchar *net_driver);

typedef enum {
    MM_PORT_QMI_FLAG_DEFAULT  = 0,
    MM_PORT_QMI_FLAG_WDS_IPV4 = 100,
    MM_PORT_QMI_FLAG_WDS_IPV6 = 101
} MMPortQmiFlag;

void     mm_port_qmi_allocate_client        (MMPortQmi *self,
                                             QmiService service,
                                             MMPortQmiFlag flag,
                                             GCancellable *cancellable,
                                             GAsyncReadyCallback callback,
                                             gpointer user_data);
gboolean mm_port_qmi_allocate_client_finish (MMPortQmi *self,
                                             GAsyncResult *res,
                                             GError **error);

void     mm_port_qmi_release_client         (MMPortQmi     *self,
                                             QmiService     service,
                                             MMPortQmiFlag  flag);

QmiClient *mm_port_qmi_peek_client (MMPortQmi *self,
                                    QmiService service,
                                    MMPortQmiFlag flag);
QmiClient *mm_port_qmi_get_client  (MMPortQmi *self,
                                    QmiService service,
                                    MMPortQmiFlag flag);

QmiDevice *mm_port_qmi_peek_device (MMPortQmi *self);

QmiDataEndpointType mm_port_qmi_get_endpoint_type             (MMPortQmi *self);
guint               mm_port_qmi_get_endpoint_interface_number (MMPortQmi *self);

MMPortQmiKernelDataMode       mm_port_qmi_get_kernel_data_modes         (MMPortQmi *self);
QmiWdaLinkLayerProtocol       mm_port_qmi_get_link_layer_protocol       (MMPortQmi *self);
QmiWdaDataAggregationProtocol mm_port_qmi_get_data_aggregation_protocol (MMPortQmi *self);
guint                         mm_port_qmi_get_max_multiplexed_links     (MMPortQmi *self);

typedef enum {
    MM_PORT_QMI_SETUP_DATA_FORMAT_ACTION_QUERY,
    MM_PORT_QMI_SETUP_DATA_FORMAT_ACTION_SET_DEFAULT,
    MM_PORT_QMI_SETUP_DATA_FORMAT_ACTION_SET_MULTIPLEX,
} MMPortQmiSetupDataFormatAction;

void     mm_port_qmi_setup_data_format        (MMPortQmi                      *self,
                                               MMPort                         *data,
                                               MMPortQmiSetupDataFormatAction  action,
                                               GAsyncReadyCallback             callback,
                                               gpointer                        user_data);
gboolean mm_port_qmi_setup_data_format_finish (MMPortQmi                      *self,
                                               GAsyncResult                   *res,
                                               GError                        **error);

void   mm_port_qmi_setup_link        (MMPortQmi             *self,
                                      MMPort                *data,
                                      const gchar           *link_prefix_hint,
                                      GAsyncReadyCallback    callback,
                                      gpointer               user_data);
gchar *mm_port_qmi_setup_link_finish (MMPortQmi             *self,
                                      GAsyncResult          *res,
                                      guint                 *mux_id,
                                      GError               **error);

void   mm_port_qmi_cleanup_link          (MMPortQmi            *self,
                                          const gchar          *link_name,
                                          guint                 mux_id,
                                          GAsyncReadyCallback   callback,
                                          gpointer              user_data);
gboolean mm_port_qmi_cleanup_link_finish (MMPortQmi            *self,
                                          GAsyncResult         *res,
                                          GError              **error);

void     mm_port_qmi_reset        (MMPortQmi            *self,
                                   MMPort               *data,
                                   GAsyncReadyCallback   callback,
                                   gpointer              user_data);
gboolean mm_port_qmi_reset_finish (MMPortQmi            *self,
                                   GAsyncResult         *res,
                                   GError              **error);

#endif /* MM_PORT_QMI_H */