您的位置:首页 > 其它

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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: