Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 19 Aug 2009 03:06:22 GMT
From:      Gabor Pali <pgj@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 167491 for review
Message-ID:  <200908190306.n7J36M03066211@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=167491

Change 167491 by pgj@petymeg-current on 2009/08/19 03:06:13

	Add support for exporting IPv4 multicast forwarding table in
	a streamed manner via sysctl(3) [net.inet.ip.smfctable]

Affected files ...

.. //depot/projects/soc2009/pgj_libstat/src/sys/netinet/ip_mroute.c#5 edit
.. //depot/projects/soc2009/pgj_libstat/src/sys/netinet/ip_mroute.h#4 edit

Differences ...

==== //depot/projects/soc2009/pgj_libstat/src/sys/netinet/ip_mroute.c#5 (text+ko) ====

@@ -859,6 +859,73 @@
     0, 0, export_viftable, "s,struct vif_data",
     "IPv4 Multicast Interfaces (streamed)");
 
+static int
+export_mfctable(SYSCTL_HANDLER_ARGS)
+{
+	struct mfc_stream ms;
+	struct mfc_data md;
+	struct sbuf sbuf;
+	int error, buflen;
+	char *buffer;
+	struct mfc *m;
+	u_int32_t i;
+
+	error = 0;
+	bzero(&ms, sizeof(ms));
+	ms.ms_version = MFC_STREAM_VERSION;
+
+	MFC_LOCK();
+
+	/* Count entries. */
+	ms.ms_count = 0;
+
+	if (mfchashtbl != NULL)
+	for (i = 0; i < mfchashsize; i++) {
+		LIST_FOREACH(m, &mfchashtbl[i], mfc_hash)
+			ms.ms_count++;
+	}
+
+	buflen = sizeof(ms) + ms.ms_count * sizeof(md) + 1;
+	buffer = malloc(buflen, M_TEMP, M_WAITOK | M_ZERO);
+	sbuf_new(&sbuf, buffer, buflen, SBUF_FIXEDLEN);
+
+	if (sbuf_bcat(&sbuf, &ms, sizeof(ms)) < 0) {
+		error = ENOMEM;
+		goto out;
+	}
+
+	if (mfchashtbl != NULL)
+	for (i = 0; i < mfchashsize; i++) {
+		LIST_FOREACH(m, &mfchashtbl[i], mfc_hash) {
+			bzero(&md, sizeof(md));
+			md.md_origin = m->mfc_origin.s_addr;
+			md.md_mcastgrp = m->mfc_mcastgrp.s_addr;
+			md.md_pkt_cnt = m->mfc_pkt_cnt;
+			md.md_byte_cnt = m->mfc_byte_cnt;
+			md.md_nstall = m->mfc_nstall;
+			md.md_parent = m->mfc_parent;
+			bcopy(m->mfc_ttls, md.md_ttls, sizeof(md.md_ttls));
+
+			if (sbuf_bcat(&sbuf, &md, sizeof(md)) < 0) {
+				error = ENOMEM;
+				goto out;
+			}
+		}
+	}
+
+	MFC_UNLOCK();
+
+	sbuf_finish(&sbuf);
+	error = SYSCTL_OUT(req, sbuf_data(&sbuf), sbuf_len(&sbuf));
+out:
+	free(buffer, M_TEMP);
+	return (error);
+}
+
+SYSCTL_PROC(_net_inet_ip, OID_AUTO, smfctable, CTLFLAG_RD|CTLTYPE_STRUCT,
+    0, 0, export_mfctable, "s,struct mfc_data",
+    "IPv4 Multicast Forwarding Table (streamed)");
+
 /*
  * Set PIM assert processing global
  */

==== //depot/projects/soc2009/pgj_libstat/src/sys/netinet/ip_mroute.h#4 (text+ko) ====

@@ -313,6 +313,24 @@
 };
 #endif /* _KERNEL */
 
+#define MFC_STREAM_VERSION  0x00000001
+
+struct mfc_stream {
+	u_int32_t   ms_version;
+	u_int32_t   ms_count;
+};
+
+struct mfc_data {
+	u_int32_t   md_origin;
+	u_int32_t   md_mcastgrp;
+	u_int64_t   md_pkt_cnt;
+	u_int64_t   md_byte_cnt;
+	u_int64_t   md_nstall;
+	u_int32_t   md_parent;
+	u_int8_t    md_ttls[32];
+	u_int8_t    _md_pad[60];
+};
+
 /*
  * Struct used to communicate from kernel to multicast router
  * note the convenient similarity to an IP packet



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200908190306.n7J36M03066211>