Netmap分析(四)

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;





  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高晓伟_Steven

相逢即是有缘,动力源于金钱。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值