-
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 && conn); //更新统计信息,判断是否dest是否可用,并且连接是否超过上限 if (dp_vs_stats_in(conn, mbuf)) { //重置定时器,减小conn引用计数 dp_vs_conn_put(conn); //返回drop,NET_INET_HOOK根据该结果丢弃数据报 return(INET_DROP); } /* is dest avaible to forward the packet ? */ if (!conn->dest) { /* silently drop packet without reset connection timer. * wait for dest available or connection timeout. */ //减小conn的引用计数,但不重置定时器 dp_vs_conn_put_no_reset(conn); //返回drop return(INET_DROP); } if (!conn->packet_xmit) { RTE_LOG(WARNING, IPVS, "%s: missing packet_xmit\\n", __func__); //重置定时器,减小conn引用计数 dp_vs_conn_put(conn); return(INET_ACCEPT); } /* forward to RS */ //调用packet_xmit接口将mbuf数据处理后发送到内部real server err = conn->packet_xmit(prot, conn, mbuf); if (err != EDPVS_OK) { RTE_LOG(DEBUG, IPVS, "%s: fail to transmit: %d\\n", __func__, err); } //减小conn引用计数 dp_vs_conn_put(conn); /* always stolen the packet */ //一般返回INET_STOLEN,DPVS工作在per_routing,一般的数据报不用继续上传至协议栈 return(INET_STOLEN); }
-
xmit_outbound
static int xmit_outbound(struct rte_mbuf *mbuf, struct dp_vs_proto *prot, struct dp_vs_conn *conn) { int err; assert(mbuf && prot && conn); //与inbound类似 if (dp_vs_stats_out(conn, mbuf)) { dp_vs_conn_put(conn); return(INET_DROP); } //如果outbound方向传输,并且不存在packet_out_xmit接口,递减conn的引用计数,返回ACCEPT,继续向协议栈上层投递 //DR和TUNNEL模式属于单臂模式,没有packet_out_xmit函数 if (!conn->packet_out_xmit) { RTE_LOG(WARNING, IPVS, "%s: missing out_xmit\\n", __func__); dp_vs_conn_put(conn); return(INET_ACCEPT); } //执行packet_out_xmit err = conn->packet_out_xmit(prot, conn, mbuf); if (err != EDPVS_OK) { RTE_LOG(DEBUG, IPVS, "%s: fail to out xmit: %d\\n", __func__, err); } //减小conn引用计数,重设定时器 dp_vs_conn_put(conn); /* always stolen the packet */ return(INET_STOLEN); }
dpvs xmit接口
最新推荐文章于 2024-02-29 09:16:30 发布