自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(30)
  • 收藏
  • 关注

原创 dpvs persistent调度

ipvsadmin配置命令,开启persistent选项之后,ipvs将来自同一个客户端的请求全部调度到一个固定的RS服务器上。对于SSL和FTP这类,其多个报文之间是相互关联的协议,需要开启此类功能。但是对于NAT转发模式,由于NAT将对端口号进行修改,FTP服务需要使用ip_vs_ftp模块才能正常工作 命令行选项netmask默认为255.255.255.255,仅对同一个客户端进行持续调度。如下指定掩码255.255.255.0,可对同一个网段内的所有客户端,调度到同一个目的服务器进行..

2020-08-24 12:57:58 412

原创 linux内核中邻居项状态机

邻居项状态机 NUD_NONE 邻居项刚建立时处于的初始状态 在此状态下,还没有硬件地址可使用,因此还不能发送请求报文.此时,一旦有报文要输出到该邻居,便会触发对该邻居硬件地址的请求,进入NUD_INCOMPLETE状态,并缓存发送的报文. 参见neigh_alloc和neigh_resolve_output NUD_INCOMPLETE 请求报文已经发送,但尚未收到应答的状态 在此状态下,还没有解析到硬件地址,因此尚无可用的硬件地址,如果有报文要输出到此邻居...

2020-08-21 11:42:14 1089

原创 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 522

原创 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 670

原创 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 2096

原创 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 1247

原创 dpvs synproxy

TCP协议开辟了一个比较大的内存空间请求连接队列来存储连接请求块,当SYN请求不断增加,请求连接数目到达上限时,会致使系统丢弃SYN连接请求。SYN cookies技术就可以使服务器在半连接队列已满的情况下仍能处理新的SYN请求 当半连接队列满时,SYN cookies并不丢弃SYN请求,而是通过加密技术来标识半连接状态。在TCP实现中,当收到客户端的SYN请求时,服务器需回复SYN+ACK包给客户端,然后客户端再发送确认包给服务器。通常服务器的初始序列号是由服务器按照一定的规律计算得到或采用..

2020-08-19 17:37:38 643

原创 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 821

原创 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 327

原创 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 741

原创 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 609

原创 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 323

原创 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 422

原创 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 410

原创 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 603

原创 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 270

原创 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 466

原创 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 352

原创 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 362

原创 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 401

原创 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 252

原创 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 226

原创 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 1080

原创 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 719

原创 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 285

原创 ff_run函数详解

ff_run详解ff_run(loop_func_t loop, void* arg)loop为入口函数arg为user pointer void ff_run(loop_func_t loop, void* arg) { ff_dpdk_run(loop, arg); }ff_dpdk_run函数 void ff_dpdk_run(...

2019-09-18 19:44:32 1272

原创 ff_init函数详解

# ff_init函数详解ff_init(int argc, char** argv) 该函数完成f-stack的初始化工作 int ff_init(int argc, char * const argv[]){ int ret; /** * 1. 解析命令行参数 * 2. 加载ini...

2019-09-18 12:39:14 1449

原创 hpux下g++编译使用libunwind,_UNW_STACK_TRACE未定义问题

直接引用头文件#include <unwind.h>编译报错问题g++ -E test.cpp > test.i,发现加载的unwind.h文件路径不是/usr/include/unwind.hextern "C"{ 6 # 1 "/usr/local/lib/gcc/ia64-hp-hpux11.31/4.2.3/include/unwind.h" 1 3 ...

2018-12-27 14:16:06 643

原创 linux和hpux环境下程序崩溃堆栈打印

程序崩溃时打印堆栈信息,方便定位具体流程为:编译程序时生成map文件设置信号处理函数打印程序在系统中maps映射打印backtrace信息raise信号也可以使用libunwind第三方库实现,该库最初在商业版hpux中提供,现在Linux平台下也可使用。利用这些调试信息来达到堆栈展开或者栈回溯的目的,则是libunwind做的事情。当然libunwind能做的也不仅仅局限于...

2018-12-27 13:37:36 443

翻译 dpdk项目中使用c++编码

dpdk——使用c++编码替换$(RTE_SDK)/mk/toolchain/gcc/rte.vars.mk# BSD LICENSE## Copyright(c) 2010-2014 Intel Corporation. All rights reserved.# All rights reserved.## Redistribution and use in ...

2018-12-26 18:45:46 1410 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除