A-A+

Netmap分析(四)

2018年12月14日 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;
 
 

 

标签:

给我留言

Copyright © 九毛的官方博客 保留所有权利.   Theme  Ality

用户登录