PERFORCE change 176159 for review

Ana Kukec anchie at FreeBSD.org
Sat Mar 27 04:40:19 UTC 2010


http://p4web.freebsd.org/chv.cgi?CH=176159

Change 176159 by anchie at anchie_malimis on 2010/03/27 04:40:16

	SEND now uses native SEND socket to send packets from Neighbor
	Discovery (ND) kernel stack to userland SEND application, and back from
	userland to the ND kernel stack. There are few lines of code missing
	to send the outgoing packet with the if_output() function to the wire.	

Affected files ...

.. //depot/projects/soc2009/anchie_send/send_0.2/sendd/net.c#27 edit
.. //depot/projects/soc2009/anchie_send/send_0.2/sendd/proto.c#12 edit
.. //depot/projects/soc2009/anchie_send/src/sys/kern/uipc_socket.c#6 edit
.. //depot/projects/soc2009/anchie_send/src/sys/netinet/in.h#5 edit
.. //depot/projects/soc2009/anchie_send/src/sys/netinet/ip_var.h#7 edit
.. //depot/projects/soc2009/anchie_send/src/sys/netinet/raw_ip.c#6 edit
.. //depot/projects/soc2009/anchie_send/src/sys/netinet6/icmp6.c#32 edit
.. //depot/projects/soc2009/anchie_send/src/sys/netinet6/send.c#34 edit
.. //depot/projects/soc2009/anchie_send/src/sys/netinet6/send.h#18 edit

Differences ...

==== //depot/projects/soc2009/anchie_send/send_0.2/sendd/net.c#27 (text+ko) ====

@@ -86,6 +86,7 @@
         u_char		rtm_type;
         int		rtm_seq;
 	int		in;
+	int		ifidx;
 };
 
 void snd_sock_read(struct snd_ifinfo *p);
@@ -143,21 +144,23 @@
 {
 	struct snd_packet_info *pi;
 	struct rt_msghdr *rtm;
+	struct snd_hdr *snd_hdr;
 
 	if (drop) {
 		snd_put_buf(b);
 		return;
 	}
+
 	pi = (struct snd_packet_info *)(b->head);
+
+#if 0
 	DBG(&dbg_snd, "Direction, %s", (pi->rtm_seq == RTM_SND_OUT) ? "SND_OUT" : "SND_IN");
 
 	/* buffer starts with IPv6 hdr, roll back to include rtm header */	
 	b->data -= sizeof (struct rt_msghdr);
 	b->len += sizeof (struct rt_msghdr);
-#if 0
-	b->data -= sizeof (struct if_announcemsghdr);
-	b->len += sizeof (struct if_announcemsghdr);
-#endif
+	//b->data -= sizeof (struct if_announcemsghdr);
+	//b->len += sizeof (struct if_announcemsghdr);
 
 	DBG(&dbg_snd, "%d bytes on %s", b->len, pi->ifinfo->name);
 
@@ -181,7 +184,21 @@
 		snd_put_buf(b);
 		return;
 	}
+#endif
+
+	b->data -= SEND_HDR_LEN;
+	b->len += SEND_HDR_LEN;
+	snd_hdr = sbuff_data(b);
+	snd_hdr->direction = pi->in;
+	snd_hdr->ifidx = pi->ifinfo->ifidx;
 
+        if (send(sndsock, b->data, b->len, 0) < 0) {
+                DBG(&dbg_snd, "Failed to send SEND message back to kernel.");
+                perror("Failed");
+                snd_put_buf(b);
+                return;
+        }
+
 	snd_put_buf(b);
 
 	return;
