Module Name:    src
Committed By:   palle
Date:           Sat Mar 13 20:21:37 UTC 2021

Modified Files:
        src/sys/arch/sparc64/dev: vnet.c

Log Message:
sun4v: vnet - reception and transmission of eternet frames seems to work now 
(it is possible to ping 8.8.8.8 from inside a sun4v ldom). Still cleanup of 
debug code to be done.


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/sparc64/dev/vnet.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/sparc64/dev/vnet.c
diff -u src/sys/arch/sparc64/dev/vnet.c:1.3 src/sys/arch/sparc64/dev/vnet.c:1.4
--- src/sys/arch/sparc64/dev/vnet.c:1.3	Thu Mar 11 19:34:11 2021
+++ src/sys/arch/sparc64/dev/vnet.c	Sat Mar 13 20:21:37 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: vnet.c,v 1.3 2021/03/11 19:34:11 palle Exp $	*/
+/*	$NetBSD: vnet.c,v 1.4 2021/03/13 20:21:37 palle Exp $	*/
 /*	$OpenBSD: vnet.c,v 1.62 2020/07/10 13:26:36 patrick Exp $	*/
 /*
  * Copyright (c) 2009, 2015 Mark Kettenis
@@ -221,6 +221,7 @@ void	vnet_rx_vio_ver_info(struct vnet_so
 void	vnet_rx_vio_attr_info(struct vnet_softc *, struct vio_msg_tag *);
 void	vnet_rx_vio_dring_reg(struct vnet_softc *, struct vio_msg_tag *);
 void	vnet_rx_vio_rdx(struct vnet_softc *sc, struct vio_msg_tag *);
+void	vnet_rx_vio_mcast_info(struct vnet_softc *sc, struct vio_msg_tag *);
 void	vnet_rx_vio_data(struct vnet_softc *sc, struct vio_msg *);
 void	vnet_rx_vio_desc_data(struct vnet_softc *sc, struct vio_msg_tag *);
 void	vnet_rx_vio_dring_data(struct vnet_softc *sc, struct vio_msg_tag *);
@@ -655,9 +656,15 @@ vnet_rx_vio_ctrl(struct vnet_softc *sc, 
 	case VIO_RDX:
 		vnet_rx_vio_rdx(sc, tag);
 		break;
+	case VNET_MCAST_INFO:
+		vnet_rx_vio_mcast_info(sc, tag);
+		break;
 	default:
 		printf("%s: CTRL/0x%02x/0x%04x FIXME\n",
 				 __func__, tag->stype, tag->stype_env);
+#if 0
+		Debugger();
+#endif		
 		break;
 	}
 }
@@ -739,7 +746,9 @@ vnet_rx_vio_attr_info(struct vnet_softc 
 		DPRINTF(("CTRL/INFO/ATTR_INFO\n"));
 #endif		
 		sc->sc_xfer_mode = ai->xfer_mode;
+#if 0		
 		DPRINTF(("sc_xfer_mode %d\n", sc->sc_xfer_mode));
+#endif		
 
 		ai->tag.stype = VIO_SUBTYPE_ACK;
 		ai->tag.sid = sc->sc_local_sid;
@@ -893,6 +902,40 @@ FIXME openbsd	
 }
 
 void
+vnet_rx_vio_mcast_info(struct vnet_softc *sc, struct vio_msg_tag *tag)
+{
+#if 0
+	DPRINTF(("%s: entry\n", __func__));
+#endif	
+
+	switch(tag->stype) {
+			
+		case VIO_SUBTYPE_INFO:
+#if 0
+			DPRINTF(("CTRL/INFO/MCAST_INFO\n"));
+#endif		
+			break;
+
+		case VIO_SUBTYPE_ACK:
+#if 0			
+			DPRINTF(("CTRL/ACK/MCAST_INFO\n"));
+#endif		
+			break;
+
+		case VIO_SUBTYPE_NACK:
+#if 0			
+			DPRINTF(("CTRL/NACK/MCAST_INFO\n"));
+#endif		
+			break;
+			
+		default:
+			printf("%s: CTRL/0x%02x/0x%04x\n",
+				   __func__, tag->stype, tag->stype_env);
+			break;
+	}
+}
+
+void
 vnet_rx_vio_data(struct vnet_softc *sc, struct vio_msg *vm)
 {
 #if 0
@@ -1077,7 +1120,7 @@ FIXME openbsd		
 	switch(tag->stype) {
 	case VIO_SUBTYPE_INFO:
 	{
-#if 0			
+#if 0
 		DPRINTF(("%s: VIO_SUBTYPE_INFO\n", __func__));
 #endif		
 		struct vnet_desc desc;
@@ -1148,9 +1191,9 @@ FIXME openbsd			
 			m->m_len = m->m_pkthdr.len = desc.nbytes;
 #endif			
 			nbytes = roundup(desc.nbytes + VNET_ETHER_ALIGN, 8);
-#if 1
-			DPRINTF(("%s: nbytes %" PRId64 " desc.nbytes %" PRId32 "\n",
-					 __func__, nbytes, desc.nbytes));
+#if 0
+			DPRINTF(("%s: RX frame size %" PRId16 "\n",
+					 __func__, (int)nbytes));
 			uint8_t buf[ETHER_MAX_LEN];
 			pmap_extract(pmap_kernel(), (vaddr_t)buf, &pa);
 			err = hv_ldc_copy(lc->lc_id, LDC_COPY_IN,
@@ -1161,11 +1204,12 @@ FIXME openbsd			
 			}
 			for (int i = 0; i < desc.nbytes; i++) {
 					if (i % 16 == 0) {
-						printf("\n");
+						DPRINTF(("\n"));
 					}
-					printf("%02x ", buf[i]);
+					DPRINTF(("%02x ", buf[i]));
 			}
-			printf("\n");
+			DPRINTF(("\n"));
+			DPRINTF(("\n"));
 #endif			
 #if 1
 			pmap_extract(pmap_kernel(), (vaddr_t)m->m_data, &pa);
@@ -1176,6 +1220,7 @@ FIXME openbsd			
 				goto skip;
 			}
 			m->m_data += VNET_ETHER_ALIGN;
+			m_set_rcvif(m, ifp);
 
 #if 0
 FIXME openbsd		
@@ -1224,7 +1269,7 @@ FIXME openbd		
 
 	case VIO_SUBTYPE_ACK:
 	{
-#if 0			
+#if 0
 		DPRINTF(("%s: VIO_SUBTYPE_ACK\n", __func__));
 #endif		
 		struct ldc_map *map = sc->sc_lm;
@@ -1399,6 +1444,12 @@ vnet_send_attr_info(struct vnet_softc *s
 		ai.addr |= sc->sc_macaddr[i];
 	}
 	ai.mtu = ETHER_MAX_LEN - ETHER_CRC_LEN;
+#if 0
+	DPRINTF(("%s: ai.addr %" PRIx64 "\n",
+			 __func__, ai.addr));
+	DPRINTF(("%s: ai.mtu %" PRId64 "\n",
+			 __func__, ai.mtu));
+#endif	
 	vnet_sendmsg(sc, &ai, sizeof(ai));
 
 	sc->sc_vio_state |= VIO_SND_ATTR_INFO;
@@ -1407,7 +1458,7 @@ vnet_send_attr_info(struct vnet_softc *s
 void
 vnet_send_dring_reg(struct vnet_softc *sc)
 {
-#if 1
+#if 0
 	DPRINTF(("%s: entry\n", __func__));
 #endif	
 	
@@ -1433,7 +1484,7 @@ vnet_send_dring_reg(struct vnet_softc *s
 void
 vio_send_rdx(struct vnet_softc *sc)
 {
-#if 1
+#if 0
 	DPRINTF(("%s: entry\n", __func__));
 #endif	
 	struct vio_msg_tag tag;
@@ -1457,8 +1508,10 @@ vnet_send_dring_data(struct vnet_softc *
 	u_int peer_state;
 
 	peer_state = atomic_swap_uint(&sc->sc_peer_state, VIO_DP_ACTIVE);
-	if (peer_state == VIO_DP_ACTIVE)
+	if (peer_state == VIO_DP_ACTIVE) {
+		DPRINTF(("%s: peer_state == VIO_DP_ACTIVE\n", __func__));
 		return;
+	}
 
 	bzero(&dm, sizeof(dm));
 	dm.tag.type = VIO_TYPE_DATA;
@@ -1466,10 +1519,17 @@ vnet_send_dring_data(struct vnet_softc *
 	dm.tag.stype_env = VIO_DRING_DATA;
 	dm.tag.sid = sc->sc_local_sid;
 	dm.seq_no = sc->sc_seq_no++;
+#if 0
+	DPRINTF(("%s: dm.seq_no %" PRId64 "\n",
+			 __func__, dm.seq_no));
+#endif	
 	dm.dring_ident = sc->sc_dring_ident;
 	dm.start_idx = start_idx;
 	dm.end_idx = -1;
 	vnet_sendmsg(sc, &dm, sizeof(dm));
+#if 0
+	DPRINTF(("%s: exit\n", __func__));
+#endif	
 }
  
 void
@@ -1515,6 +1575,10 @@ FIXME openbsd 
 		DPRINTF(("%s: queue is empty\n", __func__));
 #endif		
 		return;
+	} else {
+#if 0			
+		DPRINTF(("%s: queue size %d\n", __func__, ifp->if_snd.ifq_len));
+#endif		
 	}
 
 	/*
@@ -1524,7 +1588,7 @@ FIXME openbsd 
 	if (!ISSET(sc->sc_vio_state, VIO_RCV_RDX) ||
 	    !ISSET(sc->sc_vio_state, VIO_ACK_RDX))
 	{
-#if 0			
+#if 0
 		DPRINTF(("%s: vio connection not established yet\n", __func__));
 #endif		
 		return;
@@ -1563,8 +1627,12 @@ FIXME openbsd			
 	start = prod = sc->sc_tx_prod & (sc->sc_vd->vd_nentries - 1);
 	while (sc->sc_vd->vd_desc[prod].hdr.dstate == VIO_DESC_FREE) {
 		count = sc->sc_tx_prod - sc->sc_tx_cons;
+#if 0		
+		DPRINTF(("%s: count %d\n", __func__, count));
+#endif		
 		if (count >= (sc->sc_vd->vd_nentries - 1) ||
 		    map->lm_count >= map->lm_nentries) {
+			DPRINTF(("%s: count issue\n", __func__));
 #if 0
 FIXME openbsd
 			ifq_set_oactive(&ifp->if_snd);
@@ -1576,6 +1644,7 @@ FIXME openbsd
 
 		buf = pool_get(&sc->sc_pool, PR_NOWAIT|PR_ZERO);
 		if (buf == NULL) {
+			DPRINTF(("%s: buff is NULL\n", __func__));
 #if 0
 FIXME openbsd				
 			ifq_set_oactive(&ifp->if_snd);
@@ -1591,21 +1660,53 @@ FIXME openbsd				
 		IFQ_DEQUEUE(&ifp->if_snd, m);
 #endif 
 		if (m == NULL) {
+#if 0				
+			DPRINTF(("%s: m is NULL\n", __func__));
+#endif			
 			pool_put(&sc->sc_pool, buf);
 			break;
+		} else {
+#if 0				
+			DPRINTF(("%s: m is not NULL\n", __func__));
+#endif			
 		}
 
+#if 1
 		m_copydata(m, 0, m->m_pkthdr.len, buf + VNET_ETHER_ALIGN);
-
+#if 0		
+		DPRINTF(("%s: TX frame size %" PRId16 "\n",
+				 __func__, m->m_pkthdr.len));
+		for (int i = 0; i < m->m_pkthdr.len; i++) {
+			if (i % 16 == 0) {
+				DPRINTF(("\n"));
+			}
+			DPRINTF(("%02x ", buf[VNET_ETHER_ALIGN+i]));
+		}
+		DPRINTF(("\n"));
+#endif		
+#else
+		m_copydata(m, 0, m->m_pkthdr.len, buf);
+		DPRINTF(("%s: TX frame size %" PRId16 "\n",
+				 __func__, m->m_pkthdr.len));
+		for (int i = 0; i < m->m_pkthdr.len; i++) {
+			if (i % 16 == 0) {
+				DPRINTF(("\n"));
+			}
+			DPRINTF(("%02x ", buf[i]));
+		}
+		DPRINTF(("\n"));
+#endif		
 #if NBPFILTER > 0
 		/*
 		 * If BPF is listening on this interface, let it see the
 		 * packet before we commit it to the wire.
 		 */
 		if (ifp->if_bpf)
