Beispiel #1
0
struct sk_buff * skb_alloc_local(size_t size, struct pool *pl) {
	struct sk_buff *skb;
	struct sk_buff_data *skb_data;

	skb_data = skb_data_alloc(size);

	if (skb_data == NULL) {
		return NULL; /* error: no memory */
	}

	skb = skb_wrap_local(size, skb_data, pl);
	if (skb == NULL) {
		skb_data_free(skb_data);
		return NULL; /* error: no memory */
	}
	return skb;
}
Beispiel #2
0
struct sk_buff * skb_alloc(size_t size) {
    struct sk_buff *skb;
    struct sk_buff_data *skb_data;

    if (skb_data_pool.obj_size >= size) {
        skb_data = skb_data_alloc();
    } else {
        skb_data = skb_data_alloc_dynamic(size);
    }
    if (skb_data == NULL) {
        return NULL; /* error: no memory */
    }

    skb = skb_wrap(size, skb_data);
    if (skb == NULL) {
        skb_data_free(skb_data);
        return NULL; /* error: no memory */
    }

    return skb;
}
Beispiel #3
0
struct sk_buff * skb_declone(struct sk_buff *skb) {
    struct sk_buff_data *decloned_data;

    assert(skb != NULL);

    if (!skb_data_cloned(skb->data)) {
        return skb;
    }

    decloned_data = skb_data_alloc();
    if (decloned_data == NULL) {
        return NULL; /* error: no memory */
    }

    skb_shift_ref(skb,
                  skb_get_data_pointner(decloned_data)
                  - skb_get_data_pointner(skb->data));
    skb_copy_data(decloned_data, skb);

    skb_data_free(skb->data);
    skb->data = decloned_data;

    return skb;
}