/* 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; retval->malloced = 1; 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; }
/* Create a sctp_endpoint with all that boring stuff initialized. * Returns NULL if there isn't enough memory. */ struct sctp_endpoint *sctp_endpoint_new(struct sock *sk, int gfp) { struct sctp_endpoint *ep; /* Build a local endpoint. */ ep = t_new(struct sctp_endpoint, gfp); if (!ep) goto fail; if (!sctp_endpoint_init(ep, sk, gfp)) goto fail_init; ep->base.malloced = 1; SCTP_DBG_OBJCNT_INC(ep); return ep; fail_init: kfree(ep); fail: return NULL; }
struct sctp_transport *sctp_transport_new(const union sctp_addr *addr, gfp_t gfp) { struct sctp_transport *transport; transport = t_new(struct sctp_transport, gfp); if (!transport) goto fail; if (!sctp_transport_init(transport, addr, gfp)) goto fail_init; transport->malloced = 1; SCTP_DBG_OBJCNT_INC(transport); return transport; fail_init: kfree(transport); fail: return NULL; }