dpvs源码阅读笔记
dpvs源码阅读笔记
ss_chris
这个作者很懒,什么都没留下…
展开
-
linux内核中邻居项状态机
邻居项状态机 NUD_NONE 邻居项刚建立时处于的初始状态 在此状态下,还没有硬件地址可使用,因此还不能发送请求报文.此时,一旦有报文要输出到该邻居,便会触发对该邻居硬件地址的请求,进入NUD_INCOMPLETE状态,并缓存发送的报文. 参见neigh_alloc和neigh_resolve_output NUD_INCOMPLETE 请求报文已经发送,但尚未收到应答的状态 在此状态下,还没有解析到硬件地址,因此尚无可用的硬件地址,如果有报文要输出到此邻居...原创 2020-08-21 11:42:14 · 1151 阅读 · 0 评论 -
dpvs中ARP协议
arp_init neigh_table per-lcore,hash桶初始化 注册ARP协议的pkt_type,用于处理接收的arp数据包 注册loop任务neigh_process_ring,arp数据包会通过ring广播到所有的lcore,取出其中的arp数据包处理 static int arp_init(void){ int i, j; int err; //初始化neigh_table哈希表,每个lcore维护自己本地的arp缓存表 for (..原创 2020-08-21 11:40:06 · 551 阅读 · 0 评论 -
dpvs conn超时处理
连接定时器处理函数设置 超时处理函数为dp_vs_conn_expire 设置priv为当前conn static void dp_vs_conn_attach_timer(struct dp_vs_conn *conn, bool lock){ int rc; //如果conn->timer正在运行中,则直接返回 if (dp_vs_conn_is_in_timer(conn)) { return; } //如果为长连..原创 2020-08-20 16:48:47 · 684 阅读 · 0 评论 -
dpvs中fdir与sa_pool介绍
问题引入dpvs是dpdk程序,特点就是每个核尽可能不与其他核交互,这就要求共享数据都有一份拷贝,或是数据私有。fnat模式中流表(session)保存连接信息,每个核独有。但这里有个问题,full-nat模式下,返程数据outbound packet也必须分配到与inbound packet收取的同一个lcore,否则在流表中找不到conn dpvs解决方案 引入fdir机制 lcore上lip都是同步一致的,根据本地端口lport,来分配正确的核,此处用于fdir计算的lport根据启用的l原创 2020-08-20 15:39:57 · 2153 阅读 · 0 评论 -
dpvs fnat模式
inbound方向 dp_vs_xmit_nat //fnat模式inbound数据传输int dp_vs_xmit_fnat(struct dp_vs_proto *proto, struct dp_vs_conn *conn, struct rte_mbuf *mbuf){ int af = conn->af; assert(af == AF_INET || af == AF_INET原创 2020-08-19 21:52:03 · 1262 阅读 · 0 评论 -
dpvs synproxy
TCP协议开辟了一个比较大的内存空间请求连接队列来存储连接请求块,当SYN请求不断增加,请求连接数目到达上限时,会致使系统丢弃SYN连接请求。SYN cookies技术就可以使服务器在半连接队列已满的情况下仍能处理新的SYN请求 当半连接队列满时,SYN cookies并不丢弃SYN请求,而是通过加密技术来标识半连接状态。在TCP实现中,当收到客户端的SYN请求时,服务器需回复SYN+ACK包给客户端,然后客户端再发送确认包给服务器。通常服务器的初始序列号是由服务器按照一定的规律计算得到或采用..原创 2020-08-19 17:37:38 · 653 阅读 · 0 评论 -
dpvs nat模式
NAT模式限制 NAT为双臂模式 拓扑实例 如上图所示,各节点的IP地址如下: client: 192.168.0.46 VIP: 192.168.0.89 DPVS local ip: 192.168.0.66, 10.140.31.48 RS1: 10.140.18.33 RS2: 10.140.18.33 可见,所有的IP地址都在一个局域网内 NAT模式约束 DPVS-NAT模式只能在单个lcore中工作。由于以上原因,dp原创 2020-08-19 13:57:33 · 842 阅读 · 0 评论 -
dpvs xmit接口
xmit_inbound /* return verdict INET_XXX */static int xmit_inbound(struct rte_mbuf *mbuf, struct dp_vs_proto *prot, struct dp_vs_conn *conn){ int err; assert(mbuf && prot && con..原创 2020-08-19 12:21:27 · 332 阅读 · 0 评论 -
dpvs DR模式
简介 LB只处理进入的请求,将流量分发给后端,返回数据由Real Server直接返回到Client,所以模式叫Direct Routing 原理:修改二层头mac地址,所以它的局限性也很明显,只能在同一个二层,不能跨网段。由于直接返回给client,一般不会面对公网用户 部署图 DR Mode配置(one-arm) To use DR dpvs needs a LAN IP first. (for one-arm, it must be different原创 2020-08-19 12:20:53 · 781 阅读 · 0 评论 -
dpvs邻居系统简介
neighbour_entry struct neighbour_entry { //协议族 int af; struct list_head neigh_list; //ip地址 union inet_addr ip_addr; //mac地址 struct ether_addr eth_addr; //出口port struct netif_port *port; ..原创 2020-08-19 12:17:15 · 631 阅读 · 0 评论 -
dp_vs调度(一):dp_vs_scheduler
dp_vs_scheduler struct dp_vs_scheduler { //用于将已注册的scheduler都挂接在全局dp_vs_schedulers链表中 struct list_head n_list; //调度算法名称 char *name;// rte_atomic32_t refcnt; //以下为虚函数表 struct dp_vs_dest * (*schedule)(..原创 2020-08-19 09:18:59 · 329 阅读 · 0 评论 -
tcp新建连接调度
tcp_conn_sched /** * set @verdict if failed to schedule * 新建的连接由conn_sched进行调度,对于tcp服务调用tcp_conn_sched,在__dp_vs_in中被调用 * 返回值: * EDPVS_OK: 继续lvs处理 * 其余: 结束lvs处理,并且将设置的verdict作为hook返回结果返回 */static int tcp_conn_sched(struct dp_vs_proto *...原创 2020-08-19 09:17:41 · 430 阅读 · 0 评论 -
dp_vs_service
dp_vs_service结构体 /* virtual service *///lvs服务struct dp_vs_service { struct list_head s_list; /* node for normal service table */ struct list_head f_list; /* node for fwmark service table */ struct list_head m_list; /..原创 2020-08-19 09:16:05 · 423 阅读 · 0 评论 -
dpvs中lvs核心处理函数:dp_vs_in
__dp_vs_in 开始进入lvs模块,这块代码非常复杂,简单说,对于存在proxy连接,判断方向(client->LB或是rs->LB),直接发送流量.新来的连接,查找virtual server,根据LB算法查找对应后端real server,建立连接,并保存这个会话 static int __dp_vs_in(void *priv, struct rte_mbuf *mbuf, const struct inet_hook_stat..原创 2020-08-19 09:08:47 · 618 阅读 · 0 评论 -
dpvs中lcore redirect
dp_vs_redirect struct dp_vs_redirect { //解决hash表冲突 struct list_head list; //协议族 uint8_t af; //传输层协议 uint8_t proto; //需要转发的lcore id lcoreid_t cid; uint8_t padding..原创 2020-08-18 21:43:24 · 278 阅读 · 0 评论 -
dpvs中tcp conn查找相关
tcp_conn_lookup tcp连接查找 /** * tcp_protocol中查找conn接口 * direct,drop,peer_cid为输出参数 */static struct dp_vs_conn *tcp_conn_lookup(struct dp_vs_proto *proto, const struct dp_vs_iphdr *iph, struct rte_mbuf *mbuf, int *direct, bool rev..原创 2020-08-18 21:41:48 · 477 阅读 · 0 评论 -
blklst:dpvs中ip黑名单
blklst_entry struct blklst_entry { //通过该list解决hash冲突 struct list_head list; //协议族 int af; //传输层协议 uint8_t proto; //virtual server port uint16_t vport; //virtual server addr union inet_a..原创 2020-08-18 21:41:09 · 361 阅读 · 0 评论 -
tcp协议相关dp_vs_proto
dp_vs_proto 传输层接口 struct dp_vs_proto { //名称 char *name; //协议类型,TCP,UDP等 uint8_t proto; //conn不同状态超时时间查找表 int *timeout_table; /* protocol timeout table */ //初始化函数,tcp协议..原创 2020-08-18 21:40:08 · 372 阅读 · 0 评论 -
IPv4相关PRE_ROUTING hook
ipv4_rcv static int ipv4_rcv(struct rte_mbuf *mbuf, struct netif_port *port){ ... //执行INET_HOOK_PRE_ROUTING hook点处处理函数,内部会根据不同转发模式进行相应的判定 //ACCPT|STOP时执行ipv4_rcv_fin,继续往上处理 //STOLEN时整个数据包处理流程结束,不再往上传递 //DROP时,直接丢弃数据后返回 return INET_HOO..原创 2020-08-18 21:39:23 · 409 阅读 · 0 评论 -
dpvs中AF_INET协议族hook
ip_vs_core.c文件中dpvs_init时会注册内部自定义的相关hook处理函数 //lvs功能初始化,在main函数中调用int dp_vs_init(void) { ... //注册lvs相关hook处理函数 err = inet_register_hooks(dp_vs_ops, NELEMS(dp_vs_ops)); if (err != EDPVS_OK) { RTE_LOG(ERR, IPVS, "fail to register hook..原创 2020-08-18 21:37:49 · 260 阅读 · 0 评论 -
INET_HOOK
inet_hook_ops实例 struct inet_hook_ops { //处理函数 inet_hook_fn hook; //Inet hook点,类似linux内核netfilter unsigned int hooknum; //协议族,AF_INET、AF_INET6 int af; //私有数据 void *priv; //优先级,同一hoo..原创 2020-08-18 21:36:44 · 242 阅读 · 0 评论 -
IPv4数据包处理
IPv4协议pkt_type注册 ipv4_init时调用netif_register_pkt注册 static struct pkt_type ip4_pkt_type = { //.type = rte_cpu_to_be_16(ETHER_TYPE_IPv4), .func = ipv4_rcv, .port = NULL,};int ipv4_init(void){ int err, i; ip4_id..原创 2020-08-18 21:36:00 · 1104 阅读 · 0 评论 -
dpvs之l2层数据包处理
二层数据报处理入口函数void lcore_process_packets(struct netif_queue_conf *qconf, struct rte_mbuf **mbufs, lcoreid_t cid, uint16_t count, bool pkts_from_ring){ int i, t; struct ether_hdr *eth_hdr; struct rte_mbuf * mbuf_copied原创 2020-08-18 21:34:59 · 729 阅读 · 0 评论 -
FWD_WORKER核心处理
处理函数注册 netif.c文件中netif_init时会调用netif_lcore_init注册fwd_worker数据处理相关核心函数 static void netif_lcore_init(void){ ... netif_jobs[0].role = LCORE_ROLE_FWD_WORKER; snprintf(netif_jobs[0].job.name, sizeof(netif_jobs[0].job.name) - 1, "%s", "recv_fwd"); ..原创 2020-08-18 21:33:33 · 294 阅读 · 0 评论