摘要:
对于输出的报文,主要做如下操作: 1. 调用ip_route_output_flow路由查找 2. 在ip_route_output_flow里面会调用xfrm_lookup进行ipsec policy查找 3. 如果policy的action为XFRM_POLICY_ALLOW,则调用xfrm_find_bundle或者xfrm_bundle_create创建dst链表 4. 应用链表中的dst... 阅读全文
摘要:
以ip v4 ESP tunnel模式为例分析ipsec的收包过程; 在esp4_init注册了协议号为50的ESP报文处理函数xfrm4_rcv int xfrm4_rcv(struct sk_buff *skb){ return xfrm4_rcv_encap(skb, 0);}对于发完本机且IP头中协议号为50的ESP报文则会进入xfrm4_rcv_encap进行解密;xfrm4_r... 阅读全文
摘要:
l3fwd例子中不支持带邻居表项的查找, 本例子添加了一个hash表用于存储邻居信息; http://files.cnblogs.com/chanwai1219/route.rar 阅读全文
摘要:
dpdk例子中提供了两种方法与linux kernel协议栈交互: TAP和KNI; 两种方法都是创建虚拟设备用于收发报文; TAP/TUN设备的创建 static int tap_create(char *name){ struct ifreq ifr; int fd, ret; fd = open("/dev/net/tun", O_RDWR); if (fd pkt... 阅读全文
摘要:
回到l2fwd的main函数中 intMAIN(int argc, char **argv){ struct lcore_queue_conf *qconf; struct rte_eth_dev_info dev_info; int ret; uint8_t nb_ports; uint8_t nb_ports_available; uint8_t porti... 阅读全文
摘要:
之前在helloworld中主要分析了hugepage的使用,这回在l2fwd中主要分析一下uio和PMD的实现main函数中首先调用了rte_eal_init初始化eal环境,其中主要是hugepage的初始化;ret = rte_eal_init(argc, argv);if (ret pci_... 阅读全文
摘要:
intMAIN(int argc, char **argv){ int ret; unsigned lcore_id; ret = rte_eal_init(argc, argv); if (ret mem_config,并映射hugepage到挂载目录下的文件rte_map... 阅读全文
摘要:
环境搭建:手头没有intel的板子,暂时只能用虚拟机代替;虚拟机的CPU数量不能超过真实的机器,因此暂时无法模拟出NUMA的环境;dpdk需要至少两块网卡,eth0和eth1用于dpdk使用,eth2用于跟主机通信;打开虚拟机的配置文件, xxx.vmx,把所有网卡都设置成e1000ethernet... 阅读全文
摘要:
RCU(Read-Copy Update)是一种同步机制,通过保存对象的多个副本来保障读操作的连续性,并保证在预定的读方临界区没有完成之前不会释放这个对象。传统的同步机制如spin lock,semaphore,rwlock等,并发线程不区分读写线程,或者并发线程允许同时读,但是读的时候不允许更新。RCU与这些机制最大的区别是允许在更新的同时读数据。RCU允许同时有一个更新线程和多个读线程并发; ... 阅读全文
摘要:
路由表的结构 为了各种操作的快速查找,内核中定义了几个不同的哈希表, 存储着相同的结构 1. 基于掩码长度的哈希表 内核中定义了长度为33的哈希表, 分别表示掩码长度0-32, 其中掩码长度为0的表示默认路由; fib_table的tb_data是fn_hash结构: struct fn_hash { struct fn_zone *fn_zones[33]... 阅读全文