net_proto_family结构体与socket

2015-06-24  本文已影响594人  catHeart

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,
};
上一篇 下一篇

猜你喜欢

热点阅读