@@ -255,6 +272,8 @@
 void
 snd_sock_read(struct snd_ifinfo *p)
 {
+	struct snd_hdr *snd_hdr;
+	int direction;
 	struct rt_msghdr *rtm;
 	struct if_announcemsghdr *ifan;
 	struct sbuff *b;
@@ -277,6 +296,26 @@
 
 	b->len = n;
 
+	snd_hdr = sbuff_pull(b, SEND_HDR_LEN);
+	direction = snd_hdr->direction;
+	switch(direction) {
+	case SND_IN:
+		applog(LOG_ERR, "Direction: SND_IN");
+		pi->ifinfo = p;
+		pi->in = 1;
+		snd_recv_pkt(b, p->ifidx, SND_IN, pi);
+		break;
+	case SND_OUT:
+                applog(LOG_ERR, "Direction: SND_OUT");
+                pi->ifinfo = p;
+                pi->in = 0;
+                snd_recv_pkt(b, p->ifidx, SND_OUT, pi);
+                break;
+	default:
+		applog(LOG_ERR, "Unknown SEND pkt header: unknown direction.");
+	}
+
+#if 0
 	rtm = sbuff_data(b);
 	if (rtm->rtm_version != RTM_VERSION) {
 		applog(LOG_ERR, "%s: Unsupported routing message version.", __FUNCTION__);
@@ -324,6 +363,7 @@
 		applog(LOG_ERR, "%s: Unsupported routing message type.", __FUNCTION__);
 		goto done;
 	}
+#endif
 
 done:
 	/* ToDo: Free memory! */
@@ -403,13 +443,22 @@
 		return (-1);
 	}
 #endif
+#define IPPROTO_SEND	259
 
+	if ((*sndsocket = socket(PF_INET, SOCK_RAW, IPPROTO_SEND)) < 0) {	
+		applog(LOG_ERR, "%s: socket: %s", __FUNCTION__,
+			strerror(errno));
+		return(-1);
+	} else {
+		applog(LOG_ERR, "%s: SEND socket created.", __FUNCTION__);
+	}
+
 	if ((*icmp6socket = socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6)) < 0) {
 		applog(LOG_ERR, "%s: socket: %s", __FUNCTION__,
 		       strerror(errno));
 		return (-1);
 	}
-
+#if 0
 	if ((*sndsocket = socket(PF_ROUTE, SOCK_RAW, 0)) < 0) {
 		applog(LOG_ERR, "%s: socket: %s", __FUNCTION__,
 			strerror(errno));
@@ -417,6 +466,7 @@
 	} else {
 		applog(LOG_ERR, "%s: routing socket created.", __FUNCTION__);
 	}  
+#endif
 
 	icmp6sock = *icmp6socket;
 	sndsock = *sndsocket;

==== //depot/projects/soc2009/anchie_send/send_0.2/sendd/proto.c#12 (text+ko) ====

@@ -684,6 +684,8 @@
 		return;
 	}
 
+	DBG(&dbg_snd, "pi->ifinfo->ifidx = %d", ifidx);
+
 #if 0
 	if (!in)
 		if (sbuff_pull(b, sizeof (struct ether_header)) == NULL) {

==== //depot/projects/soc2009/anchie_send/src/sys/kern/uipc_socket.c#6 (text+ko) ====

@@ -1186,12 +1186,15 @@
 					goto release;
 				}
 			} else if (addr == NULL) {
+				/* XXX-AK:  */
+				if (so->so_proto->pr_protocol != 259) {
 				SOCKBUF_UNLOCK(&so->so_snd);
 				if (so->so_proto->pr_flags & PR_CONNREQUIRED)
 					error = ENOTCONN;
 				else
 					error = EDESTADDRREQ;
 				goto release;
+				}
 			}
 		}
 		space = sbspace(&so->so_snd);

==== //depot/projects/soc2009/anchie_send/src/sys/netinet/in.h#5 (text+ko) ====


==== //depot/projects/soc2009/anchie_send/src/sys/netinet/ip_var.h#7 (text+ko) ====


==== //depot/projects/soc2009/anchie_send/src/sys/netinet/raw_ip.c#6 (text+ko) ====


==== //depot/projects/soc2009/anchie_send/src/sys/netinet6/icmp6.c#32 (text+ko) ====

@@ -94,6 +94,7 @@
 #include <netinet/in.h>
 #include <netinet/in_pcb.h>
 #include <netinet/in_var.h>
+#include <netinet/ip_var.h>
 #include <netinet/ip6.h>
 #include <netinet/icmp6.h>
 #include <netinet/tcp_var.h>
@@ -780,7 +781,8 @@
 			/* Send incoming SeND-protected/ND packet to user space. */
 			if (send_input_hook != NULL) {
 				IP6_EXTHDR_CHECK(m, off, icmp6len, IPPROTO_DONE);
-				send_input_hook(m, ifp, SND_IN, ip6len);
+				printf("send_sendso_input_hook\n");
+				send_sendso_input_hook(V_send_so, m, SND_IN, ip6len);
 			} else {
 				/* give up local */
 				nd6_rs_input(m, off, icmp6len);
@@ -790,7 +792,8 @@
 		}
 		if (send_input_hook != NULL) {
 			IP6_EXTHDR_CHECK(m, off, icmp6len, IPPROTO_DONE);
-			send_input_hook(n, ifp, SND_IN, ip6len);
+                        printf("send_sendso_input_hook\n");
+                        send_sendso_input_hook(V_send_so, m, SND_IN, ip6len);
 			return (IPPROTO_DONE);
 		} else
 			nd6_rs_input(n, off, icmp6len);
