On Wed, Apr 20, 2016 at 03:17:41AM -0700, Sowmini Varadhan wrote:
...
> +/* Extract to_copy bytes starting at off from skb, and return this in
> + * a new skb
> + */
> +struct sk_buff *pskb_extract(struct sk_buff *skb, int off,
> + int to_copy, gfp_t gfp)
> +{
> + struct sk_buff *clone = skb_clone(skb, gfp);
> +
> + if (!clone)
> + return NULL;
> +
> + if (pskb_carve(clone, off, gfp) < 0) {
> + pr_warn("pskb_carve failed\n");
You most likely don't want these pr_warn
> + kfree_skb(clone);
> + return NULL;
> + }
> +
> + if (pskb_trim(clone, to_copy)) {
> + pr_warn("pskb_trim failed\n");
> + kfree_skb(clone);
> + return NULL;
> + }
> + return clone;
Then these two blocks can be just:
if (pskb_carve(clone, off, gfp) < 0 ||
pskb_trim(clone, to_copy)) {
kfree_skb(clone);
clone = NULL;
}
return clone;
Marcelo
> +}
> +EXPORT_SYMBOL(pskb_extract);
> --
> 1.7.1
>