cregit-Linux how code gets into the kernel

Release 4.15 net/ipv4/tcp_ulp.c

Directory: net/ipv4
/*
 * Pluggable TCP upper layer protocol support.
 *
 * Copyright (c) 2016-2017, Mellanox Technologies. All rights reserved.
 * Copyright (c) 2016-2017, Dave Watson <davejwatson@fb.com>. All rights reserved.
 *
 */

#include<linux/module.h>
#include <linux/mm.h>
#include <linux/types.h>
#include <linux/list.h>
#include <linux/gfp.h>
#include <net/tcp.h>

static DEFINE_SPINLOCK(tcp_ulp_list_lock);
static LIST_HEAD(tcp_ulp_list);

/* Simple linear search, don't expect many entries! */

static struct tcp_ulp_ops *tcp_ulp_find(const char *name) { struct tcp_ulp_ops *e; list_for_each_entry_rcu(e, &tcp_ulp_list, list) { if (strcmp(e->name, name) == 0) return e; } return NULL; }

Contributors

PersonTokensPropCommitsCommitProp
Dave Watson47100.00%1100.00%
Total47100.00%1100.00%


static const struct tcp_ulp_ops *__tcp_ulp_find_autoload(const char *name) { const struct tcp_ulp_ops *ulp = NULL; rcu_read_lock(); ulp = tcp_ulp_find(name); #ifdef CONFIG_MODULES if (!ulp && capable(CAP_NET_ADMIN)) { rcu_read_unlock(); request_module("%s", name); rcu_read_lock(); ulp = tcp_ulp_find(name); } #endif if (!ulp || !try_module_get(ulp->owner)) ulp = NULL; rcu_read_unlock(); return ulp; }

Contributors

PersonTokensPropCommitsCommitProp
Dave Watson92100.00%1100.00%
Total92100.00%1100.00%

/* Attach new upper layer protocol to the list * of available protocols. */
int tcp_register_ulp(struct tcp_ulp_ops *ulp) { int ret = 0; spin_lock(&tcp_ulp_list_lock); if (tcp_ulp_find(ulp->name)) { pr_notice("%s already registered or non-unique name\n", ulp->name); ret = -EEXIST; } else { list_add_tail_rcu(&ulp->list, &tcp_ulp_list); } spin_unlock(&tcp_ulp_list_lock); return ret; }

Contributors

PersonTokensPropCommitsCommitProp
Dave Watson69100.00%1100.00%
Total69100.00%1100.00%

EXPORT_SYMBOL_GPL(tcp_register_ulp);
void tcp_unregister_ulp(struct tcp_ulp_ops *ulp) { spin_lock(&tcp_ulp_list_lock); list_del_rcu(&ulp->list); spin_unlock(&tcp_ulp_list_lock); synchronize_rcu(); }

Contributors

PersonTokensPropCommitsCommitProp
Dave Watson33100.00%1100.00%
Total33100.00%1100.00%

EXPORT_SYMBOL_GPL(tcp_unregister_ulp); /* Build string with list of available upper layer protocl values */
void tcp_get_available_ulp(char *buf, size_t maxlen) { struct tcp_ulp_ops *ulp_ops; size_t offs = 0; *buf = '\0'; rcu_read_lock(); list_for_each_entry_rcu(ulp_ops, &tcp_ulp_list, list) { offs += snprintf(buf + offs, maxlen - offs, "%s%s", offs == 0 ? "" : " ", ulp_ops->name); } rcu_read_unlock(); }

Contributors

PersonTokensPropCommitsCommitProp
Dave Watson6592.86%150.00%
Jakub Kiciński57.14%150.00%
Total70100.00%2100.00%


void tcp_cleanup_ulp(struct sock *sk) { struct inet_connection_sock *icsk = inet_csk(sk); if (!icsk->icsk_ulp_ops) return; if (icsk->icsk_ulp_ops->release) icsk->icsk_ulp_ops->release(sk); module_put(icsk->icsk_ulp_ops->owner); }

Contributors

PersonTokensPropCommitsCommitProp
Dave Watson54100.00%1100.00%
Total54100.00%1100.00%

/* Change upper layer protocol for socket */
int tcp_set_ulp(struct sock *sk, const char *name) { struct inet_connection_sock *icsk = inet_csk(sk); const struct tcp_ulp_ops *ulp_ops; int err = 0; if (icsk->icsk_ulp_ops) return -EEXIST; ulp_ops = __tcp_ulp_find_autoload(name); if (!ulp_ops) return -ENOENT; err = ulp_ops->init(sk); if (err) { module_put(ulp_ops->owner); return err; } icsk->icsk_ulp_ops = ulp_ops; return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Dave Watson8184.38%150.00%
Sabrina Dubroca1515.62%150.00%
Total96100.00%2100.00%


Overall Contributors

PersonTokensPropCommitsCommitProp
Dave Watson48696.05%133.33%
Sabrina Dubroca152.96%133.33%
Jakub Kiciński50.99%133.33%
Total506100.00%3100.00%
Directory: net/ipv4
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.