merge madwifi and wprobe into 8.09
[openwrt/svn-archive/archive.git] / package / wprobe / src / kernel / linux / wprobe.h
index f145195cd438371e835682b9431b9468d087768b..901daf3d105461d964d2d6b3fb79c7d9ce7bb86d 100644 (file)
@@ -22,6 +22,8 @@
 #include <linux/spinlock.h>
 #include <linux/module.h>
 #include <linux/list.h>
+#include <linux/timer.h>
+#include <linux/filter.h>
 #include <net/genetlink.h>
 #endif
 
  *
  * @WPROBE_ATTR_INTERFACE: interface name to process query on (NLA_STRING)
  * @WPROBE_ATTR_MAC: mac address (used for wireless links) (NLA_STRING)
- * @WPROBE_ATTR_FLAGS: interface/link/attribute flags (see enum wprobe_flags) (NLA_U32)
- * @WPROBE_ATTR_DURATION: sampling duration (in milliseconds) (NLA_MSECS)
+ * @WPROBE_ATTR_FLAGS: interface/link/attribute flags (see enum wprobe_flags) (NLA_U32)a
+ * @WPROBE_ATTR_DURATION: sampling duration (in milliseconds) (NLA_MSECS) 
  *
  * @WPROBE_ATTR_ID: attribute id (NLA_U32)
  * @WPROBE_ATTR_NAME: attribute name (NLA_STRING)
  * @WPROBE_ATTR_TYPE: attribute type (NLA_U8)
- * @WPROBE_ATTR_SCALE: attribute scale factor (NLA_U32)
  *
  * attribute values:
  *
  * @WPROBE_VAL_SUM: sum of all samples
  * @WPROBE_VAL_SUM_SQ: sum of all samples^2
  * @WPROBE_VAL_SAMPLES: number of samples