@@ -807,7 +810,8 @@
 
 			/* Send incoming SeND-protected/ND packet to user space. */
 			if (send_input_hook != NULL) {
-				send_input_hook(m, ifp, SND_IN, ip6len);
+
+				send_sendso_input_hook(V_send_so, m, SND_IN, ip6len);	
 				return (IPPROTO_DONE);
 			} else
 				nd6_ra_input(m, off, icmp6len);
@@ -815,7 +819,7 @@
 			goto freeit;
 		}
 		if (send_input_hook != NULL) {
-			send_input_hook(n, ifp, SND_IN, ip6len);
+			send_sendso_input_hook(V_send_so, m, SND_IN, ip6len);	
 			return (IPPROTO_DONE);
 		} else
 			nd6_ra_input(n, off, icmp6len);
@@ -832,7 +836,7 @@
 			if (send_input_hook != NULL) {
 				/* Send incoming SeND/ND packet to user space. */
 				printf("%s: send_input_hook m=%p\n", __func__, m);
-				send_input_hook(m, ifp, SND_IN, ip6len);
+				send_sendso_input_hook(V_send_so, m, SND_IN, ip6len);	
 			} else {
 				/* give up local */
 				nd6_ns_input(m, off, icmp6len);
@@ -843,7 +847,7 @@
 		if (send_input_hook != NULL) {
 			/* Send incoming SeND/ND packet to user space. */
 			printf("%s: send_input_hook n=%p\n", __func__, n);
-			send_input_hook(n, ifp, SND_IN, ip6len);
+			send_sendso_input_hook(V_send_so, m, SND_IN, ip6len);
 		} else 
 			nd6_ns_input(n, off, icmp6len);
 		/* m stays. */
@@ -859,7 +863,7 @@
 
 			/* Send incoming SeND-protected/ND packet to user space. */
 			if (send_input_hook != NULL) {
-				send_input_hook(m, ifp, SND_IN, ip6len);
+				send_sendso_input_hook(V_send_so, m, SND_IN, ip6len);
 				return (IPPROTO_DONE);
 			} else {
 				/* give up local */
@@ -869,7 +873,7 @@
 			goto freeit;
 		}
 		if (send_input_hook != NULL)
-			send_input_hook(n, ifp, SND_IN, ip6len);
+			send_sendso_input_hook(V_send_so, m, SND_IN, ip6len);
 		else
 			nd6_na_input(n, off, icmp6len);
 		/* m stays. */
@@ -885,7 +889,7 @@
 
 			/* Send incoming SeND-protected/ND packet to user space. */
 			if (send_input_hook != NULL) {
-				send_input_hook(m, ifp, SND_IN, ip6len);
+				send_sendso_input_hook(V_send_so, m, SND_IN, ip6len);	
 				return (IPPROTO_DONE);
 			} else {
 				/* give up local */
@@ -895,7 +899,7 @@
 			goto freeit;
 		}
 		if (send_input_hook != NULL) {
-			send_input_hook(n, ifp, SND_IN, ip6len);
+			send_sendso_input_hook(V_send_so, m, SND_IN, ip6len);
 			return (IPPROTO_DONE);
 		} else
 			icmp6_redirect_input(n, off);

==== //depot/projects/soc2009/anchie_send/src/sys/netinet6/send.c#34 (text+ko) ====

@@ -45,12 +45,14 @@
 
 #include <net/route.h>
 #include <net/if.h>
+#include <net/if_var.h>
 
 #include <netinet6/in6_var.h>
 #include <netinet6/nd6.h>
 #include <netinet6/scope6_var.h>
 #include <netinet6/send.h>
 
+
 MALLOC_DEFINE(M_SEND, "send", "Secure Neighbour Discovery");
 
 static int
@@ -200,11 +202,32 @@
 
 	printf("send_uattach: proto = %d\n", proto);
 	V_send_so = so;
-	/* V_send_so se ko arguement predaje send_sendso_output() funkciji */
  
 	return error;
 }
 
