diff options
Diffstat (limited to 'include/gsmd')
-rw-r--r-- | include/gsmd/atcmd.h | 17 | ||||
-rw-r--r-- | include/gsmd/gsmd.h | 88 | ||||
-rw-r--r-- | include/gsmd/select.h | 26 | ||||
-rw-r--r-- | include/gsmd/unsolicited.h | 18 | ||||
-rw-r--r-- | include/gsmd/usock.h | 41 | ||||
-rw-r--r-- | include/gsmd/vendorplugin.h | 27 |
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 |