static struct sctp_ssnmap *sctp_ssnmap_init(struct sctp_ssnmap *map, __u16 in,
__u16 out);
/* Storage size needed for map includes 2 headers and then the
* specific needs of in or out streams.
*/
static inline size_t sctp_ssnmap_size(__u16 in, __u16 out)
{
return sizeof(struct sctp_ssnmap) + (in + out) * sizeof(__u16);
}
/* Create a new sctp_ssnmap.
* Allocate room to store at least 'len' contiguous TSNs.
*/
struct sctp_ssnmap *sctp_ssnmap_new(__u16 in, __u16 out,
gfp_t gfp)
{
struct sctp_ssnmap *retval;
int size;
size = sctp_ssnmap_size(in, out);
if (size <= KMALLOC_MAX_SIZE)
retval = kmalloc(size, gfp);
else
retval = (struct sctp_ssnmap *)
__get_free_pages(gfp, get_order(size));
if (!retval)
goto fail;
if (!sctp_ssnmap_init(retval, in, out))
goto fail_map;
SCTP_DBG_OBJCNT_INC(ssnmap);
return retval;
fail_map:
if (size <= KMALLOC_MAX_SIZE)
kfree(retval);
else
free_pages((unsigned long)retval, get_order(size));
fail:
return NULL;
}
/* Initialize a block of memory as a ssnmap. */
static struct sctp_ssnmap *sctp_ssnmap_init(struct sctp_ssnmap *map, __u16 in,
__u16 out)
{
memset(map, 0x00, sctp_ssnmap_size(in, out));
/* Start 'in' stream just after the map header. */
map->in.ssn = (__u16 *)&map[1];
map->in.len = in;
/* Start 'out' stream just after 'in'. */
map->out.ssn = &map->in.ssn[in];
map->out.len = out;
return map;
}
/* Clear out the ssnmap streams. */
void sctp_ssnmap_clear(struct sctp_ssnmap *map)
{
size_t size;
size = (map->in.len + map->out.len) * sizeof(__u16);
memset(map->in.ssn, 0x00, size);
}
/* Dispose of a ssnmap. */
void sctp_ssnmap_free(struct sctp_ssnmap *map)
{
int size;
if (unlikely(!map))
return;
size = sctp_ssnmap_size(map->in.len, map->out.len);
if (size <= KMALLOC_MAX_SIZE)
kfree(map);
else
free_pages((unsigned long)map, get_order(size));
SCTP_DBG_OBJCNT_DEC(ssnmap);
}
6b22cf805011620f546384b271586548e8a7&showmsg=1'>Expand)Author | Files | Lines |
2017-02-02 | net: add LINUX_MIB_PFMEMALLOCDROP counter | Eric Dumazet | 2 | -2/+4 |
2017-02-02 | net: ipv4: remove fib_lookup.h from devinet.c include list | David Ahern | 1 | -2/+0 |
2017-02-02 | net: remove useless pfmemalloc setting | Eric Dumazet | 1 | -1/+0 |
2017-02-02 | unix: add ioctl to open a unix socket file with O_PATH | Andrey Vagin | 1 | -0/+41 |
2017-02-02 | Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net | David S. Miller | 12 | -104/+93 |
2017-02-01 | Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net | Linus Torvalds | 10 | -103/+86 |
2017-02-01 | net/sched: act_psample: Remove unnecessary ASSERT_RTNL | Yotam Gigi | 1 | -1/+0 |
2017-02-01 | net/sched: act_sample: Fix error path in init | Yotam Gigi | 1 | -1/+4 |
2017-02-01 | tcp: fix 0 divide in __tcp_select_window() | Eric Dumazet | 1 | -2/+4 |
2017-02-01 | ipv6: pointer math error in ip6_tnl_parse_tlv_enc_lim() | Dan Carpenter | 1 | -1/+1 |
2017-02-01 | net: ipv6: add NLM_F_APPEND in notifications when applicable | David Ahern | 1 | -0/+3 |
2017-02-01 | net: reduce skb_warn_bad_offload() noise | Eric Dumazet | 1 | -3/+9 |
2017-02-01 | net/sched: matchall: Fix configuration race | Yotam Gigi | 1 | -82/+45 |
2017-02-01 | rtnetlink: Handle IFLA_MASTER parameter when processing rtnl_newlink | Theuns Verwoerd | 1 | -1/+6 |