+static int
+sosend_rcv(struct socket *so, int flags, struct mbuf *m, struct sockaddr *nam,
+    struct mbuf *control, struct thread *td)
+{
+	struct ifnet *ifp;
+	struct snd_hdr *snd_hdr;
+	int if_index;
+
+	printf("sosend_rcv \n");
+
+	snd_hdr = mtod(m, struct snd_hdr *);
+	if_index = snd_hdr->ifidx;
+	printf("direction: %d, ifidx: %d \n", snd_hdr->direction, snd_hdr->ifidx);
+#if 0
+	ifnet_setbyindex(snd_hdr->ifidx, ifp);
+	m_adj(n, sizeof(struct snd_hdr));
+	send_output_hook(m, ifp, snd_hdr->direction);
+#endif
+
+	return 0;
+}
+
 /*
  * Send a message to the SEND daemon on the SEND socket.
  */
@@ -214,6 +237,7 @@
     u_int len;
     void *data;
     struct ip6_hdr *ip6;
+    struct snd_hdr *snd_hdr;
                         
         /*
          * Make sure to clear any possible internally embedded scope before
@@ -240,35 +264,26 @@
 
         m_copydata(m, 0, msglen, data);
 
+    M_PREPEND(m, SEND_HDR_LEN, M_DONTWAIT);
+    if ((m == NULL && (m = m_pullup(m, len + SEND_HDR_LEN)) == NULL)) {
+	m_freem(m);
+	return (ENOBUFS);
+    }
+    snd_hdr = mtod(m, struct snd_hdr *);
+    snd_hdr->direction = direction;
+    snd_hdr->ifidx = -1;
+
         /*
          * Send incoming or outgoing traffic to the user space either to be
          * protected (outgoing) or validated (incoming) according to rfc3971. */
 
-    if (s) {
-#if 0
-	SOCKBUF_LOCK(&s->so_rcv);
-	sbappendrecord_locked(&s->so_rcv, m);
-	sorwakeup_locked(s);
-	//SOCKBUF_UNLOCK(&s->so_rcv);
-#endif
-
-	struct sockaddr_in6 fromsa;
-
-	bzero(&fromsa, sizeof(fromsa));
-	fromsa.sin6_family = AF_INET6;
-	fromsa.sin6_len = sizeof(fromsa);
-	fromsa.sin6_addr = ip6->ip6_src;
-	SOCKBUF_LOCK(&s->so_rcv);
-	if (sbappendaddr_locked(&s->so_rcv, (struct sockaddr *)&fromsa,
-		m, (struct mbuf *)0) == 0) { 
-		SOCKBUF_UNLOCK(&s->so_rcv);
-	} else {
+	if (s) {
+		SOCKBUF_LOCK(&s->so_rcv);
+		sbappendrecord_locked(&s->so_rcv, m);
 		sorwakeup_locked(s);
-	}
+		return 0;
+    	}
 
-	return 0;
-    }
-
     m_freem(m);
     free(data, M_SEND);
 
@@ -278,8 +293,9 @@
 static void
 send_close(struct socket *so)
 {
-
-    V_send_so = NULL;
+    /* XXX-AK: Memory leakage! */
+    if (V_send_so)
+    	V_send_so = NULL;
     printf("pru_detach: send_close\n");
     //soisdisconnected(so);
 }
@@ -287,7 +303,7 @@
 struct pr_usrreqs send_usrreqs = {
     // Read sys/kern/uipc_socket.c	
     .pru_attach =		send_uattach,
-    //.pru_sosend =		sosend_sndpacket,
+    .pru_send =		sosend_rcv,
     .pru_detach =		send_close
 };
 

==== //depot/projects/soc2009/anchie_send/src/sys/netinet6/send.h#18 (text+ko) ====

@@ -30,6 +30,13 @@
 #define RTM_SND_OUT	0	/* Outgoing RTM SeND packet sent to user space */
 #define RTM_SND_IN	1	/* Incoming RTM SeND packet sent to user space */
 
+#define SEND_HDR_LEN	sizeof(struct snd_hdr)
+
+struct snd_hdr {
+        int             direction;
+        int             ifidx;
+};
+
 extern int      (*send_input_hook)(struct mbuf *, struct ifnet *, int, int);
 extern int      (*send_output_hook)(struct mbuf *, struct ifnet *, int);
 


More information about the p4-projects mailing list