文档章节

TCP/IP协议详解卷2 第二章 mbuf:存储器缓存

卜星星
 卜星星
发布于 2015/02/13 17:56
字数 800
阅读 328
收藏 8
点赞 0
评论 2

看了一天第二章,感觉有些东西还是不太懂,在源码中有很多实现不太明白,我要一一的解开,希望懂的人看到

给点帮助,或者你也在学习中,可以留言交流一下。

先从m_devget这个函数开始:

/*
 * Routine to copy from device local memory into mbufs.
 */
/* 这个函数就是来数据了,分配mbuf来存这数据,
 * 一个存不下就两个,不行就分配簇 */
参数说明:
buf应该就是数据源的首地址,totlen是数据的总大小,off0就是数据偏移与首地址相较, 
copy就是自己提供复制的函数。  那个ifp就先不管了,是一个结构,我看了还挺多东西。
  
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 = ⊤ //    这里是为了用*mp和操作top
 register int off = off0, len;
 register char *cp;
 char *epkt;

 cp = buf;
    /* packet end的意思吧?
     * 反正就是指向buf中有效数据的最后 */
 epkt = cp + totlen;
    /* 这个off非0要2*u_int16_t其实没懂?
     * 那两个u_int16_t是type和length,但是谁的呢?*/
    /* 下面英文说是尾部封装,就要跳过,但跳过的是谁的? */
 if (off) {
  /*
   * If 'off' is non-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;
    /* 这个应该是100,MHLEN=MLEN-sizeof(struct pkthdr):108-8, 
     * MLEN=MSIZE-sizoef(struct m_hdr):128-20*/
 m->m_len = MHLEN; //这里带pkthdr所以是100  
 while (totlen > 0) {
  if (top) { 
/* 这里的意思就是top已经指向一个mbuf了,并且还循环回来了, 
说明还有元素没存下,再分配个mbuf,但这个不用带pkthdr了*/
   MGET(m, M_DONTWAIT, MT_DATA);
   if (m == 0) {
    m_freem(top);
    return (0);
   }
   m->m_len = MLEN;//不带pkthdr所以这里就成MLEN了,108
  }
        /* 这里为什么呢,不是就是相等的吗? */
  len = min(totlen, epkt - cp);
        /* MINCLSIZE=MHLEN+MLEN:100+108,最小簇大小,
         * 这里应该就是书里说的那处问题,其实是两个mbuf是可以
         * 存208个数据的100+108,但是这里用了>=所以就不行了*/
  if (len >= MINCLSIZE) {
            /* MCLGET这是分配一块簇给m */
   MCLGET(m, M_DONTWAIT);
   if (m->m_flags & M_EXT)
                /* MCLBYTES应该是那个1024或者2048那个值 */
    m->m_len = len = min(len, MCLBYTES);
   else
    len = m->m_len;
  } else {
   /*
    * Place initial small packet/header at end of mbuf.
    */
   if (len < m->m_len) {
                /* max_linkhdr是全局变量在mbuf.h中 */
    if (top == 0 && len + max_linkhdr <= m->m_len)
     m->m_data += max_linkhdr;
    m->m_len = len;
   } else
    len = m->m_len;
  }
  if (copy)
            /* 说实话,就这些复制函数真是乱,这都是源在前,目标在后,
             * 现在用的memcpy都是目标在前,源在后,其实真应该有
             * 好好规范,虽然现在都在规范着,乱*/
   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;
 }
    /* 这是我第一次看,但是我不明白这返回top是干什么,
     * 明明没有给top赋值的操作? */
    /* 哦,看到了,是在mp = &top,这时候*mp的操作已经
     * 是对top的操作了 */
 return (top);
}





© 著作权归作者所有

共有 人打赏支持
卜星星
粉丝 25
博文 110
码字总数 68736
作品 0
海淀
程序员
加载中

评论(2)

卜星星
卜星星

引用来自“Qdujunjie”的评论

看这东西有屁用?
求给个建议
Qdujunjie
Qdujunjie
看这东西有屁用?
《TCP/IP详解.卷1:协议》读书笔记

从大学的时候就听余老师介绍过stevens这三卷书,还听说最后一卷没写完作者就去世了,工作后也一直听人谈起, 但还是没去真正读它。最近因为工作上很多涉及到网络,捉包,各种tcpdump的使用,...

suit ⋅ 2014/10/21 ⋅ 0

《TCP IP详解卷1:协议 》原书第2版下载

本书是《TCP/IP详解》第1卷的第2版,主要讲述TCP/IP协议,结合大量实例讲述TCP/IP协议族的定义原因,以及在各种不同的操作系统中的应用及工作方式。第2版在保留Stevens卓越的知识体系和写作风...

ddddd8 ⋅ 2017/12/15 ⋅ 0

TCP/IP协议详解卷2 第4章 以太网

这一章说是要介绍:以太网设备驱动程序在初始化后是如何接收和传输帧的;还有配置网络通用ioctl。 在ifnet中有7个函数: 这7个函数就是用来调用驱动程序的。不同设备都有不同的驱动函数,比如...

卜星星 ⋅ 2015/03/02 ⋅ 0

计算机职业目标

硬件: 电子(元器件、电路板) 处理器、存储器 、I/O接口与外设 嵌入式系统(linux/android) 软件: 1. 操作系统:linux 2. 游戏编程 本地:A 字符/shell界面 B GUI界面 网络 : A-字符/sh...

