cregit-Linux how code gets into the kernel

Release 4.15 net/dccp/ccid.c

Directory: net/dccp
/*
 *  net/dccp/ccid.c
 *
 *  An implementation of the DCCP protocol
 *  Arnaldo Carvalho de Melo <acme@conectiva.com.br>
 *
 *  CCID infrastructure
 *
 *      This program is free software; you can redistribute it and/or modify it
 *      under the terms of the GNU General Public License version 2 as
 *      published by the Free Software Foundation.
 */

#include <linux/slab.h>

#include "ccid.h"
#include "ccids/lib/tfrc.h"


static struct ccid_operations *ccids[] = {
	&ccid2_ops,
#ifdef CONFIG_IP_DCCP_CCID3
	&ccid3_ops,
#endif
};


static struct ccid_operations *ccid_by_number(const u8 id) { int i; for (i = 0; i < ARRAY_SIZE(ccids); i++) if (ccids[i]->ccid_id == id) return ccids[i]; return NULL; }

Contributors

PersonTokensPropCommitsCommitProp
Gerrit Renker51100.00%1100.00%
Total51100.00%1100.00%

/* check that up to @array_len members in @ccid_array are supported */
bool ccid_support_check(u8 const *ccid_array, u8 array_len) { while (array_len > 0) if (ccid_by_number(ccid_array[--array_len]) == NULL) return false; return true; }

Contributors

PersonTokensPropCommitsCommitProp
Gerrit Renker38100.00%1100.00%
Total38100.00%1100.00%

