AF_PACKET

socket的几种里面常见的2种。

------历史-------

AF_NET最早生出,后来有了AF_PACKET。

----结束历史-------

AF_NET常见。

AF_PACKET=PF_PACKET, 使用在kernel中 net/af_packet.c


http://lxr.free-electrons.com/source/net/packet/af_packet.c


PF_PACKET有3种类型,是SOCK_RAW和SOCK_DGRAM, SOCK_PACKET

SOCK_RAW 带MAC报文头(TCP/IP栈中,14个字节=目的MAC+源MAC+类型(0x0806,IP))

SOCK_DGRAM不带二层头


在上面的连接中,针对SOCK_DGRAM的socket,底层处理就是加上包头再发送

static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len)

  if (sock->type == SOCK_DGRAM) {
            offset = dev_hard_header(skb, dev, ntohs(proto), addr, NULL, len);

对于SOCK_DGRAM的socket, 底层处理就是对收到的包剥掉包头再叫上层处理

static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev,

if (sk->sk_type == SOCK_DGRAM) {
        macoff = netoff = TPACKET_ALIGN(po->tp_hdrlen) + 16 +


你可能感兴趣的:(AF_PACKET)