+ * @WPROBE_VAL_SCALE_TIME: last time the samples were scaled down
+ *
+ * configuration:
+ * @WPROBE_ATTR_INTERVAL: (measurement interval in milliseconds) (NLA_MSECS)
+ * @WPROBE_ATTR_SAMPLES_MIN: minimum samples to keep during inactivity (NLA_U32)
+ * @WPROBE_ATTR_SAMPLES_MAX: maximum samples to keep before scaling down (NLA_U32)
+ * @WPROBE_ATTR_SAMPLES_SCALE_M: multiplier for scaling down samples (NLA_U32)
+ * @WPROBE_ATTR_SAMPLES_SCALE_D: divisor for scaling down samples (NLA_U32)
  *
  * @WPROBE_ATTR_LAST: unused
  */
 enum wprobe_attr {
+       /* query attributes */
        WPROBE_ATTR_UNSPEC,
        WPROBE_ATTR_INTERFACE,
        WPROBE_ATTR_MAC,
        WPROBE_ATTR_FLAGS,
-       WPROBE_ATTR_DURATION,
-       WPROBE_ATTR_SCALE,
-       /* end of query attributes */
 
        /* response data */
        WPROBE_ATTR_ID,
        WPROBE_ATTR_NAME,
        WPROBE_ATTR_TYPE,
+       WPROBE_ATTR_DURATION,
 
        /* value type attributes */
        WPROBE_VAL_STRING,
@@ -88,6 +96,19 @@ enum wprobe_attr {
        WPROBE_VAL_SUM,
        WPROBE_VAL_SUM_SQ,
        WPROBE_VAL_SAMPLES,
+       WPROBE_VAL_SCALE_TIME,
+
+       /* config attributes */
+       WPROBE_ATTR_INTERVAL,
+       WPROBE_ATTR_SAMPLES_MIN,
+       WPROBE_ATTR_SAMPLES_MAX,
+       WPROBE_ATTR_SAMPLES_SCALE_M,
+       WPROBE_ATTR_SAMPLES_SCALE_D,
+       WPROBE_ATTR_FILTER,
+
+       WPROBE_ATTR_FILTER_GROUP,
+       WPROBE_ATTR_RXCOUNT,
+       WPROBE_ATTR_TXCOUNT,
 
        WPROBE_ATTR_LAST
 };
@@ -103,6 +124,8 @@ enum wprobe_attr {
  * @WPROBE_CMD_SET_FLAGS: set global/link flags
  * @WPROBE_CMD_MEASURE: take a snapshot of the current data
  * @WPROBE_CMD_GET_LINKS: get a list of links
+ * @WPROBE_CMD_CONFIG: set config options
+ * @WPROBE_CMD_GET_FILTER: get counters for active filters
  *
  * @WPROBE_CMD_LAST: unused
  * 
@@ -117,13 +140,15 @@ enum wprobe_cmd {
        WPROBE_CMD_SET_FLAGS,
        WPROBE_CMD_MEASURE,
        WPROBE_CMD_GET_LINKS,
+       WPROBE_CMD_CONFIG,
+       WPROBE_CMD_GET_FILTER,
        WPROBE_CMD_LAST
 };
 
 /**
  * enum wprobe_flags: flags for wprobe links and items
  * @WPROBE_F_KEEPSTAT: keep statistics for this link/device
- * @WPROBE_F_RESET: reset statistics now (used only in WPROBE_CMD_SET_LINK)
+ * @WPROBE_F_RESET: reset statistics now
  * @WPROBE_F_NEWDATA: used to indicate that a value has been updated
  */
 enum wprobe_flags {
@@ -137,6 +162,7 @@ enum wprobe_flags {
 struct wprobe_link;
 struct wprobe_item;
 struct wprobe_source;
+struct wprobe_value;
 
 /**
  * struct wprobe_link - data structure describing a wireless link
@@ -154,7 +180,7 @@ struct wprobe_link {
        char addr[ETH_ALEN];
        u32 flags;
        void *priv;
-       void *val;
+       struct wprobe_value *val;
 };
 
 /** 
@@ -192,8 +218,61 @@ struct wprobe_value {
 
        /* timestamps */
        u64 first, last;
+       u64 scale_timestamp;
+};
+
+struct wprobe_filter_item_hdr {
+       char name[32];
+       __be32 n_items;
+} __attribute__((packed));
+
+struct wprobe_filter_item {
+       struct wprobe_filter_item_hdr hdr;
+       struct sock_filter filter[];
+} __attribute__((packed));
+
+struct wprobe_filter_counter {
+       u64 tx;
+       u64 rx;
 };
 
+struct wprobe_filter_group {
+       const char *name;
+       int n_items;
+       struct wprobe_filter_item **items;
+       struct wprobe_filter_counter *counters;
+};
+
+struct wprobe_filter_hdr {
+       __u8 magic[4];
+       __u8 version;
+       __u8 hdrlen;
+       __u16 n_groups;
+} __attribute__((packed));
+
+struct wprobe_filter {
+       spinlock_t lock;
+       struct sk_buff *skb;
+       void *data;
+       int n_groups;
+       int hdrlen;
+       struct wprobe_filter_item **items;
+       struct wprobe_filter_counter *counters;
+       struct wprobe_filter_group groups[];
+};
+
+enum {
+       WPROBE_PKT_RX = 0x00,
+       WPROBE_PKT_TX = 0x10,
+};
+
+struct wprobe_wlan_hdr {
+       u16 len;
+       u8 snr;
+       u8 type;
+} __attribute__((packed));
+
+
 /**
  * struct wprobe_source - data structure describing a wireless interface
  *
@@ -225,17 +304,28 @@ struct wprobe_iface {
        const struct wprobe_item *global_items;
        int n_global_items;
 
-       int (*sync_data)(struct wprobe_iface *dev, struct wprobe_link *l, struct wprobe_value *val, bool measure);
+       int (*sync_data)(struct wprobe_iface *dev, struct wprobe_link *l,
+                        struct wprobe_value *val, bool measure);
        void *priv;
 
        /* handled by the wprobe core */
        struct list_head list;
        struct list_head links;
        spinlock_t lock;
-       void *val;
-       void *query_val;
+       struct wprobe_value *val;
+       struct wprobe_value *query_val;
+       struct wprobe_filter *active_filter;
+
+       u32 measure_interval;
+       struct timer_list measure_timer;
+
+       u32 scale_min;
+       u32 scale_max;
+       u32 scale_m;
+       u32 scale_d;
 };
 
+
 #define WPROBE_FILL_BEGIN(_ptr, _list) do {                    \
        struct wprobe_value *__val = (_ptr);                    \
        const struct wprobe_item *__item = _list;               \
@@ -293,6 +383,15 @@ extern void __weak wprobe_remove_link(struct wprobe_iface *dev, struct wprobe_li
  */
 extern void __weak wprobe_update_stats(struct wprobe_iface *dev, struct wprobe_link *l);
 
+/**
+ * wprobe_add_frame: add frame for layer 2 analysis
+ * @dev: wprobe_iface structure describing the interface
+ * @hdr: metadata for the frame
+ * @data: 802.11 header pointer
+ * @len: length of the 802.11 header
+ */
+extern int __weak wprobe_add_frame(struct wprobe_iface *dev, const struct wprobe_wlan_hdr *hdr, void *data, int len);
+
 #endif /* __KERNEL__ */
 
 #endif