Linux网络子系统
文章平均质量分 68
nerdX
这个作者很懒,什么都没留下…
展开
-
网络子系统41_inet_peer平衡二叉树的删除
// 二叉树删除节点:// 1.待删除节点存在左孩子,则使用p的左孩子的最右孩子替换p,然后重平衡树// 2.待删除节点不存在左孩子,则使用p的右孩子替换p,然后重平衡树// 调用路径:clean_up->unlink_from_pool1.1 static void unlink_from_pool(struct inet_peer *p){ int do_free = 0;原创 2013-10-08 14:22:57 · 1361 阅读 · 0 评论 -
网络子系统66_策略路由初始化
// 策略路由链表// 系统中所有策略路由通过fib_rules链接在一起static struct fib_rule default_rule = { .r_clntref = ATOMIC_INIT(2),//引用计数 .r_preference = 0x7FFF,//路由规则优先级 .r_table = RT_TABLE_DEFAULT,//路由表标示符 .r_action原创 2013-10-17 20:58:47 · 1419 阅读 · 0 评论 -
网络子系统63_路由子系统处理netlink事件
// 路由子系统netlink控制块1.1 static struct rtnetlink_link inet_rtnetlink_table[RTM_MAX - RTM_BASE + 1] = { [4] = { .doit = inet_rtm_newaddr, }, [5] = { .doit = inet_rtm_deladdr, }, [6] = { .dumpit原创 2013-10-17 18:42:46 · 2371 阅读 · 0 评论 -
网络子系统64_设备ip地址配置
// 相同子网:// 掩码相同,网络地址相同// 为设备配置ip地址// 函数主要任务:// 1.合理性检查;// 1.1 相同子网内该地址没有被添加过// 1.2 相同子网内的地址scope应该相同// 2.将ifa插入到in_device->ifa_list中// 3.通知netlink,inetaddr_chain 新地址的加入// 注:地址在in_de原创 2013-10-17 19:33:58 · 2419 阅读 · 0 评论 -
网络子系统65_路由表初始化
// 多路由表// 编译支持多路由表,系统提供255张路由表,由系统使用id为253,254,255的路由表 1.1 enum rt_class_t{ RT_TABLE_UNSPEC=0, RT_TABLE_DEFAULT=253, RT_TABLE_MAIN=254, RT_TABLE_LOCAL=255, __RT_TABLE_MAX};#define RT_TABLE_原创 2013-10-17 20:24:51 · 2092 阅读 · 0 评论 -
网络子系统62_路由子系统处理设备事件
// 监听设备事件1.1 static struct notifier_block ip_netdev_notifier = { .notifier_call =inetdev_event,};// 路由子系统对网络设备事件的处理// 与事件相关的设备需要有inet配置信息// 函数主要任务:// 1.开启设备,激活路由子系统对设备多播的支持, 如果为回环设备,则为其分配ip原创 2013-10-17 16:55:17 · 1071 阅读 · 0 评论 -
网络子系统67_路由表处理设备事件
// 路由表对网络设备事件的处理// 在ip_rt_init->ip_fib_init中注册1.1 static struct notifier_block fib_netdev_notifier = { .notifier_call = fib_netdev_event,};// 路由表处理设备事件// 函数主要功能:// 1.设备开启// 1.1 将设备配置的所有ip原创 2013-10-17 21:24:10 · 1007 阅读 · 0 评论 -
网络子系统70_路由缓存操作
// 刷新路由缓存// 参数:// delay, 刷新操作的延迟时间// 函数主要任务:// 1.重新计算路由刷新定时器的到期时间// 2.如果delay=0,则立即刷新缓存// 3.激活定时器,使用最近的刷新延迟作为到期时间1.1 void rt_cache_flush(int delay){ unsigned long now = jiffies; //用户态原创 2013-10-19 20:51:03 · 1484 阅读 · 0 评论 -
网络子系统68_路由表处理设备ip配置事件
// 路由表处理inet配置事件// 在ip_rt_init->ip_fib_init中注册1.1 static struct notifier_block fib_inetaddr_notifier = { .notifier_call = fib_inetaddr_event,};// 路由表处理地址配置事件// 函数主要功能:// 1.设备配置ip地址// 1.1原创 2013-10-17 21:37:06 · 1235 阅读 · 0 评论 -
网络子系统61_路由子系统初始化
// 路由缓存内存量指定办法:// 1.通过启动参数rhash_entries指定hash表bucket个数// 2.根据物理内存页数确定使用的内存量// 根据物理页数分配缓存内存:// 1.goal目标内存页数=总页数/(2**(26-PAGE_SHIFT))// 2.最接近goal内存页数的order,用于从伙伴系统中分配// 3.rt_hash_mask=order页原创 2013-10-16 22:26:29 · 1453 阅读 · 0 评论 -
网络子系统60_路由子系统初始化蓝图
//参考 深入理解linux网路技术内幕原创 2013-10-16 21:26:05 · 1471 阅读 · 0 评论 -
网络子系统37_网桥、端口定时器
//初始化网桥使用的定时器//调用路径:br_add_bridge->new_bridge_dev->br_stp_timer_init1.1 void br_stp_timer_init(struct net_bridge *br){ setup_timer(&br->hello_timer, br_hello_timer_expired, (unsigned long)原创 2013-10-05 14:29:17 · 1282 阅读 · 0 评论 -
网络子系统35_BPDU的发送与接收
//传输配置BPDU1.1 void br_transmit_config(struct net_bridge_port *p){ struct br_config_bpdu bpdu;//配置bpdu struct net_bridge *br; if (timer_pending(&p->hold_timer)) {//如果在速率限制区间内,则设置config_pending,然原创 2013-10-04 21:56:20 · 2914 阅读 · 0 评论 -
网络子系统42_ip协议数据帧的接收
//参考 深入理解linux网络技术内幕 // 注册l3协议// ptype_all链表,链接所有ETH_P_ALL类型的l3协议// ptype_base哈希表,非ETH_P_ALL类型的l3协议// 注:l3协议可以使用相同的协议号1.1 void dev_add_pack(struct packe原创 2013-10-08 20:19:04 · 1975 阅读 · 0 评论 -
网络子系统46_ip协议数据帧的转发
// ip协议数据转发// ip_forward以回调函数的形式,保存在skb->dst->input,skb->dst在ip_route_input路由封包时被设置// 调用路径:ip_rcv->ip_rcv_finish->dst_input->(skb->dst->input)// 函数的主要任务:// 1.递减ttl// 2.如果路由被重定向,则向发送方发送icmp重定向原创 2013-10-10 22:22:07 · 1763 阅读 · 0 评论 -
网络子系统57_路由Scope
// Scope// 1.路由的Scope表示到目的网路网络的距离// 2.ip地址的Scope表示该ip地址距离本地主机有多远// 路由Scope// 保存在fib_alias->fa_scope// 路由Scope常见取值及其意义:// 1.RT_SCOPE_NOWHERE: 路由不通往任何地方// 2.RT_SCOPE_HOST:为本地接口配置ip地址时,自动创建原创 2013-10-16 20:53:43 · 2911 阅读 · 1 评论 -
网络子系统58_主地址、辅地址
// 参考 深入理解linux网络技术内幕// 主地址// 在NIC上配置ip地址时,如果该地址是子网内的第一个地址时,默认指定为主地址// 辅地址// 在NIC上配置ip地址时,如果该地址与此NIC已经配置的地址在同一子网,则该地址// 被视为辅地址// 主地址作用:// 1.删除主地址时,所有相关的辅地址也被删除,可通过/proc配置,当主地址被删除时可以// 将辅原创 2013-10-16 21:03:15 · 1529 阅读 · 0 评论 -
网络子系统59_策略路由、多路径路由
// 参考 深入理解linux网络技术内幕// 策略路由:// 指允许用户除了可以根据目的ip地址配置路由外,还可以根据其他参数配置路由// 内核对策略路由的支持:// 1.在默认情况下,不支持策略路由, 使用2张路由表,1张本地表,1张用于配置管理// 2.编译支持策略路由,使用255张表,1张本地表,其他根据配置参数使用不同的表// 选择路由表:// 内核可以基于以下参数原创 2013-10-16 21:18:13 · 1607 阅读 · 0 评论 -
网络子系统30_桥接子系统通用接口
//添加网桥设备,设备名需要唯一1.1 int br_add_bridge(const char *name){ struct net_device *dev;//net_bridge->dev int ret; dev = new_bridge_dev(name);//创建一个新的网桥设备 if (!dev) return -ENOMEM; rtnl_lock();//获原创 2013-10-01 21:32:26 · 1331 阅读 · 0 评论 -
网络子系统33_网桥设备的配置更新
//网桥的状态更新//调用路径dev_close->br_dev_stop->br_stp_disable_bridge->br_stp_disable_port->br_configuration_update1.1 void br_configuration_update(struct net_bridge *br){ br_root_selection(br);//选择根端口,根网桥原创 2013-10-04 15:33:30 · 1059 阅读 · 0 评论 -
网络子系统72_IP多播地址与MAC多播地址的映射关系
为了支持IP多播,以太网的大佬们已经为 Ethernet和Fiber Distributed Data Interface (FDDI)的MAC地址保留了一个多播地址区间:01-00-5E-00-00-00 到 01-00-5E-7F-FF-FF。正如下图所示48位的MAC地址中的高25位是固定的,低23位是可变的。 为了映射一个IP 多播地址到MAC层的多播地址,I转载 2013-10-21 11:29:07 · 1993 阅读 · 0 评论 -
网络子系统73_入口路由缓存查找
// 入口路由缓冲查找// 返回值:// 0,路由查找成功// -ENOBUFF,内存问题导致查找失败// -EINVAL,常规查找失败// hash值计算:// 目的地址,源地址,入口设备index,tos进行hash// 函数主要任务:// 1.根据hash值遍历bucket// 2.比较5元组// 3.如果缓存命中,更新引用计数,绑定到skb->dst//原创 2013-10-21 15:15:08 · 1464 阅读 · 0 评论 -
网络子系统71_路由缓存垃圾回收
// 同步回收机制// 返回值:// 0,达到回收目标// 1,没有达到回收目标// 注:ip_rt_gc_min_interval = HZ/2// ip_rt_gc_timeout = RT_GC_TIMEOUT = 300HZ// 平衡点,gc目标数的动态调整:// 1.当前缓存个数 < 安全阈值(安全范围,试图gc少缓存)// 1.1 当前缓存个数 > 上原创 2013-10-20 14:37:38 · 1841 阅读 · 0 评论 -
网络子系统83_inet协议族-SOCK_RAW(四)
// raw sock数据就绪函数// raw sock在raw_recvmsg中阻塞,在raw_local_deliver通过sock->sk_data_ready通知输入数据就绪// 步骤:// 1.过滤感兴趣的事件// 2.唤醒阻塞进程,并将进程从wq上取下1.1 static int receiver_wake_function(wait_queue_t *wait, un原创 2014-02-28 10:00:43 · 1394 阅读 · 0 评论 -
网络子系统82_inet协议族-SOCK_RAW(三)
// 向raw sock传递skb// 步骤:// 1.根据协议号获取监听指定protocol的sock// 2.向raw sock传递skb1.1 int raw_local_deliver(struct sk_buff *skb, int protocol){ int hash; struct sock *raw_sk; //获取监听指定协议的raw sock hash原创 2014-02-27 21:36:40 · 1463 阅读 · 0 评论 -
网络子系统80_inet协议族-SOCK_RAW(一)
// SOCK_RAW1.1 static struct inet_protosw inetsw_array[] ={ ... { .type = SOCK_RAW, .protocol = IPPROTO_IP, /* 通配符 */ .prot = &raw_prot, /* Networking protoco原创 2014-02-27 16:58:35 · 3002 阅读 · 0 评论 -
网络子系统81_inet协议族-SOCK_RAW(二)
// struct sock->sk_prot字段// struct proto为插口层到传输层的接口4.1 struct proto raw_prot = { .name = "RAW", .owner = THIS_MODULE, .close = raw_close, .destroy = raw_destroy, .connect = i原创 2014-02-27 17:00:10 · 2002 阅读 · 0 评论 -
网络子系统85_inet协议族-l3向上
// ip数据报向本地传递// 调用路径:ip_rcv->dst_input->...->ip_local_deliver1.1 int ip_local_deliver(struct sk_buff *skb){ //如果ip数据报被分片,则重组 if (ip_is_fragment(ip_hdr(skb))) { if (ip_defrag(skb, IP_DEFRAG_LOCA原创 2014-02-28 11:41:23 · 1514 阅读 · 0 评论 -
网络子系统79_inet协议族
// inet协议族默认支持的协议类型// 在inet_init中,通过inet_register_protosw注册到inetsw邻接表1.1 static struct inet_protosw inetsw_array[] ={ //流类型 { .type = SOCK_STREAM, .protocol = IPPROTO_TCP, .prot =原创 2014-02-27 10:36:09 · 1499 阅读 · 0 评论 -
网络子系统78_inet套接字创建
// inet协议族控制块// 1.在inet_init中,由sock_register(&inet_family_ops)注册给系统// 2.在sys_socket系统调用中,通过协议族号查找对应的协议控制块,然后由// 具体协议控制块的create函数创建套接字1.1 static const struct net_proto_family inet_family_ops原创 2014-02-27 10:07:40 · 1283 阅读 · 0 评论 -
网络子系统84_sock事件通知进程
// socket初始化// 调用路径:inet_create->sock_init_data1.1 void sock_init_data(struct socket *sock, struct sock *sk){ ... //sock状态改变的回调函数,当sock的状态变迁(如从established到close_wait)就会调用这个函数 sk->sk_state_change原创 2014-02-28 11:02:07 · 2045 阅读 · 0 评论 -
网络子系统10_inet模块初始化
//inet模块初始化//inet功能以模块的形式提供//1.sock_register(inet_family_ops)注册inet创建socket的回调函数//2.struct inet_protosw向上的数据结构//3.struct net_protocol向下的数据结构static int __init inet_init(void){ struct sk_buff *du原创 2013-09-27 21:25:24 · 1558 阅读 · 0 评论 -
网络子系统77_套接字接收
// accept系统调用// 步骤:// 1.由内核公共部分创建一个新套接字描述符,并分配其对应的文件描述符// 2.新套接字使用accept之上的套接字相同的套接字类型和操作// 3.交由具体协议完成accept// 4.如果accept调用者要求返回peer地址,通过新套接字获取地址,并复制到用户地址空间// 5.将新套接字的文件描述安装到调用者的进程控制块,返回新套接原创 2014-02-26 11:25:02 · 1321 阅读 · 0 评论 -
网络子系统76_套接字绑定
// 绑定套接字到地址// 步骤:// 1.根据用户空间的文件描述符查找socket描述符// 2.复制地址信息到内核空间// 3.由具体的协议族完成绑定1.1 SYSCALL_DEFINE3(bind, int, fd, struct sockaddr __user *, umyaddr, int, addrlen){ struct socket *sock; struct原创 2014-02-26 11:05:25 · 1082 阅读 · 0 评论 -
网络子系统54_ip协议分片重组_定位ipq
//为分片确定正确的ipq结构// 定位5元组 // 1. 可通过ip报文获取// 2.user 通过ip_defrag给出,指出重组是由谁发起的,最常见的时IP_DEFRAG_LOCAL_DELIVER,当重组的入口分包要传递给本地时// ipq中所有分片最迟完成重组的时间为30HZ1.1 static inline struct ipq *ip_find(struct iphdr原创 2013-10-12 21:02:34 · 1597 阅读 · 0 评论 -
网络子系统69_路由表辅助程序
// 关闭设备上的ip协议// 函数主要任务:// 1.删除与设备的路由信息,刷新路由表// 2.刷新路由缓存// 3.通知邻居子系统,与该设备有关的邻居项失效1.1 static void fib_disable_ip(struct net_device *dev, int force){ if (fib_sync_down(0, dev, force)) fib_flu原创 2013-10-18 11:28:33 · 1507 阅读 · 0 评论 -
网络子系统12_邻居子系统垃圾回收
// 邻居子系统垃圾回收机制:// 1.异步回收机制:通过定时器,定期检测邻居缓存使用的内存阈值// 2.同步回收机制:无法分配新neighbour实例时,同步回收内存。// 同步,异步回收机制的区别:// 1.同步回收比异步回收更加严格:// 1.1 回收的数量:同步回收遍历每一个bucket;// 异步回收接着上次清理的bucket开始,只清理一个bucket/原创 2013-09-28 09:59:09 · 1002 阅读 · 0 评论 -
网络子系统14_邻居子系统通用接口
//创建一个新的邻居项//参考 深入理解linux网络技术内幕//邻居项的创建是由事件驱动的,当系统需要一个邻居项,并且缓存不命中时,就创建一个邻居项,创建时机有://1.传输请求,当有一个向一台l2地址未知的主机传输请求时,就需要对该地址进行解析,当目的主机不是与发送方直连时,解析的l2地址就是下一条网关的地址//2.收到solicitation请求,由于发送请求的主机在请求封包中有自己原创 2013-09-28 11:00:28 · 1262 阅读 · 0 评论 -
网络子系统17_邻居子系统代理功能
//代理服务器对solicitation应答的条件:// 1.请求的地址和代理服务器收到请求的接口上配置的地址不属于同一子网// 2.必须启动代理功能//代理的方式:// 1.基于设备的代理,即该设备接收到的所有有效请求都会被处理。// 2.基于目的地址的代理,针对特定的ip请求进行代理//方式之间的优先级:// 在1使能的情况下,会自动包含所有2的情况,因此不原创 2013-09-29 11:14:11 · 851 阅读 · 0 评论 -
网络子系统7_l2、l3接口
//在驱动程序接收到一个数据帧之后,以太网设备去除掉最后四字节的crc32,将帧拷贝到skb中//此时skb->mac.raw指向mac头//skb->data已经跳过l2头1.1 int netif_receive_skb(struct sk_buff *skb){ struct packet_type *ptype, *pt_prev; int ret = NET_RX_DROP;原创 2013-09-27 09:54:05 · 1774 阅读 · 0 评论