summaryrefslogtreecommitdiffstats
path: root/uqmid/modem.h
blob: c31c9663e6b4a0dba4e62b9700532d139c7f0527 (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
/*
 * uqmi -- tiny QMI support implementation
 *
 * Copyright (C) 2023 Alexander Couzens <lynxis@fe80.eu>
 *
 * 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.
 */

#ifndef __UQMID_MODEM_H
#define __UQMID_MODEM_H

#include "sim.h"
#include <libubus.h>
#include <netinet/in.h>

#define IMEI_LEN 15
#define PATH_LEN 128


// try to get osmocom fsm into here?
struct modem_config {
	bool configured;
	char *apn;
	char *pin;
	bool roaming;
	uint8_t pdp_type;
};

struct modem {
	char *name;
	char *device;
	char imei[IMEI_LEN];
	char path[PATH_LEN];

	char *manuf;
	char *model;
	char *rev;

	/* unsure if iccid should be here */
	char *iccid;
	char *imsi;

	struct modem_config config;
	struct {
		/* Radio Access Technology */
		int rat;
		/* Mobile Country Code */
		int mcc;
		/* Mobile Network Code */
		int mnc;
		/* len can be 2 or 3 */
		int mnc_len;
		/* Operator name, can be from Sim or network. */
		char *operator_name;
		/* attached to Circuit Switch/Voice */
		bool cs;
		/* attached to Packet Switch/Data */
		bool ps;
		/* if an error happened and the modem should stay off */
		char *error;
	} state;

	/* TODO: add multiple bearer support later */
	struct {
		/* The QMI internal handle */
		uint32_t packet_data_handle;
		/* either ipv4, ipv6, ipv46 */
		int pdp_type;
		/* valid v4_addr and ipv46 */
		struct sockaddr_in v4_addr;
		struct sockaddr_in v4_netmask;
		struct sockaddr_in v4_gateway;
		/* valid v6 and ipv46 */
		struct sockaddr_in6 v6;
		struct sockaddr_storage dns1;
		struct sockaddr_storage dns2;
	} brearer;

	struct {
		/* Do we found a valid simcard */
		bool init;
		/* Certain modems (and maybe simcards) support either unlocking the sim via pin1 or upin. */
		enum uqmi_sim_state state;
		bool use_upin;
		bool requires_unlock;
		int pin_retries;
		int puk_retries;
	} sim;

	struct qmi_dev *qmi;

	struct list_head list;
	struct ubus_object ubus;

	struct osmo_fsm_inst *fi;
};

int uqmid_modem_add(const char *name, const char *device, bool qmi_over_mbim);
int uqmid_modem_remove(struct modem *modem);
int uqmid_modem_start(struct modem *modem);
int uqmid_modem_configured(struct modem *modem);
void uqmid_modem_set_error(struct modem *modem, const char *error);

typedef void (*uqmid_modem_get_opmode_cb)(void *data, int opmode_err, int opmode);
int uqmid_modem_get_opmode(struct modem *modem, uqmid_modem_get_opmode_cb cb, void *cb_data);
int uqmid_modem_networkstatus(struct modem *modem);
struct modem *uqmid_modem_find_by_device(const char *device);
struct modem *uqmid_modem_find_by_name(const char *name);

#endif /* __UQMID_MODEM_H */