summaryrefslogtreecommitdiff
path: root/include/gsmd
diff options
context:
space:
mode:
Diffstat (limited to 'include/gsmd')
-rw-r--r--include/gsmd/atcmd.h17
-rw-r--r--include/gsmd/gsmd.h88
-rw-r--r--include/gsmd/select.h26
-rw-r--r--include/gsmd/unsolicited.h18
-rw-r--r--include/gsmd/usock.h41
-rw-r--r--include/gsmd/vendorplugin.h27
6 files changed, 216 insertions, 1 deletions
diff --git a/include/gsmd/atcmd.h b/include/gsmd/atcmd.h
new file mode 100644
index 0000000..0d6c62a
--- /dev/null
+++ b/include/gsmd/atcmd.h
@@ -0,0 +1,17 @@
+#ifndef __GSMD_ATCMD_H
+#define __GSMD_ATCMD_H
+
+#ifdef __GSMD__
+
+#include <gsmd/gsmd.h>
+
+typedef int atcmd_cb_t(struct gsmd_atcmd *cmd, void *ctx, char *resp);
+
+extern struct gsmd_atcmd *atcmd_fill(const char *cmd, int rlen, atcmd_cb_t *cb, void *ctx, u_int16_t id);
+extern int atcmd_submit(struct gsmd *g, struct gsmd_atcmd *cmd);
+extern int atcmd_init(struct gsmd *g, int sockfd);
+extern void atcmd_drain(int fd);
+
+#endif /* __GSMD__ */
+
+#endif
diff --git a/include/gsmd/gsmd.h b/include/gsmd/gsmd.h
index f5b61d5..9b99a15 100644
--- a/include/gsmd/gsmd.h
+++ b/include/gsmd/gsmd.h
@@ -1,4 +1,92 @@
#ifndef _GSMD_H
#define _GSMD_H
+#ifdef __GSMD__
+
+#include <sys/types.h>
+
+#include <common/linux_list.h>
+
+#include <gsmd/vendorplugin.h>
+#include <gsmd/select.h>
+
+/* Refer to 3GPP TS 07.07 v 7.8.0, Chapter 4.1 */
+#define LGSM_ATCMD_F_EXTENDED 0x01 /* as opposed to basic */
+#define LGSM_ATCMD_F_PARAM 0x02 /* as opposed to action */
+
+struct gsmd_atcmd {
+ struct llist_head list;
+ void *ctx;
+ int (*cb)(struct gsmd_atcmd *cmd, void *ctx, char *resp);
+ char *resp;
+ int32_t ret;
+ u_int32_t buflen;
+ u_int16_t id;
+ u_int8_t flags;
+ char buf[];
+};
+
+enum llparse_state {
+ LLPARSE_STATE_IDLE, /* idle, not parsing a response */
+ LLPARSE_STATE_IDLE_CR, /* CR before response (V1) */
+ LLPARSE_STATE_IDLE_LF, /* LF before response (V1) */
+ LLPARSE_STATE_RESULT, /* within result payload */
+ LLPARSE_STATE_RESULT_CR, /* CR after result */
+ LLPARSE_STATE_ERROR, /* something went wrong */
+ /* ... idle again */
+};
+
+/* we can't take any _single_ response bigger than this: */
+#define LLPARSE_BUF_SIZE 256
+
+struct llparser {
+ enum llparse_state state;
+ unsigned int len;
+ unsigned int flags;
+ void *ctx;
+ int (*cb)(const char *buf, int len, void *ctx);
+ char *cur;
+ char buf[LLPARSE_BUF_SIZE];
+};
+
+struct gsmd;
+
+#define GSMD_FLAG_V0 0x0001 /* V0 responses to be expected from TA */
+
+struct gsmd {
+ unsigned int flags;
+ struct gsmd_fd gfd_uart;
+ struct gsmd_fd gfd_sock;
+ struct llparser llp;
+ struct llist_head users;
+ struct llist_head pending_atcmds; /* our busy gsmd_atcmds */
+ struct llist_head busy_atcmds; /* our busy gsmd_atcmds */
+ struct gsmd_vendor_plugin *vendorpl;
+};
+
+struct gsmd_user {
+ struct llist_head list; /* our entry in the global list */
+ struct llist_head finished_ucmds; /* our busy gsmd_ucmds */
+ struct gsmd *gsmd;
+ struct gsmd_fd gfd; /* the socket */
+ u_int32_t subscriptions; /* bitmaks of subscribed event groups */
+};
+
+#define GSMD_DEBUG 1 /* debugging information */
+#define GSMD_INFO 3
+#define GSMD_NOTICE 5 /* abnormal/unexpected condition */
+#define GSMD_ERROR 7 /* error condition, requires user action */
+#define GSMD_FATAL 8 /* fatal, program aborted */
+
+extern int gsmdlog_init(const char *path);
+/* write a message to the daemons' logfile */
+void __gsmd_log(int level, const char *file, int line, const char *function, const char *message, ...);
+/* macro for logging including filename and line number */
+#define gsmd_log(level, format, args ...) \
+ __gsmd_log(level, __FILE__, __LINE__, __FUNCTION__, format, ## args)
+
+#define DEBUGP(x, args ...) gsmd_log(GSMD_DEBUG, x, ## args)
+
+#endif /* __GSMD__ */
+
#endif /* _GSMD_H */
diff --git a/include/gsmd/select.h b/include/gsmd/select.h
new file mode 100644
index 0000000..b75c338
--- /dev/null
+++ b/include/gsmd/select.h
@@ -0,0 +1,26 @@
+#ifndef __GSMD_SELECT_H
+#define __GSMD_SELECT_H
+
+#ifdef __GSMD__
+
+#include <common/linux_list.h>
+
+#define GSMD_FD_READ 0x0001
+#define GSMD_FD_WRITE 0x0002
+#define GSMD_FD_EXCEPT 0x0004
+
+struct gsmd_fd {
+ struct llist_head list;
+ int fd; /* file descriptor */
+ unsigned int when;
+ int (*cb)(int fd, unsigned int what, void *data);
+ void *data; /* void * to pass to callback */
+};
+
+extern int gsmd_register_fd(struct gsmd_fd *ufd);
+extern void gsmd_unregister_fd(struct gsmd_fd *ufd);
+extern int gsmd_select_main(void);
+
+#endif /* __GSMD__ */
+
+#endif
diff --git a/include/gsmd/unsolicited.h b/include/gsmd/unsolicited.h
new file mode 100644
index 0000000..e7f17c5
--- /dev/null
+++ b/include/gsmd/unsolicited.h
@@ -0,0 +1,18 @@
+#ifndef __GSMD_UNSOLICITED_H
+#define __GSMD_UNSOLICITED_H
+
+#ifdef __GSMD__
+
+#include <gsmd/gsmd.h>
+
+struct gsmd_unsolicit {
+ const char *prefix;
+ int (*parse)(char *unsol, int len, const char *param, struct gsmd *gsmd);
+};
+
+extern int unsolicited_parse(struct gsmd *g, char *buf, int len, const char *param);
+extern int generate_event_from_cme(struct gsmd *g, unsigned int cme_error);
+
+#endif /* __GSMD__ */
+
+#endif
diff --git a/include/gsmd/usock.h b/include/gsmd/usock.h
index 2eaa6cf..94e8c37 100644
--- a/include/gsmd/usock.h
+++ b/include/gsmd/usock.h
@@ -53,6 +53,9 @@ enum gsmd_msg_phone {
enum gsmd_msg_network {
GSMD_NETWORK_REGISTER = 1,
+ GSMD_NETWORK_SIGQ_GET = 2,
+ GSMD_NETWORK_VMAIL_GET = 3,
+ GSMD_NETWORK_VMAIL_SET = 4,
};
/* Length from 3GPP TS 04.08, Clause 10.5.4.7 */
@@ -61,7 +64,17 @@ enum gsmd_msg_network {
struct gsmd_addr {
u_int8_t type;
char number[GSMD_ADDR_MAXLEN+1];
-};
+} __attribute__ ((packed));
+
+struct gsmd_signal_quality {
+ u_int8_t rssi;
+ u_int8_t ber;
+} __attribute__ ((packed));
+
+struct gsmd_voicemail {
+ u_int8_t enable;
+ struct gsmd_addr addr;
+} __attribute__ ((packed));
struct gsmd_evt_auxdata {
union {
@@ -89,6 +102,9 @@ struct gsmd_evt_auxdata {
struct {
u_int8_t tz;
} timezone;
+ struct {
+ struct gsmd_signal_quality sigq;
+ } signal;
} u;
} __attribute__((packed));
@@ -103,4 +119,27 @@ struct gsmd_msg_hdr {
} __attribute__((packed));
+#ifdef __GSMD__
+
+#include <common/linux_list.h>
+
+#include <gsmd/usock.h>
+#include <gsmd/gsmd.h>
+
+struct gsmd_user;
+
+struct gsmd_ucmd {
+ struct llist_head list;
+ struct gsmd_msg_hdr hdr;
+ char buf[];
+} __attribute__ ((packed));
+
+extern int usock_init(struct gsmd *g);
+extern void usock_cmd_enqueue(struct gsmd_ucmd *ucmd, struct gsmd_user *gu);
+extern struct gsmd_ucmd *usock_build_event(u_int8_t type, u_int8_t subtype, u_int8_t len);
+extern int usock_evt_send(struct gsmd *gsmd, struct gsmd_ucmd *ucmd, u_int32_t evt);
+
+#endif /* __GSMD__ */
+
#endif
+
diff --git a/include/gsmd/vendorplugin.h b/include/gsmd/vendorplugin.h
new file mode 100644
index 0000000..c3843b2
--- /dev/null
+++ b/include/gsmd/vendorplugin.h
@@ -0,0 +1,27 @@
+#ifndef _GSMD_VENDORPLUGIN_H
+#define _GSMD_VENDORPLUGIN_H
+
+#ifdef __GSMD__
+
+#include <common/linux_list.h>
+#include <gsmd/gsmd.h>
+
+struct gsmd;
+struct gsmd_unsolicit;
+
+struct gsmd_vendor_plugin {
+ struct llist_head list;
+ unsigned char *name;
+ unsigned int num_unsolicit;
+ const struct gsmd_unsolicit *unsolicit;
+ int (*detect)(struct gsmd *g);
+ int (*initsettings)(struct gsmd *g);
+};
+
+extern int gsmd_vendor_plugin_register(struct gsmd_vendor_plugin *pl);
+extern void gsmd_vendor_plugin_unregister(struct gsmd_vendor_plugin *pl);
+extern int gsmd_vendor_plugin_find(struct gsmd *g);
+
+#endif /* __GSMD__ */
+
+#endif
personal git repositories of Harald Welte. Your mileage may vary