查看完整版本: 内核中网络部分问题

猪猪 2007-1-28 16:41

内核中网络部分问题

[color=Red]问:[/color]在linux网络结构中,数据从网卡接受到网络层,主要是通过中断以及设备驱动程序实行的,主要在net/ipv4/ip_input.c中的ip_rcv()以及net/core/dev.c中的netif_rx()和net_bh()函数中处理的,不知我说的对不对?

但是,我在分析网络层向套接字层时,发现由于tcp和udp的不同,以及有些数据包并不经过套接字层的处理(象icmp),我想问大家的是不知linux 内核是通过什么途径实现的,以及处理主要在哪些源文件中?

[color=Red]答:[/color]内核在处理完IP层的工作以后,在ip_input.c中,根据收到的数据包的协议头进行处理(在ip_local_deliver()函数中看这个协议是否存在于inet_protos协议表中(包括tcp,udp等等协议都是注册到这张表中的),然后转到相应的处理函数中去。
[code]/*include/net/protocol.h*/

struct inet_protocol
{
int (*handler)(struct sk_buff *skb, unsigned short len);
void (*err_handler)(struct sk_buff *skb, unsigned char *dp, int len);
struct inet_protocol *next;
unsigned char protocol;
unsigned char copy:1;
void *data;
const char *name;
};

extern struct inet_protocol *inet_protos[MAX_INET_PROTOS];

TCP,UDP就在这个表中注册的接口
/*net/ipv4/protocol.c*/
static struct inet_protocol tcp_protocol =
{
tcp_v4_rcv, /* TCP handler */
tcp_v4_err, /* TCP error control */
IPPROTO_PREVIOUS,
IPPROTO_TCP, /* protocol ID */
0, /* copy */
NULL, /* data */
"TCP" /* name */
};
static struct inet_protocol udp_protocol =
{
udp_rcv, /* UDP handler */
udp_err, /* UDP error control */
IPPROTO_PREVIOUS, /* next */
IPPROTO_UDP, /* protocol ID */
0, /* copy */
NULL, /* data */
"UDP" /* name */
}; [/code]
^_^,希望有所帮助

狂踩日本狗 2007-2-3 22:43

沙发
页: [1]
查看完整版本: 内核中网络部分问题