Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 1 Mar 2007 23:23:04 GMT
From:      Jung-uk Kim <jkim@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 115226 for review
Message-ID:  <200703012323.l21NN4sT027129@repoman.freebsd.org>

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

Change 115226 by jkim@jkim_hammer on 2007/03/01 23:22:46

	IFC (115225)

Affected files ...

.. //depot/projects/linuxolator/src/sys/netgraph/ng_source.c#2 integrate
.. //depot/projects/linuxolator/src/sys/netgraph/ng_source.h#2 integrate
.. //depot/projects/linuxolator/src/sys/ufs/ffs/ffs_vnops.c#8 integrate

Differences ...

==== //depot/projects/linuxolator/src/sys/netgraph/ng_source.c#2 (text+ko) ====

@@ -39,7 +39,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/netgraph/ng_source.c,v 1.27 2006/01/23 10:28:04 glebius Exp $");
+__FBSDID("$FreeBSD: src/sys/netgraph/ng_source.c,v 1.28 2007/03/01 23:16:17 emaste Exp $");
 
 /*
  * This node is used for high speed packet geneneration.  It queues
@@ -77,6 +77,8 @@
 #define NG_SOURCE_INTR_TICKS		1
 #define NG_SOURCE_DRIVER_IFQ_MAXLEN	(4*1024)
 
+#define	mtod_off(m,off,t)	((t)(mtod((m),caddr_t)+(off)))
+
 /* Per node info */
 struct privdata {
 	node_p				node;
@@ -88,6 +90,7 @@
 	struct callout			intr_ch;
 	uint64_t			packets;	/* packets to send */
 	uint32_t			queueOctets;
+	struct ng_source_embed_info	embed_timestamp;
 };
 typedef struct privdata *sc_p;
 
@@ -110,6 +113,10 @@
 static void		ng_source_stop (sc_p);
 static int		ng_source_send (sc_p, int, int *);
 static int		ng_source_store_output_ifp(sc_p, char *);
+static void		ng_source_packet_mod(sc_p, struct mbuf *,
+			    int, int, caddr_t, int);
+static int		ng_source_dup_mod(sc_p, struct mbuf *,
+			    struct mbuf **);
 
 /* Parse type for timeval */
 static const struct ng_parse_struct_field ng_source_timeval_type_fields[] = {
@@ -130,6 +137,14 @@
 	&ng_source_stats_type_fields
 };
 
+/* Parse type for struct ng_source_embed_info */
+static const struct ng_parse_struct_field ng_source_embed_type_fields[] =
+	NG_SOURCE_EMBED_TYPE_INFO;
+static const struct ng_parse_type ng_source_embed_type = {
+	&ng_parse_struct_type,
+	&ng_source_embed_type_fields
+};
+
 /* List of commands and how to convert arguments to/from ASCII */
 static const struct ng_cmdlist ng_source_cmds[] = {
 	{
@@ -188,6 +203,20 @@
 	  &ng_parse_uint32_type,
 	  NULL
 	},
+	{
+	  NGM_SOURCE_COOKIE,
+	  NGM_SOURCE_SET_TIMESTAMP,
+	  "settimestamp",
+	  &ng_source_embed_type,
+	  NULL
+	},
+	{
+	  NGM_SOURCE_COOKIE,
+	  NGM_SOURCE_GET_TIMESTAMP,
+	  "gettimestamp",
+	  NULL,
+	  &ng_source_embed_type
+	},
 	{ 0 }
 };
 
@@ -374,6 +403,29 @@
 
 			break;
 		    }
+		case NGM_SOURCE_SET_TIMESTAMP:
+		    {
+			struct ng_source_embed_info *embed;
+
+			embed = (struct ng_source_embed_info *)msg->data;
+			bcopy(embed, &sc->embed_timestamp, sizeof(*embed));
+
+			break;
+		    }
+		case NGM_SOURCE_GET_TIMESTAMP:
+		    {
+			struct ng_source_embed_info *embed;
+
+			NG_MKRESPONSE(resp, msg, sizeof(*embed), M_DONTWAIT);
+			if (resp == NULL) {
+				error = ENOMEM;
+				goto done;
+			}
+			embed = (struct ng_source_embed_info *)resp->data;
+			bcopy(&sc->embed_timestamp, embed, sizeof(*embed));
+
+			break;
+		    }
 		default:
 			error = EINVAL;
 			break;
@@ -662,11 +714,13 @@
 		if (m == NULL)
 			break;
 
-		/* Duplicate the packet. */
-		m2 = m_copypacket(m, M_DONTWAIT);
-		if (m2 == NULL) {
-			_IF_PREPEND(&sc->snd_queue, m);
-			error = ENOBUFS;
+		/* Duplicate and modify the packet. */
+		error = ng_source_dup_mod(sc, m, &m2);
+		if (error) {
+			if (error == ENOBUFS)
+				_IF_PREPEND(&sc->snd_queue, m);
+			else
+				_IF_ENQUEUE(&sc->snd_queue, m);
 			break;
 		}
 
@@ -685,3 +739,66 @@
 		*sent_p = sent;
 	return (error);
 }
