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 && 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);
    }
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值