/*------------------------------------------------------------------------------------------*\ \*------------------------------------------------------------------------------------------*/ #ifndef _avm_linux_event_h_ #define _avm_linux_event_h_ /*-----------------------------------------------------------------------------------------------*\ \*-----------------------------------------------------------------------------------------------*/ #define MODULE_NAME "avm_event" /*--- #define AVM_EVENT_DEBUG ---*/ /*-----------------------------------------------------------------------------------------------*\ \*-----------------------------------------------------------------------------------------------*/ #if defined(__KERNEL__) #if defined(AVM_EVENT_DEBUG) #define DEB_ERR(args...) printk(KERN_ERR args) #define DEB_WARN(args...) printk(KERN_WARN args) #define DEB_INFO(args...) printk(KERN_INFO args) #define DEB_TRC(args...) printk(KERN_INFO args) #else /*--- #if defined(MANU_DEBUG) ---*/ #define DEB_ERR(args...) printk(KERN_ERR args) #define DEB_WARN(args...) #define DEB_INFO(args...) #define DEB_TRC(args...) #endif /*--- #else ---*/ /*--- #if defined(MANU_DEBUG) ---*/ #include #endif /*--- #if defined(__KERNEL__) ---*/ /*------------------------------------------------------------------------------------------*\ \*------------------------------------------------------------------------------------------*/ #define MAX_EVENT_CLIENT_NAME_LEN 32 #define MAX_EVENT_SOURCE_NAME_LEN 32 #define MAX_AVM_EVENT_SOURCES 32 /*------------------------------------------------------------------------------------------*\ * Aufteilung der Event typen (vorlaeufig in 8er Gruppen): * * 0 - 7: WLAN * 8 - 15: DSL * 16 - 23: * 24 - 31: * 32 - 39: * 40 - 47: * 48 - 55: * 56 - 63: \*------------------------------------------------------------------------------------------*/ #define AVM_EVENT_TYPE_WLAN_CLIENT_CHANGE 0 #define AVM_EVENT_TYPE_WLAN_ERROR 1 /*------------------------------------------------------------------------------------------*\ \*------------------------------------------------------------------------------------------*/ enum _avm_event_id { avm_event_id_wlan_client_status = 0, avm_event_id_usb_status = 8, avm_event_id_dsl_status = 16, avm_event_id_dsl_connect_status = 17, avm_event_id_appl_status = 24, avm_event_id_user_source_notify = 63, avm_event_last = 64 }; struct _avm_event_header { enum _avm_event_id id; }; /*------------------------------------------------------------------------------------------*\ * ID Spezifische Datentypen (id=avm_event_id_user_source_notify) \*------------------------------------------------------------------------------------------*/ struct _avm_event_user_mode_source_notify { struct _avm_event_header header; enum _avm_event_id id; }; /*------------------------------------------------------------------------------------------*\ * CMD Spezifische Datentypen \*------------------------------------------------------------------------------------------*/ enum __avm_event_cmd { avm_event_cmd_register = 0, avm_event_cmd_release = 1, avm_event_cmd_source_register = 2, avm_event_cmd_source_release = 3, avm_event_cmd_source_trigger = 4, avm_event_cmd_trigger = 5, avm_event_cmd_undef }; /*------------------------------------------------------------------------------------------*\ * cmd=avm_event_cmd_param_register \*------------------------------------------------------------------------------------------*/ struct _avm_event_cmd_param_register { unsigned long long mask; char Name[MAX_EVENT_CLIENT_NAME_LEN + 1]; }; /*------------------------------------------------------------------------------------------*\ * cmd=avm_event_cmd_param_release \*------------------------------------------------------------------------------------------*/ struct _avm_event_cmd_param_release { char Name[MAX_EVENT_CLIENT_NAME_LEN + 1]; }; struct _avm_event_cmd_param_trigger { unsigned int id; }; struct _avm_event_cmd_param_source_trigger { enum _avm_event_id id; unsigned int data_length; }; /*------------------------------------------------------------------------------------------*\ \*------------------------------------------------------------------------------------------*/ struct _avm_event_cmd { enum __avm_event_cmd cmd; union _avm_event_cmd_param { struct _avm_event_cmd_param_register avm_event_cmd_param_register; struct _avm_event_cmd_param_release avm_event_cmd_param_release; struct _avm_event_cmd_param_trigger avm_event_cmd_param_trigger; struct _avm_event_cmd_param_register avm_event_cmd_param_source_register; struct _avm_event_cmd_param_source_trigger avm_event_cmd_param_source_trigger; } param; }; #if defined(__KERNEL__) #if defined(AVM_EVENT_INTERNAL) /*------------------------------------------------------------------------------------------*\ * KERNEL INCLUDE * KERNEL INCLUDE * KERNEL INCLUDE * KERNEL INCLUDE * KERNEL INCLUDE * \*------------------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------------------*\ \*------------------------------------------------------------------------------------------*/ struct _avm_event { unsigned int major; unsigned int minor; devfs_handle_t devfs_handle; }; /*------------------------------------------------------------------------------------------*\ \*------------------------------------------------------------------------------------------*/ struct _avm_event_open_data { struct _avm_event_open_data *next; struct _avm_event_open_data *prev; unsigned int registered; unsigned long long event_mask_registered; struct _avm_event_item *item; char Name[MAX_EVENT_CLIENT_NAME_LEN + 1]; wait_queue_head_t wait_queue; struct fown_struct *pf_owner; struct fasync_struct *fasync; void *event_source_handle; }; struct _avm_event_data { unsigned int link_count; void *data; unsigned int data_length; }; struct _avm_event_item { struct _avm_event_item *next; struct _avm_event_data *data; }; #define AVM_EVENT_SIGNATUR (unsigned long long)(0x544E56455F4D5641) struct _avm_event_source { unsigned long long signatur; char Name[MAX_EVENT_SOURCE_NAME_LEN + 1]; unsigned long long event_mask; void (*notify)(void *, enum _avm_event_id); void *Context; }; /*------------------------------------------------------------------------------------------*\ \*------------------------------------------------------------------------------------------*/ extern int avm_event_register(struct _avm_event_open_data *, struct _avm_event_cmd_param_register *); extern int avm_event_release(struct _avm_event_open_data *, struct _avm_event_cmd_param_release *); extern int avm_event_trigger(struct _avm_event_open_data *, struct _avm_event_cmd_param_trigger *); extern int avm_event_get(struct _avm_event_open_data *open_data, unsigned char **rx_buffer, unsigned int *rx_buffer_length, unsigned int *event_pos); extern void avm_event_commit(struct _avm_event_open_data *open_data, unsigned int event_pos); extern int avm_event_source_trigger_one(struct _avm_event_open_data *O, struct _avm_event_data *D); int avm_event_init2(unsigned int max_items, unsigned int max_datas); int avm_event_deinit2(void); struct _avm_event_data *avm_event_alloc_data(void); void avm_event_free_data(struct _avm_event_data *D); struct _avm_event_item *avm_event_alloc_item(void); void avm_event_free_item(struct _avm_event_item *I); #endif /*--- #if defined(AVM_EVENT_INTERNAL) ---*/ /*------------------------------------------------------------------------------------------*\ * Kernel Schnittsteller des avm_event Treibers \*------------------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------------------*\ * Jede Event/Informations Quelle muss sich einmalig registrieren. * * Parameter: name ein frei zu whlender Name * id_mask eine 64 Bit Maske in der diejenigen Bits der IDs gesetzt * sind zu der der registrierende informationen liefern will * (zu jedem Bit kann es nur einen Lieferanten geben) * notify Dieses funktion wird durch den Event treiber immer dann * aufgerufen wenn sich a) ein Empfnger der Informationen von * diesem Treiber haben will registriert hast oder b) wenn ein * schon registrierter Empfnger eine aktualisierung der Daten * wnscht (avm_event_trigger()) * Paramter dieser Funktion sind: 1) der beim Registriren * bergebene Context, und 2) die Id zu der Informationen gewnscht * sind. * Context (siehe notify) * * Return wert: NULL im Fehlerfall, andernfalls ein gltiges Handle \*------------------------------------------------------------------------------------------*/ extern void *avm_event_source_register(char *name, unsigned long long id_mask, void (*notify)(void *, enum _avm_event_id), void *Context); /*------------------------------------------------------------------------------------------*\ * Deregistrieren, anschlieend ist der Handle ungltig \*------------------------------------------------------------------------------------------*/ extern void avm_event_source_release(void *handle); /*------------------------------------------------------------------------------------------*\ * Immer wenn Informationen an den Event Treiber bergeben werden soll muss diese * Funktion aufgerufen werden. * * Parameter: Handle Handle von avm_event_source_register() * * Id Id des Events/Information * data_length Lnge der Daten/Informationen * data Pointer auf die Daten. Dieser MUSS mittels kmalloc allozeiert * worden sein. * Returnwert: Anzahl der Empfnger die sich fr die Daten interesierten (0 == keiner) \*------------------------------------------------------------------------------------------*/ extern int avm_event_source_trigger(void *handle, enum _avm_event_id id, unsigned int data_length, void *data); /*------------------------------------------------------------------------------------------*\ * Prfen ob sich jemand fr die Daten interessiert \*------------------------------------------------------------------------------------------*/ extern int avm_event_source_check_id(void *handle, enum _avm_event_id id); /*------------------------------------------------------------------------------------------*\ \*------------------------------------------------------------------------------------------*/ extern struct semaphore avm_event_sema; extern unsigned long long avm_event_source_mask; #endif /*--- #if defined(__KERNEL__) ---*/ #endif /*--- #ifndef _avm_linux_event_h_ ---*/