/*
* The protocol list. Each protocol is registered in here.
*/
static DEFINE_SPINLOCK(net_family_lock);
static const struct net_proto_family __rcu *net_families[NPROTO];
static const struct net_proto_family inet_family_ops = {
.family = PF_INET,.create = inet_create,
.owner = THIS_MODULE,
};
static const struct net_proto_family inet6_family_ops = {
.family = PF_INET6,
.create = inet6_create,
.owner
= THIS_MODULE,
};
static const struct net_proto_family alg_family = {
.family
= PF_ALG,
.create
= alg_create,
.owner
= THIS_MODULE,
};
static const struct net_proto_family ax25_family_ops = {
.family =
PF_AX25,
.create =
ax25_create,
.owner
= THIS_MODULE,
};
static struct net_proto_family bt_sock_family_ops = {
.owner
= THIS_MODULE,
.family
= PF_BLUETOOTH,
.create
= bt_sock_create,
};
static const struct net_proto_family can_family_ops = {
.family = PF_CAN,
.create = can_create,
.owner = THIS_MODULE,
};
static const struct net_proto_family ipx_family_ops = {
.family
= PF_IPX,
.create
= ipx_create,
.owner
= THIS_MODULE,
};
/* Supported address families. */
#define AF_UNSPEC 0
#define AF_UNIX 1
/* Unix domain sockets */
#define AF_LOCAL 1
/* POSIX name for AF_UNIX */
#define AF_INET 2
/* Internet IP Protocol */
#define AF_AX25 3
/* Amateur Radio AX.25 */
#define AF_IPX 4
/* Novell IPX */
#define AF_APPLETALK 5
/* AppleTalk DDP */
#define AF_NETROM 6
/* Amateur Radio NET/ROM */
#define AF_BRIDGE 7
/* Multiprotocol bridge */
#define AF_ATMPVC 8
/* ATM PVCs */
#define AF_X25 9
/* Reserved for X.25 project */
#define AF_INET6 10
/* IP version 6 */
#define AF_ROSE 11
/* Amateur Radio X.25 PLP */
#define AF_DECnet 12
/* Reserved for DECnet project */
#define AF_NETBEUI 13
/* Reserved for 802.2LLC project*/
#define AF_SECURITY 14
/* Security callback pseudo AF */
#define AF_KEY 15 /* PF_KEY key management API */
#define AF_NETLINK 16
#define AF_ROUTE AF_NETLINK /* Alias to emulate 4.4BSD */
#define AF_PACKET 17
/* Packet family */
#define AF_ASH 18
/* Ash */
#define AF_ECONET 19
/* Acorn Econet */
#define AF_ATMSVC 20
/* ATM SVCs */
#define AF_RDS 21
/* RDS sockets */
#define AF_SNA 22
/* Linux SNA Project (nutters!) */
#define AF_IRDA 23
/* IRDA sockets */
#define AF_PPPOX 24
/* PPPoX sockets */
#define AF_WANPIPE 25
/* Wanpipe API Sockets */
#define AF_LLC 26
/* Linux LLC */
#define AF_IB 27
/* Native InfiniBand address */
#define AF_MPLS 28
/* MPLS */
#define AF_CAN 29
/* Controller Area Network */
#define AF_TIPC 30
/* TIPC sockets */
#define AF_BLUETOOTH 31
/* Bluetooth sockets */
#define AF_IUCV 32
/* IUCV sockets */
#define AF_RXRPC 33
/* RxRPC sockets */
#define AF_ISDN 34
/* mISDN sockets */
#define AF_PHONET 35
/* Phonet sockets */
#define AF_IEEE802154 36
/* IEEE802154 sockets */
#define AF_CAIF 37
/* CAIF sockets */
#define AF_ALG 38
/* Algorithm sockets */
#define AF_NFC 39
/* NFC sockets */
#define AF_VSOCK 40
/* vSockets */
#define AF_KCM 41
/* Kernel Connection Multiplexor*/
#define AF_QIPCRTR 42
/* Qualcomm IPC Router */
#define AF_MAX 43
/* For now.. */
/* Protocol families, same as address families. */
#define PF_UNSPEC AF_UNSPEC
#define PF_UNIX AF_UNIX
#define PF_LOCAL AF_LOCAL
#define PF_INET AF_INET
#define PF_AX25 AF_AX25
#define PF_IPX AF_IPX
#define PF_APPLETALK AF_APPLETALK
#define PF_NETROM
AF_NETROM
#define PF_BRIDGE AF_BRIDGE
#define PF_ATMPVC AF_ATMPVC
#define PF_X25 AF_X25
#define PF_INET6 AF_INET6
#define PF_ROSE AF_ROSE
#define PF_DECnet AF_DECnet
#define PF_NETBEUI AF_NETBEUI
#define PF_SECURITY AF_SECURITY
#define PF_KEY AF_KEY
#define PF_NETLINK AF_NETLINK
#define PF_ROUTE AF_ROUTE
#define PF_PACKET AF_PACKET
#define PF_ASH AF_ASH
#define PF_ECONET AF_ECONET
#define PF_ATMSVC AF_ATMSVC
#define PF_RDS AF_RDS
#define PF_SNA AF_SNA
#define PF_IRDA AF_IRDA
#define PF_PPPOX AF_PPPOX
#define PF_WANPIPE AF_WANPIPE
#define PF_LLC AF_LLC
#define PF_IB AF_IB
#define PF_MPLS AF_MPLS
#define PF_CAN AF_CAN
#define PF_TIPC AF_TIPC
#define PF_BLUETOOTH AF_BLUETOOTH
#define PF_IUCV AF_IUCV
#define PF_RXRPC AF_RXRPC
#define PF_ISDN AF_ISDN
#define PF_PHONET AF_PHONET
#define PF_IEEE802154 AF_IEEE802154
#define PF_CAIF AF_CAIF
#define PF_ALG AF_ALG
#define PF_NFC AF_NFC
#define PF_VSOCK AF_VSOCK
#define PF_KCM AF_KCM
#define PF_QIPCRTR AF_QIPCRTR
#define PF_MAX AF_MAX
int sock_register(const struct net_proto_family *ops)
{
int err;
if (ops->family >= NPROTO) {
pr_crit("protocol %d >= NPROTO(%d)\n", ops->family, NPROTO);
return -ENOBUFS;
}
spin_lock(&net_family_lock);
if (rcu_dereference_protected(net_families[ops->family],
lockdep_is_held(&net_family_lock)))
err = -EEXIST;
else {
rcu_assign_pointer(net_families[ops->family], ops);
err = 0;
}
spin_unlock(&net_family_lock);
pr_info("NET: Registered protocol family %d\n", ops->family);
return err;
}
EXPORT_SYMBOL(sock_register);
void sock_unregister(int family)
{
BUG_ON(family < 0 || family >= NPROTO);
spin_lock(&net_family_lock);
RCU_INIT_POINTER(net_families[family], NULL);
spin_unlock(&net_family_lock);
synchronize_rcu();
pr_info("NET: Unregistered protocol family %d\n", family);
}
EXPORT_SYMBOL(sock_unregister);