Linux内核中,$KERNEL/include/linux/net.h
文件下定义了net_proto_family
结构体。
struct net_proto_family{
int family;
int (*create)(struct net* net, struct socket* sock,
int protocol, int kern);
struct module* owner;
}
family
指示一种socket的类型;*create
指向用来构建该类型socket的函数,其中struct net
是所在的网络空间,*sock
已在内存中声明,被构建成family
所指示类型的socket,kern
只是是否为内核空间请求创建或用户空间请求创建。
$KERNEL/net/socket.c
中声明一个struct net_proto_family
的数组net_families
。
static const struct net_proto_family __rcu *net_families[NPROTO] __read_mostly;
每一类注册的socket都对应一个struct net_proto_family
结构体;该结构体都通过sock_register
被存储到net_families[]
中。
int sock_register(const struct net_proto_family *fam);
创建socket时,在net_families[]
数组中查找family
对应的struct net_proto_family
,然后调用结构体中的create()
函数。
int sock_create(int family, int type, int proto, struct socket **res);
在Linux Kernel 3.18的$KERNEL/include/linux/socket.h
头文件,定义了40中地址族 (Address Family),分别对一个协议族(Protocol Family)。比如AF_INET
对应PF_INET
。
/* 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_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_MAX 41 /* For now.. */
PF_INET和PF_BLUETOOTH对应的struct net_proto_family
结构体如下:
//net/ipv/af_inet.c
static const struct net_proto_family inet_family_ops = {
.family = PF_INET,
.create = inet_create,
.owner = THIS_MODULE,
};
//net/bluetooth/af_bluetooth.c
static struct net_proto_family bt_sock_family_ops = {
.owner = THIS_MODULE,
.family = PF_BLUETOOTH,
.create = bt_sock_create,
};
网友评论