-				{
+		{
+			DPRINTF(("%s: before bpf\n", __func__));
 			bpf_mtap(ifp->if_bpf, m, BPF_DIRECTION_OUT);
-				}
+			DPRINTF(("%s: after bpf\n", __func__));
+		}
 #endif
 
 		pmap_extract(pmap_kernel(), (vaddr_t)buf, &pa);
@@ -1647,10 +1748,16 @@ FIXME openbsd		
 	membar_producer();
 
 	if (start != prod && sc->sc_peer_state != VIO_DP_ACTIVE) {
+#if 0			
+		DPRINTF(("%s: before vnet_send_dring_data()\n", __func__));
+#endif		
 		vnet_send_dring_data(sc, start);
 		ifp->if_timer = 5;
+	} else {
+		DPRINTF(("%s: no vnet_send_dring_data()\n", __func__));
 	}
-#if 0	
+			
+#if 0
 	DPRINTF(("%s: exit\n", __func__));
 #endif	
 }
@@ -1829,8 +1936,9 @@ vnet_watchdog(struct ifnet *ifp)
 int
 vnet_media_change(struct ifnet *ifp)
 {
-
+#if 0
 	DPRINTF(("%s: entry\n", __func__));
+#endif	
 	
 	return (0);
 }
@@ -1838,8 +1946,9 @@ vnet_media_change(struct ifnet *ifp)
 void
 vnet_media_status(struct ifnet *ifp, struct ifmediareq *imr)
 {
-
+#if 0
 	DPRINTF(("%s: entry\n", __func__));
+#endif	
 	
 	imr->ifm_active = IFM_ETHER | IFM_AUTO;
 	imr->ifm_status = IFM_AVALID;

Reply via email to