krircc ⋅ 2015/03/30 ⋅ 0

Linux网络编程书籍

计算机网络知识 讲述计算机网络的最经典的当属Andrew S.Tanenbaum的《计算机网络》第五版,这本书难易适中。 目前已经是第五版,本书作者80年代就开发出MINIX,是一个用于操作系统教学的类U...

krircc ⋅ 2015/04/01 ⋅ 0

APR协议分组格式的字段解释

在看《TCP/IP详解 卷1》的第四章APR协议的时候,看到APR请求和应答分组格式里的字段如下图: 其中前两个字段和倒数第4个字段,倒数第2个字段有什么区别吗? 这本书里的解释我没有看明白,解释...

xinspace ⋅ 2013/04/10 ⋅ 1

Linux网络编程必看书籍推荐

首先要说讲述TCP/IP的书很多,其中有3泰书很全。 分别是《TCP/IP详解》三卷本,《用TCP/IP进行网际互连》三卷本,《TCP/IP指南》+《IPv6》四卷本 其中TCP/IP详解的作者还写了另外2本经典著作...

晨曦之光 ⋅ 2012/03/09 ⋅ 0

Linux网络编程必看书籍推荐

首先要说讲述TCP/IP的书很多,其中有3泰书很全。 分别是《TCP/IP详解》三卷本,《用TCP/IP进行网际互连》三卷本,《TCP/IP指南》+《IPv6》四卷本 其中TCP/IP详解的作者还写了另外2本经典著作...

晨曦之光 ⋅ 2012/03/09 ⋅ 0

TCP/IP协议详解第2卷 第3章 接口层

这章就是从ifnet来说起的,每个网络设备都有一个自己的ifnet结构,这个结构里有ifaddr链表,也就是每个接口的 所有地址,可以是一个,也可以是多个形成的链表。然后下面有一个ifqueue这就是指...

卜星星 ⋅ 2015/03/02 ⋅ 0

笔记一

第一章 1.1 云计算的核心思想是:通过云技术将大量网络中互联的计算资源统一管理和调度,构成一个计算资源池向用户提供按需服务。 两本经典书籍:《用TCP/IP进行网际互连》《TCP/IP 详解》 ...

Iammalt ⋅ 2017/09/13 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Mahout推荐算法API详解

前言 用Mahout来构建推荐系统,是一件既简单又困难的事情。简单是因为Mahout完整地封装了“协同过滤”算法,并实现了并行化,提供非常简单的API接口;困难是因为我们不了解算法细节,很难去根...

xiaomin0322 ⋅ 23分钟前 ⋅ 0

WampServer默认web服务器根目录位置

安装WampServer之后的web服务器根目录默认位置在WampServer安装目录下的www:

临江仙卜算子 ⋅ 24分钟前 ⋅ 0

Redux的一些手法记录

Redux Redux的基本概念见另一篇文。 这里记录一下Redux在项目中的实际操作的手法。 actions 首先定义action.js,actions的type,可以另起一个action-type.js文件。 action-type.js用来存...

LinearLaw ⋅ 25分钟前 ⋅ 0

android 手势检测(左右滑动、上下滑动)

GestureDetector类可以让我们快速的处理手势事件,如点击,滑动等。 使用GestureDetector分三步: 1. 定义GestureDetector类 2. 初始化手势类,同时设置手势监听 3. 将touch事件交给gesture...

王先森oO ⋅ 39分钟前 ⋅ 0

java 方法的执行时间监控 设置超时(Future 接口)

java 方法的执行时间监控 设置超时(Future 接口) import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.Executor......

青峰Jun19er ⋅ 44分钟前 ⋅ 0

一名开源小白的Apache成长自述

今天收到了来自Apache Vote我成为Serviceomb项目Committer的邮件,代表自己的贡献得到了充分的肯定;除了感谢团队的给力支持,我更希望将自己的成长经历——如何践行Apache Way的心得介绍给大...

微服务框架 ⋅ 46分钟前 ⋅ 0

vim介绍、颜色显示和移动光标、一般模式下复制、剪切和粘贴

1.vim 是 vi 的升级版 vim 是带有颜色显示的 mini安装的系统,一般都不带有vim [root@aminglinux-128 ~]# yum install -y vim-enhanced已加载插件:fastestmirror, langpacksLoading mir...

oschina130111 ⋅ 46分钟前 ⋅ 0

Deepin 操作系统四面楚歌

作为国内做的最好的 Linux 发行版,源自 Debian sid 的 Deepin 目前正面临重重困境,新版本不断延期,开发人员离职,bug 长期得不到修复,和 Debian/Ubuntu 的兼容性问题也面临越来越严重的挑...

六库科技 ⋅ 47分钟前 ⋅ 0

MyBatis之动态sql

我们需要知道的是,使用mybatis重点是对sql的灵活解析和处理。在原先的UserMappser.xml中,我们这样查询表中满足条件的记录 : 123 <select id="findUserList" parameterType="userQuery...

瑟青豆 ⋅ 47分钟前 ⋅ 0

这届俄罗斯世界杯的冷门那么多怎么办?

最纯粹的世界杯,最神奇的大冷门。 德国0比1被墨西哥摩擦了。 日本历史性的赢了哥伦比亚。 C罗也挑平了西班牙。 梅西被冰岛狮吼吼愣神了。 就连11次进世界杯4强的巴西也被瑞士逼平了。 天台已...

开源中国众包平台 ⋅ 48分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部