]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
[NET]: skb_find_text() - Find a text pattern in skb data
authorThomas Graf <tgraf@suug.ch>
Fri, 24 Jun 2005 04:00:17 +0000 (21:00 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 24 Jun 2005 04:00:17 +0000 (21:00 -0700)
Finds a pattern in the skb data according to the specified
textsearch configuration. Use textsearch_next() to retrieve
subsequent occurrences of the pattern. Returns the offset
to the first occurrence or UINT_MAX if no match was found.

Signed-off-by: Thomas Graf <tgraf@suug.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/skbuff.h
net/core/skbuff.c

index 171a37dff83aa63baeffb6eec2949fabf59b9daa..416a2e4024b21b082a573740052002e815e6bd10 100644 (file)
@@ -27,6 +27,7 @@
 #include <linux/highmem.h>
 #include <linux/poll.h>
 #include <linux/net.h>
+#include <linux/textsearch.h>
 #include <net/checksum.h>
 
 #define HAVE_ALLOC_SKB         /* For the drivers to know */
@@ -339,6 +340,10 @@ extern unsigned int   skb_seq_read(unsigned int consumed, const u8 **data,
                                   struct skb_seq_state *st);
 extern void          skb_abort_seq_read(struct skb_seq_state *st);
 
+extern unsigned int   skb_find_text(struct sk_buff *skb, unsigned int from,
+                                   unsigned int to, struct ts_config *config,
+                                   struct ts_state *state);
+
 /* Internal */
 #define skb_shinfo(SKB)                ((struct skb_shared_info *)((SKB)->end))
 
index d285f2f7e812e6666df3a2da213c9f790a4f4abc..bb73b2190ec75df9d106125f532681f22e68c58a 100644 (file)
@@ -1614,6 +1614,45 @@ void skb_abort_seq_read(struct skb_seq_state *st)
                kunmap_skb_frag(st->frag_data);
 }
 
+#define TS_SKB_CB(state)       ((struct skb_seq_state *) &((state)->cb))
+
+static unsigned int skb_ts_get_next_block(unsigned int offset, const u8 **text,
+                                         struct ts_config *conf,
+                                         struct ts_state *state)
+{
+       return skb_seq_read(offset, text, TS_SKB_CB(state));
+}
+
+static void skb_ts_finish(struct ts_config *conf, struct ts_state *state)
+{
+       skb_abort_seq_read(TS_SKB_CB(state));
+}
+
+/**
+ * skb_find_text - Find a text pattern in skb data
+ * @skb: the buffer to look in
+ * @from: search offset
+ * @to: search limit
+ * @config: textsearch configuration
+ * @state: uninitialized textsearch state variable
+ *
+ * Finds a pattern in the skb data according to the specified
+ * textsearch configuration. Use textsearch_next() to retrieve
+ * subsequent occurrences of the pattern. Returns the offset
+ * to the first occurrence or UINT_MAX if no match was found.
+ */
+unsigned int skb_find_text(struct sk_buff *skb, unsigned int from,
+                          unsigned int to, struct ts_config *config,
+                          struct ts_state *state)
+{
+       config->get_next_block = skb_ts_get_next_block;
+       config->finish = skb_ts_finish;
+
+       skb_prepare_seq_read(skb, from, to, TS_SKB_CB(state));
+
+       return textsearch_find(config, state);
+}
+
 void __init skb_init(void)
 {
        skbuff_head_cache = kmem_cache_create("skbuff_head_cache",
@@ -1655,3 +1694,4 @@ EXPORT_SYMBOL(skb_split);
 EXPORT_SYMBOL(skb_prepare_seq_read);
 EXPORT_SYMBOL(skb_seq_read);
 EXPORT_SYMBOL(skb_abort_seq_read);
+EXPORT_SYMBOL(skb_find_text);