/** * ccid_get_builtin_ccids - Populate a list of built-in CCIDs * @ccid_array: pointer to copy into * @array_len: value to return length into * * This function allocates memory - caller must see that it is freed after use. */
int ccid_get_builtin_ccids(u8 **ccid_array, u8 *array_len) { *ccid_array = kmalloc(ARRAY_SIZE(ccids), gfp_any()); if (*ccid_array == NULL) return -ENOBUFS; for (*array_len = 0; *array_len < ARRAY_SIZE(ccids); *array_len += 1) (*ccid_array)[*array_len] = ccids[*array_len]->ccid_id; return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Gerrit Renker79100.00%1100.00%
Total79100.00%1100.00%


int ccid_getsockopt_builtin_ccids(struct sock *sk, int len, char __user *optval, int __user *optlen) { u8 *ccid_array, array_len; int err = 0; if (ccid_get_builtin_ccids(&ccid_array, &array_len)) return -ENOBUFS; if (put_user(array_len, optlen)) err = -EFAULT; else if (len > 0 && copy_to_user(optval, ccid_array, len > array_len ? array_len : len)) err = -EFAULT; kfree(ccid_array); return err; }

Contributors

PersonTokensPropCommitsCommitProp
Gerrit Renker98100.00%2100.00%
Total98100.00%2100.00%


static struct kmem_cache *ccid_kmem_cache_create(int obj_size, char *slab_name_fmt, const char *fmt,...) { struct kmem_cache *slab; va_list args; va_start(args, fmt); vsnprintf(slab_name_fmt, CCID_SLAB_NAME_LENGTH, fmt, args); va_end(args); slab = kmem_cache_create(slab_name_fmt, sizeof(struct ccid) + obj_size, 0, SLAB_HWCACHE_ALIGN, NULL); return slab; }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo6787.01%125.00%
Neil Horman56.49%125.00%
Christoph Lameter45.19%125.00%
Gerrit Renker11.30%125.00%
Total77100.00%4100.00%


static void ccid_kmem_cache_destroy(struct kmem_cache *slab) { kmem_cache_destroy(slab); }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo1487.50%150.00%
Christoph Lameter212.50%150.00%
Total16100.00%2100.00%


static int __init ccid_activate(struct ccid_operations *ccid_ops) { int err = -ENOBUFS; ccid_ops->ccid_hc_rx_slab = ccid_kmem_cache_create(ccid_ops->ccid_hc_rx_obj_size, ccid_ops->ccid_hc_rx_slab_name, "ccid%u_hc_rx_sock", ccid_ops->ccid_id); if (ccid_ops->ccid_hc_rx_slab == NULL) goto out; ccid_ops->ccid_hc_tx_slab = ccid_kmem_cache_create(ccid_ops->ccid_hc_tx_obj_size, ccid_ops->ccid_hc_tx_slab_name, "ccid%u_hc_tx_sock", ccid_ops->ccid_id); if (ccid_ops->ccid_hc_tx_slab == NULL) goto out_free_rx_slab; pr_info("DCCP: Activated CCID %d (%s)\n", ccid_ops->ccid_id, ccid_ops->ccid_name); err = 0; out: return err; out_free_rx_slab: ccid_kmem_cache_destroy(ccid_ops->ccid_hc_rx_slab); ccid_ops->ccid_hc_rx_slab = NULL; goto out; }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo10182.79%228.57%
Gerrit Renker129.84%342.86%
Neil Horman86.56%114.29%
Fabian Frederick10.82%114.29%
Total122100.00%7100.00%


static void ccid_deactivate(struct ccid_operations *ccid_ops) { ccid_kmem_cache_destroy(ccid_ops->ccid_hc_tx_slab); ccid_ops->ccid_hc_tx_slab = NULL; ccid_kmem_cache_destroy(ccid_ops->ccid_hc_rx_slab); ccid_ops->ccid_hc_rx_slab = NULL; pr_info("DCCP: Deactivated CCID %d (%s)\n", ccid_ops->ccid_id, ccid_ops->ccid_name); }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo4692.00%250.00%
Gerrit Renker48.00%250.00%
Total50100.00%4100.00%


struct ccid *ccid_new(const u8 id, struct sock *sk, bool rx) { struct ccid_operations *ccid_ops = ccid_by_number(id); struct ccid *ccid = NULL; if (ccid_ops == NULL) goto out; ccid = kmem_cache_alloc(rx ? ccid_ops->ccid_hc_rx_slab : ccid_ops->ccid_hc_tx_slab, gfp_any()); if (ccid == NULL) goto out; ccid->ccid_ops = ccid_ops; if (rx) { memset(ccid + 1, 0, ccid_ops->ccid_hc_rx_obj_size); if (ccid->ccid_ops->ccid_hc_rx_init != NULL && ccid->ccid_ops->ccid_hc_rx_init(ccid, sk) != 0) goto out_free_ccid; } else { memset(ccid + 1, 0, ccid_ops->ccid_hc_tx_obj_size); if (ccid->ccid_ops->ccid_hc_tx_init != NULL && ccid->ccid_ops->ccid_hc_tx_init(ccid, sk) != 0) goto out_free_ccid; } out: return ccid; out_free_ccid: kmem_cache_free(rx ? ccid_ops->ccid_hc_rx_slab : ccid_ops->ccid_hc_tx_slab, ccid); ccid = NULL; goto out; }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo18293.81%360.00%
Gerrit Renker126.19%240.00%
Total194100.00%5100.00%


void ccid_hc_rx_delete(struct ccid *ccid, struct sock *sk) { if (ccid != NULL) { if (ccid->ccid_ops->ccid_hc_rx_exit != NULL) ccid->ccid_ops->ccid_hc_rx_exit(sk); kmem_cache_free(ccid->ccid_ops->ccid_hc_rx_slab, ccid); } }

Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo4686.79%266.67%
Gerrit Renker713.21%133.33%
Total53100.00%3100.00%


void ccid_hc_tx_delete(struct ccid *ccid, struct sock *sk) { if (ccid != NULL) { if (ccid->ccid_ops->ccid_hc_tx_exit != NULL) ccid->ccid_ops->ccid_hc_tx_exit(sk); kmem_cache_free(ccid->ccid_ops->ccid_hc_tx_slab, ccid); } }

Contributors

PersonTokensPropCommitsCommitProp
Gerrit Renker3056.60%150.00%
Arnaldo Carvalho de Melo2343.40%150.00%
Total53100.00%2100.00%


int __init ccid_initialize_builtins(void) { int i, err = tfrc_lib_init(); if (err) return err; for (i = 0; i < ARRAY_SIZE(ccids); i++) { err = ccid_activate(ccids[i]); if (err) goto unwind_registrations; } return 0; unwind_registrations: while(--i >= 0) ccid_deactivate(ccids[i]); tfrc_lib_exit(); return err; }

Contributors

PersonTokensPropCommitsCommitProp
Gerrit Renker84100.00%2100.00%
Total84100.00%2100.00%


void ccid_cleanup_builtins(void) { int i; for (i = 0; i < ARRAY_SIZE(ccids); i++) ccid_deactivate(ccids[i]); tfrc_lib_exit(); }

Contributors

PersonTokensPropCommitsCommitProp
Gerrit Renker37100.00%2100.00%
Total37100.00%2100.00%


Overall Contributors

PersonTokensPropCommitsCommitProp
Arnaldo Carvalho de Melo48349.04%320.00%
Gerrit Renker47848.53%746.67%
Neil Horman131.32%16.67%
Christoph Lameter60.61%16.67%
Tejun Heo30.30%16.67%
Fabian Frederick10.10%16.67%
Ben Hutchings10.10%16.67%
Total985100.00%15100.00%
Directory: net/dccp
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.