Netmap分析(四)
2016-04-23 10:42
253 查看
netmap.c
NIOCGINFO
用于返回netmap的基本信息case NIOCGINFO: /* return capabilities etc */ if (nmr->nr_cmd == NETMAP_BDG_LIST) { error = netmap_bdg_ctl(nmr, NULL); break; } NMG_LOCK(); do { /* memsize is always valid */ struct netmap_mem_d *nmd = &nm_mem; u_int memflags; if (nmr->nr_name[0] != '\0') { /* get a refcount */ /* 通过nmr得到attach到网卡结构的netmap结构体(netmap adapter) */ error = netmap_get_na(nmr, &na, &ifp, 1 /* create */); if (error) { na = NULL; ifp = NULL; break; } nmd = na->nm_mem; /* get memory allocator */ } error = netmap_mem_get_info(nmd, &nmr->nr_memsize, &memflags, &nmr->nr_arg2); if (error) break; if (na == NULL) /* only memory info */ break; nmr->nr_offset = 0; nmr->nr_rx_slots = nmr->nr_tx_slots = 0; netmap_update_config(na); /* 得到ring的个数,以及每个ring有多少slot */ nmr->nr_rx_rings = na->num_rx_rings; nmr->nr_tx_rings = na->num_tx_rings; nmr->nr_rx_slots = na->num_rx_desc; nmr->nr_tx_slots = na->num_tx_desc; } while (0); netmap_unget_na(na, ifp); NMG_UNLOCK(); break;
netmap.c
NIOCREGIF将特定的网卡设置为netmap模式
case NIOCREGIF: /* possibly attach/detach NIC and VALE switch */ i = nmr->nr_cmd; if (i == NETMAP_BDG_ATTACH || i == NETMAP_BDG_DETACH || i == NETMAP_BDG_VNET_HDR || i == NETMAP_BDG_NEWIF || i == NETMAP_BDG_DELIF || i == NETMAP_BDG_POLLING_ON || i == NETMAP_BDG_POLLING_OFF) { /* 处理附加网卡、分离网卡、设置netmap adapter、新建虚拟端口、删除虚拟端口、打开polling kthread、关闭polling kthread */ error = netmap_bdg_ctl(nmr, NULL); break; } else if (i == NETMAP_PT_HOST_CREATE || i == NETMAP_PT_HOST_DELETE) { /* 打开netmap kthread、关闭netmap kthread */ error = ptnetmap_ctl(nmr, priv->np_na); break; } else if (i == NETMAP_VNET_HDR_GET) { struct ifnet *ifp; NMG_LOCK(); /* 通过nmr得到attach到网卡结构的netmap结构体(netmap adapter) */ error = netmap_get_na(nmr, &na, &ifp, 0); if (na && !error) { nmr->nr_arg1 = na->virt_hdr_len; } netmap_unget_na(na, ifp); NMG_UNLOCK(); break; } else if (i != 0) { D("nr_cmd must be 0 not %d", i); error = EINVAL; break; } /* protect access to priv from concurrent NIOCREGIF */ NMG_LOCK(); do { u_int memflags; struct ifnet *ifp; if (priv->np_nifp != NULL) { /* thread already registered */ error = EBUSY; break; } /* find the interface and a reference */ /* 通过nmr得到attach到网卡结构的netmap结构体(netmap adapter) */ error = netmap_get_na(nmr, &na, &ifp, 1 /* create */); /* keep reference */ if (error) break; if (NETMAP_OWNED_BY_KERN(na)) { netmap_unget_na(na, ifp); error = EBUSY; break; } if (na->virt_hdr_len && !(nmr->nr_flags & NR_ACCEPT_VNET_HDR)) { netmap_unget_na(na, ifp); error = EIO; break; } error = netmap_do_regif(priv, na, nmr->nr_ringid, nmr->nr_flags); if (error) { /* reg. failed, release priv and ref */ netmap_unget_na(na, ifp); break; } nifp = priv->np_nifp; priv->np_td = td; // XXX kqueue, debugging only /* return the offset of the netmap_if object */ nmr->nr_rx_rings = na->num_rx_rings; nmr->nr_tx_rings = na->num_tx_rings; nmr->nr_rx_slots = na->num_rx_desc; nmr->nr_tx_slots = na->num_tx_desc; error = netmap_mem_get_info(na->nm_mem, &nmr->nr_memsize, &memflags, &nmr->nr_arg2); if (error) { netmap_do_unregif(priv); netmap_unget_na(na, ifp); break; } if (memflags & NETMAP_MEM_PRIVATE) { *(uint32_t *)(uintptr_t)&nifp->ni_flags |= NI_PRIV_MEM; } for_rx_tx(t) { priv->np_si[t] = nm_si_user(priv, t) ? &na->si[t] : &NMR(na, t)[priv->np_qfirst[t]].si; } if (nmr->nr_arg3) { D("requested %d extra buffers", nmr->nr_arg3); nmr->nr_arg3 = netmap_extra_alloc(na, &nifp->ni_bufs_head, nmr->nr_arg3); D("got %d extra buffers", nmr->nr_arg3); } nmr->nr_offset = netmap_mem_if_offset(na->nm_mem, nifp); /* store ifp reference so that priv destructor may release it */ priv->np_ifp = ifp; } while (0); NMG_UNLOCK(); break;
相关文章推荐
- java常量池技术
- Java千百问_05面向对象(010)_java中重载和覆盖有什么关系
- 机器学习-周志华
- Mysql介绍
- Masonry适配——(1)使用注意事项
- XMPP协议解析
- 一款新颖实用的安防产品--丁盯智能门磁
- sql server存储过程 以及几个常用案例
- PostgreSQL之序列使用
- async & await (转载)
- 最长公共子序列(LCS问题)的DP解法
- 为什么用BufferedWriter将int型写入文件后是乱码-Java/Eclipse
- BestCoder Round #81 (div.2)
- SCCM 2012远程控制
- The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
- 盘点淘宝、腾讯、百度内部使用的JavaScript库
- 第五篇:R语言数据可视化之散点图
- Git 配置和仓库获取
- NYOJ 202 红黑树 旋转不影响中序遍历 代码带解释
- vim补全