+
+/*
+ * Modify packet in 'm' by changing 'len' bytes starting at 'offset'
+ * to data in 'cp'.
+ *
+ * The packet data in 'm' must be in a contiguous buffer in a single mbuf.
+ */
+static void
+ng_source_packet_mod(sc_p sc, struct mbuf *m, int offset, int len, caddr_t cp,
+    int flags)
+{
+	if (len == 0)
+		return;
+
+	/* Can't modify beyond end of packet. */
+	/* TODO: Pad packet for this case. */
+	if (offset + len > m->m_len)
+		return;
+
+	bcopy(cp, mtod_off(m, offset, caddr_t), len);
+}
+
+static int
+ng_source_dup_mod(sc_p sc, struct mbuf *m0, struct mbuf **m_ptr)
+{
+	struct mbuf *m;
+	struct ng_source_embed_info *ts;
+	int modify;
+	int error = 0;
+
+	/* Are we going to modify packets? */
+	modify = sc->embed_timestamp.flags & NGM_SOURCE_EMBED_ENABLE;
+
+	/* Duplicate the packet. */
+	if (modify)
+		m = m_dup(m0, M_DONTWAIT);
+	else
+		m = m_copypacket(m0, M_DONTWAIT);
+	if (m == NULL) {
+		error = ENOBUFS;
+		goto done;
+	}
+	*m_ptr = m;
+
+	if (!modify)
+		goto done;
+
+	/* Modify the copied packet for sending. */
+	KASSERT(M_WRITABLE(m), ("%s: packet not writable", __func__));
+
+	ts = &sc->embed_timestamp;
+	if (ts->flags & NGM_SOURCE_EMBED_ENABLE) {
+		struct timeval now;
+		getmicrotime(&now);
+		now.tv_sec = htonl(now.tv_sec);
+		now.tv_usec = htonl(now.tv_usec);
+		ng_source_packet_mod(sc, m, ts->offset, sizeof (now),
+		    (caddr_t)&now, ts->flags);
+	}
+
+done:
+	return(error);
+}

==== //depot/projects/linuxolator/src/sys/netgraph/ng_source.h#2 (text+ko) ====

@@ -36,7 +36,7 @@
  *
  * Author: Dave Chapeskie <dchapeskie@sandvine.com>
  *
- * $FreeBSD: src/sys/netgraph/ng_source.h,v 1.7 2005/12/23 19:14:38 glebius Exp $
+ * $FreeBSD: src/sys/netgraph/ng_source.h,v 1.8 2007/03/01 23:16:17 emaste Exp $
  */
 
 #ifndef _NETGRAPH_NG_SOURCE_H_
@@ -78,6 +78,21 @@
 	  { NULL }						\
 }
 
+/* Packet embedding info for NGM_SOURCE_GET/SET_TIMESTAMP */
+struct ng_source_embed_info {
+	uint16_t	offset;		/* offset from ethernet header */
+	uint8_t		flags;
+	uint8_t		spare;
+};
+#define NGM_SOURCE_EMBED_ENABLE		0x01	/* enable embedding */
+
+/* Keep this in sync with the above structure definition. */
+#define NG_SOURCE_EMBED_TYPE_INFO {				\
+	{ "offset",		&ng_parse_hint16_type	},	\
+	{ "flags",		&ng_parse_hint8_type	},	\
+	{ NULL }						\
+}
+
 /* Netgraph commands */
 enum {
 	NGM_SOURCE_GET_STATS = 1,	/* get stats */
@@ -88,6 +103,8 @@
 	NGM_SOURCE_CLR_DATA,		/* clear the queued data */
 	NGM_SOURCE_SETIFACE,		/* configure downstream iface */
 	NGM_SOURCE_SETPPS,		/* rate-limiting packets per second */
+	NGM_SOURCE_SET_TIMESTAMP,	/* embed xmit timestamp */
+	NGM_SOURCE_GET_TIMESTAMP,
 };
 
 #endif /* _NETGRAPH_NG_SOURCE_H_ */

==== //depot/projects/linuxolator/src/sys/ufs/ffs/ffs_vnops.c#8 (text+ko) ====

@@ -62,7 +62,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/ufs/ffs/ffs_vnops.c,v 1.167 2007/03/01 20:47:41 pjd Exp $");
+__FBSDID("$FreeBSD: src/sys/ufs/ffs/ffs_vnops.c,v 1.168 2007/03/01 23:14:46 pjd Exp $");
 
 #include <sys/param.h>
 #include <sys/bio.h>
@@ -1118,7 +1118,7 @@
 	 * tampering.
 	 */
 	if ((ip->i_mode & (ISUID | ISGID)) && resid > uio->uio_resid && ucred) {
-		if (priv_check_cred(ap->a_cred, PRIV_VFS_RETAINSUGID,
+		if (priv_check_cred(ucred, PRIV_VFS_RETAINSUGID,
 		    SUSER_ALLOWJAIL)) {
 			ip->i_mode &= ~(ISUID | ISGID);
 			dp->di_mode = ip->i_mode;



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