コード例 #1
0
/* common functions for the nm_register() callbacks of both kind of
 * monitors.
 */
static int
netmap_monitor_reg_common(struct netmap_adapter *na, int onoff, int zmon)
{
    struct netmap_monitor_adapter *mna =
        (struct netmap_monitor_adapter *)na;
    struct netmap_priv_d *priv = &mna->priv;
    struct netmap_adapter *pna = priv->np_na;
    struct netmap_kring *kring, *mkring;
    int i;
    enum txrx t;

    ND("%p: onoff %d", na, onoff);
    if (onoff) {
        if (pna == NULL) {
            /* parent left netmap mode, fatal */
            D("%s: internal error", na->name);
            return ENXIO;
        }
        for_rx_tx(t) {
            if (mna->flags & nm_txrx2flag(t)) {
                for (i = priv->np_qfirst[t]; i < priv->np_qlast[t]; i++) {
                    kring = &NMR(pna, t)[i];
                    mkring = &na->rx_rings[i];
                    netmap_monitor_add(mkring, kring, zmon);
                }
            }
        }
        na->na_flags |= NAF_NETMAP_ON;
    } else {
        if (pna == NULL) {
コード例 #2
0
ファイル: netmap_monitor.c プロジェクト: 2trill2spill/freebsd
/* common functions for the nm_register() callbacks of both kind of
 * monitors.
 */
static int
netmap_monitor_reg_common(struct netmap_adapter *na, int onoff, int zmon)
{
	struct netmap_monitor_adapter *mna =
		(struct netmap_monitor_adapter *)na;
	struct netmap_priv_d *priv = &mna->priv;
	struct netmap_adapter *pna = priv->np_na;
	struct netmap_kring *kring, *mkring;
	int i;
	enum txrx t, s;

	ND("%p: onoff %d", na, onoff);
	if (onoff) {
		if (pna == NULL) {
			/* parent left netmap mode, fatal */
			D("%s: internal error", na->name);
			return ENXIO;
		}
		for_rx_tx(t) {
			for (i = 0; i < nma_get_nrings(na, t) + 1; i++) {
				mkring = &NMR(na, t)[i];
				if (!nm_kring_pending_on(mkring))
					continue;
				mkring->nr_mode = NKR_NETMAP_ON;
				if (t == NR_TX)
					continue;
				for_rx_tx(s) {
					if (i > nma_get_nrings(pna, s))
						continue;
					if (mna->flags & nm_txrx2flag(s)) {
						kring = &NMR(pna, s)[i];
						netmap_monitor_add(mkring, kring, zmon);
					}
				}
			}
		}
		na->na_flags |= NAF_NETMAP_ON;
	} else {
		if (na->active_fds == 0)