首页 | 资讯动态 | linux基础 | 系统管理 | 网络管理 | 编程开发 | linux数据库 | linux相关 | linux认证 | 下载中心 | 专题
oklinux
 系统管理:中文环境 系统管理 桌面应用 内核技术 Linux基础:安装配置 常用命令 经验技巧 软件应用 Linux数据库:Mysql POSTGRE
 网络管理:网络安全 网络应用 Linux服务器 编程开发:PHP CC++ Python Perl SHELL 嵌入式开发 | PHP基础 PHP技巧 PHP应用 PHP文摘
 首页 linux资讯动态 Linux专题 | 其他Unix Linux解决方案 硬件相关 Linux认证 企业应用 Apache | 相关下载:软路由 参考手册 开发工具
 → 当前位置:首页>系统管理>内核技术>正文

Linux系统内核接收以太帧的处理程序

OKLinux www.oklinux.cn 2007-02-12 来源:赛迪网技术社区 收藏本文

1. 前言

以太头中除了6字节目的MAC地址、6字节源MAC地址外,还有两字节的以太帧类型值,如IPv4为0x0800,ARP为0x0806等,网卡驱动收到以太帧后通过接口函数netif_receive_skb()(netif_rx实际最后也是调用netif_receive_skb)交到上层,而这个接口函数就完成对以太帧类型的区分,交到不同的协议处理程序。如果想自己编写某一以太类型帧的处理程序,需要自己添加相应的代码。以下为Linux内核2.6代码。

2. 数据结构

每种协议都要定义一个packet_type结构,引导进入相关的协议数据处理函数,所有节点组成一个链表(HASH链表)。


/* include/linux/netdevice.h */
struct packet_type {
__be16 type; /* This is really htons(ether_type). */
struct net_device *dev; /* NULL is wildcarded here */
int (*func) (struct sk_buff *,
struct net_device *,
struct packet_type *,
struct net_device *);
void *af_packet_priv;
struct list_head list;
            };

参数说明:

type:以太帧类型,16位。

dev:所附着的网卡设备,如果为NULL则匹配全部网卡。

func:协议入口接收处理函数。

af_packet_priv:协议私有数据。

list:链表扣。

一般各协议的packet_type结构都是静态存在,初始化时只提供type和func两个参数就可以了,每个协议在初始化时都要将此结构加入到系统类型链表中。

3. 处理函数

3.1 添加节点

/* net/core/dev.c */
/**
* dev_add_pack - add packet handler
* @pt: packet type declaration
*
* Add a protocol handler to the networking stack. The passed &packet_type
* is linked into kernel lists and may not be freed until it has been
* removed from the kernel lists.
*
* This call does not sleep therefore it can not 
* guarantee all CPU's that are in middle of receiving packets
* will see the new packet type (until the next received packet).
*/
void dev_add_pack(struct packet_type *pt)
{
int hash;
spin_lock_bh(&ptype_lock);
// 如果类型是全部以太类型,则节点链接到ptype_all链
if (pt->type == htons(ETH_P_ALL)) {
netdev_nit++;
list_add_rcu(&pt->list, &ptype_all);
} else {
// 根据协议类型取个HASH,共15个HASH链表
hash = ntohs(pt->type) & 15;
// 将节点链接到HASH链表中,list_add_rcu是加了smp_wmb()保护的list_add链表操作
list_add_rcu(&pt->list, &ptype_base[hash]);
}
spin_unlock_bh(&ptype_lock);
            }

 

[1] [2] [3] 下一页  

共7页: 上一页 1 [2] [3] [4] [5] [6] [7] 下一页
上一篇:关于Linux系统内核源代码分析经验谈   下一篇:用命令行加挂Linux的文件系统简介
收藏】 【评论】 【推荐】 【投稿】 【打印】 【关闭

相关文章
·关于Linux系统内核源代码分析经验谈
·用命令行加挂Linux的文件系统简介
·详解Linux操作系统的内核空间保护
·主流嵌入式Linux系统下GUI解决方案
·Linux数据传输技术Relay的原理及实例
·关于Linux操作系统的NTFS和内核分析
·Linux中共享内存及内存映射技术研究
·Linux内核和核心OS组件的测试与分析
·解读和分析Linux核心源码的两种方法
·通过振动向Linux ThinkPad传输信息
发表评论
密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。)
站内搜索
阅读排行榜
·走向Linux系统高手之路 编
·使用 SystemTap 调试内核
·Emacs能很好地在Linux内核
·嵌入式Linux中GUI研究与移
·Linux内核初始化过程简要
·在FreeBSD4.x中制作启动菜
·走向Linux系统高手之路 编
·Linux系统核心源程序的文
·红旗3.0 Server服务配置教
·Linux 核心--1.前言
最新文章
·Linux系统核心源程序的文
·揭示恶意的Linux内核模块
·解读和分析Linux核心源码
·Linux内核和核心OS组件的
·Linux数据传输技术Relay的
·主流嵌入式Linux系统下GUI
·用命令行加挂Linux的文件
·关于Linux系统内核源代码
·详解Linux操作系统的内核
·关于Linux操作系统的NTFS
·Linux中共享内存及内存映
·通过振动向Linux ThinkPad
·关于Linux操作系统的内核
·边学边干Linux内核指导—
·Linux中用内核KHTTPD实现W

设为首页 - 加入收藏 - 版权声明 - 广告服务 - 关于我们 - 联系我们 - 友情连接
Copyright © 2007 All rights reserved OKLinux.Cn 版权所有
合作联系 QQ:18743986 Email:arlan8005#163.com