* --------<-POP---------
*
* where B is a virtual ematch referencing to sequence starting with B1.
- *
+ *
* ==========================================================================
*
* How to write an ematch in 60 seconds
* ------------------------------------
- *
+ *
* 1) Provide a matcher function:
* static int my_match(struct sk_buff *skb, struct tcf_ematch *m,
* struct tcf_pkt_info *info)
* open up a beer to watch the compilation going.
*/
-#include <linux/config.h>
#include <linux/module.h>
#include <linux/types.h>
#include <linux/kernel.h>
/**
* tcf_em_register - register an extended match
- *
+ *
* @ops: ematch operations lookup table
*
* This function must be called by ematches to announce their presence.
if (ref <= idx)
goto errout;
-
+
em->data = ref;
} else {
/* Note: This lookup will increase the module refcnt
goto errout;
em->data = *(u32 *) data;
} else {
- void *v = kmalloc(data_len, GFP_KERNEL);
+ void *v = kmemdup(data, data_len, GFP_KERNEL);
if (v == NULL) {
err = -ENOBUFS;
goto errout;
}
- memcpy(v, data, data_len);
em->data = (unsigned long) v;
}
}
list_len = RTA_PAYLOAD(rt_list);
matches_len = tree_hdr->nmatches * sizeof(*em);
- tree->matches = kmalloc(matches_len, GFP_KERNEL);
+ tree->matches = kzalloc(matches_len, GFP_KERNEL);
if (tree->matches == NULL)
goto errout;
- memset(tree->matches, 0, matches_len);
/* We do not use rtattr_parse_nested here because the maximum
* number of attributes is unknown. This saves us the allocation
* for a tb buffer which would serve no purpose at all.
- *
+ *
* The array of rt attributes is parsed in the order as they are
* provided, their type must be incremental from 1 to n. Even
* if it does not serve any real purpose, a failure of sticking
module_put(em->ops->owner);
}
}
-
+
tree->hdr.nmatches = 0;
kfree(tree->matches);
}