免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4115 | 回复: 2
打印 上一主题 下一主题

[NetBSD] m_devget函数中的一个问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-05-09 11:04 |只看该作者 |倒序浏览
我现在在看tcp/ip详解2,有个问题想问:在函数m_devget中其中的一个变量top,我无法理解该变量是如何被赋值的?
m_devget函数代码:
struct mbuf *
m_devget(buf, totlen, off0, ifp, copy)
        char *buf;
        int totlen, off0;
        struct ifnet *ifp;
        void (*copy)();
{
        register struct mbuf *m;
        struct mbuf *top = 0, **mp = ⊤
        register int off = off0, len;
        register char *cp;
        char *epkt;

        cp = buf;
        epkt = cp + totlen;
        if (off) {
                /*
                 * If parameter(参数) 'off' is non-zero(is not zero), packet is trailer-encapsulated(跟踪压缩),
                 * so we have to skip(跳过) the type and length fields.
                 */
                cp += off + 2 * sizeof(u_int16_t);
                totlen -= 2 * sizeof(u_int16_t);
        }
        MGETHDR(m, M_DONTWAIT, MT_DATA);
        if (m == 0)
                return (0);
        m->m_pkthdr.rcvif = ifp;
        m->m_pkthdr.len = totlen;
        m->m_len = MHLEN;

        while (totlen > 0) {
                if (top) {
                        //MGET:allocates an mbuf and initializes it to contain internal data
                        MGET(m, M_DONTWAIT, MT_DATA);
                        if (m == 0) {
                                m_freem(top);
                                return (0);
                        }
                        m->m_len = MLEN;
                }
                len = min(totlen, epkt - cp);
                if (len >= MINCLSIZE) {        //数据长度大于或等于MINCLSIZE(20
                        MCLGET(m, M_DONTWAIT);        //分配一个簇
                        if (m->m_flags & M_EXT)
                                m->m_len = len = min(len, MCLBYTES);
                        else
                                len = m->m_len;
                } else {        //数据长度小于MINCLSIZE(20
                        /*
                         * Place initial small packet/header at end of mbuf.
                         */
                        if (len < m->m_len) { //第一种情况:0<数据长度<84
                                if (top == 0 && len + max_linkhdr <= m->m_len)
                                        m->m_data += max_linkhdr; //保留16个字节的空间
                                m->m_len = len;        //len = totlen
                        } else
                                len = m->m_len;
                }
                if (copy)
                        copy(cp, mtod(m, caddr_t), (unsigned)len);
                else
                        bcopy(cp, mtod(m, caddr_t), (unsigned)len);
                cp += len;
                *mp = m;
                mp = &m->m_next;
                totlen -= len;
                if (cp == epkt)
                        cp = buf;
        }
        return (top);
}

请求帮助,告诉我top如何被赋值!

论坛徽章:
0
2 [报告]
发表于 2007-05-09 12:44 |只看该作者

  1. cp += len;
  2. *mp = m;
  3. mp = &m->m_next;
复制代码



应该是中间那行代码!

程序开头定义 mp 是指向 top 的指针,*mp =  m 相当于 top = m

[ 本帖最后由 杜比环绕声 于 2007-5-9 12:51 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2007-05-09 13:41 |只看该作者

多谢

有些眉目啦,就是感觉很拗
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP