svn commit: r203791 - user/kmacy/head_flowtable_v6/sys/net

Kip Macy kmacy at FreeBSD.org
Thu Feb 11 23:56:04 UTC 2010


Author: kmacy
Date: Thu Feb 11 23:56:03 2010
New Revision: 203791
URL: http://svn.freebsd.org/changeset/base/203791

Log:
  - replace usage of sockaddr with sockaddr_storage to accomodate IPv6

Modified:
  user/kmacy/head_flowtable_v6/sys/net/flowtable.c
  user/kmacy/head_flowtable_v6/sys/net/flowtable.h
  user/kmacy/head_flowtable_v6/sys/net/if_llatbl.c
  user/kmacy/head_flowtable_v6/sys/net/if_llatbl.h

Modified: user/kmacy/head_flowtable_v6/sys/net/flowtable.c
==============================================================================
--- user/kmacy/head_flowtable_v6/sys/net/flowtable.c	Thu Feb 11 22:51:44 2010	(r203790)
+++ user/kmacy/head_flowtable_v6/sys/net/flowtable.c	Thu Feb 11 23:56:03 2010	(r203791)
@@ -535,7 +535,7 @@ ipv4_flow_lookup_hash_internal(
 static struct flentry *
 flowtable_lookup_mbuf4(struct flowtable *ft, struct mbuf *m)
 {
-	struct sockaddr ssa, dsa;
+	struct sockaddr_storage ssa, dsa;
 	uint16_t flags;
 	struct sockaddr_in *dsin, *ssin;
 
@@ -738,7 +738,7 @@ ipv6_flow_lookup_hash_internal(
 static struct flentry *
 flowtable_lookup_mbuf6(struct flowtable *ft, struct mbuf *m)
 {
-	struct sockaddr ssa, dsa;
+	struct sockaddr_storage ssa, dsa;
 	struct sockaddr_in6 *dsin6, *ssin6;	
 	uint16_t flags;
 
@@ -939,8 +939,9 @@ skip:
 }
 
 int
-kern_flowtable_insert(struct flowtable *ft, struct sockaddr *ssa,
-    struct sockaddr *dsa, struct route *ro, uint32_t fibnum, int flags)
+kern_flowtable_insert(struct flowtable *ft,
+    struct sockaddr_storage *ssa, struct sockaddr_storage *dsa,
+    struct route *ro, uint32_t fibnum, int flags)
 {
 	uint32_t key[9], hash;
 
@@ -948,12 +949,12 @@ kern_flowtable_insert(struct flowtable *
 	hash = 0;
 
 #ifdef INET
-	if (ssa->sa_family == AF_INET) 
+	if (ssa->ss_family == AF_INET) 
 		hash = ipv4_flow_lookup_hash_internal((struct sockaddr_in *)ssa,
 		    (struct sockaddr_in *)dsa, key, flags);
 #endif
 #ifdef INET6
-	if (ssa->sa_family == AF_INET6) 
+	if (ssa->ss_family == AF_INET6) 
 		hash = ipv6_flow_lookup_hash_internal((struct sockaddr_in6 *)ssa,
 		    (struct sockaddr_in6 *)dsa, key, flags);
 #endif	
@@ -1008,8 +1009,8 @@ flowtable_lookup_mbuf(struct flowtable *
 }
 	
 struct flentry *
-flowtable_lookup(struct flowtable *ft, struct sockaddr *ssa,
-    struct sockaddr *dsa, uint32_t fibnum, int flags)
+flowtable_lookup(struct flowtable *ft, struct sockaddr_storage *ssa,
+    struct sockaddr_storage *dsa, uint32_t fibnum, int flags)
 {
 	uint32_t key[9], hash;
 	struct flentry *fle;
@@ -1018,17 +1019,18 @@ flowtable_lookup(struct flowtable *ft, s
 	struct rtentry *rt;
 	struct llentry *lle;
 	struct route sro, *ro;
+	struct route_in6 sro6;
 
 	ro = &sro;
 	ro->ro_rt = NULL;
 	ro->ro_lle = NULL;
-	ro->ro_dst = *dsa;
 	hash = 0;
 	flags |= ft->ft_flags;
 	proto = flags_to_proto(flags);
 #ifdef INET
-	if (ssa->sa_family == AF_INET) {
+	if (ssa->ss_family == AF_INET) {
 		struct sockaddr_in *ssin, *dsin;
+		memcpy(&ro->ro_dst, &dsa, sizeof(struct sockaddr_in));
 
 		dsin = (struct sockaddr_in *)dsa;
 		ssin = (struct sockaddr_in *)ssa;
@@ -1040,9 +1042,12 @@ flowtable_lookup(struct flowtable *ft, s
 	}
 #endif	
 #ifdef INET6		
-	if (ssa->sa_family == AF_INET6) {
+	if (ssa->ss_family == AF_INET6) {
 		struct sockaddr_in6 *ssin6, *dsin6;
 
+		ro = (struct route *)&sro6;
+		memcpy(&ro->ro_dst, &dsa,
+		    sizeof(struct sockaddr_in6));
 		dsin6 = (struct sockaddr_in6 *)dsa;
 		ssin6 = (struct sockaddr_in6 *)ssa;
 
@@ -1107,7 +1112,7 @@ uncached:
 		error = ENETUNREACH;
 	else {
 		struct llentry *lle = NULL;
-		struct sockaddr *l3addr;
+		struct sockaddr_storage *l3addr;
 		struct rtentry *rt = ro->ro_rt;
 		struct ifnet *ifp = rt->rt_ifp;
 
@@ -1116,17 +1121,25 @@ uncached:
 			ro->ro_rt = NULL;
 			return (NULL);
 		}
-		if (rt->rt_flags & RTF_GATEWAY)
-			l3addr = rt->rt_gateway;
-		else
-			l3addr = &ro->ro_dst;
 #ifdef INET6		
-		if (ssa->sa_family == AF_INET6)
+		if (ssa->ss_family == AF_INET6) {
+			if (rt->rt_flags & RTF_GATEWAY)
+				l3addr = (struct sockaddr_storage *)rt->rt_gateway;
+			
+			else
+				l3addr = (struct sockaddr_storage *)&ro->ro_dst;
 			llentry_update(&lle, LLTABLE6(ifp), l3addr, ifp);
-#endif
-#ifdef INET		
-		if (ssa->sa_family == AF_INET)
-			llentry_update(&lle, LLTABLE(ifp), l3addr, ifp);
+		}
+#endif	
+#ifdef INET			
+		if (ssa->ss_family == AF_INET) {
+			if (rt->rt_flags & RTF_GATEWAY)
+				l3addr = (struct sockaddr_storage *)rt->rt_gateway;
+			else
+				l3addr = (struct sockaddr_storage *)&ro->ro_dst;
+			llentry_update(&lle, LLTABLE(ifp), l3addr, ifp);	
+		}
+			
 #endif
 		ro->ro_lle = lle;
 

Modified: user/kmacy/head_flowtable_v6/sys/net/flowtable.h
==============================================================================
--- user/kmacy/head_flowtable_v6/sys/net/flowtable.h	Thu Feb 11 22:51:44 2010	(r203790)
+++ user/kmacy/head_flowtable_v6/sys/net/flowtable.h	Thu Feb 11 23:56:03 2010	(r203791)
@@ -62,11 +62,11 @@ struct flowtable *flowtable_alloc(char *
  */
 struct flentry *flowtable_lookup_mbuf(struct flowtable *ft, struct mbuf *m, int af);
 
-struct flentry *flowtable_lookup(struct flowtable *ft, struct sockaddr *ssa,
-    struct sockaddr *dsa, uint32_t fibnum, int flags);
+struct flentry *flowtable_lookup(struct flowtable *ft, struct sockaddr_storage *ssa,
+    struct sockaddr_storage *dsa, uint32_t fibnum, int flags);
 
-int kern_flowtable_insert(struct flowtable *ft, struct sockaddr *ssa,
-    struct sockaddr *dsa, struct route *ro, uint32_t fibnum, int flags);
+int kern_flowtable_insert(struct flowtable *ft, struct sockaddr_storage *ssa,
+    struct sockaddr_storage *dsa, struct route *ro, uint32_t fibnum, int flags);
 
 void flow_invalidate(struct flentry *fl);
 void flowtable_route_flush(struct flowtable *ft, struct rtentry *rt);

Modified: user/kmacy/head_flowtable_v6/sys/net/if_llatbl.c
==============================================================================
--- user/kmacy/head_flowtable_v6/sys/net/if_llatbl.c	Thu Feb 11 22:51:44 2010	(r203790)
+++ user/kmacy/head_flowtable_v6/sys/net/if_llatbl.c	Thu Feb 11 23:56:03 2010	(r203791)
@@ -117,7 +117,7 @@ llentry_free(struct llentry *lle)
  */
 int
 llentry_update(struct llentry **llep, struct lltable *lt,
-    struct sockaddr *dst, struct ifnet *ifp)
+    struct sockaddr_storage *dst, struct ifnet *ifp)
 {
 	struct llentry *la;
 

Modified: user/kmacy/head_flowtable_v6/sys/net/if_llatbl.h
==============================================================================
--- user/kmacy/head_flowtable_v6/sys/net/if_llatbl.h	Thu Feb 11 22:51:44 2010	(r203790)
+++ user/kmacy/head_flowtable_v6/sys/net/if_llatbl.h	Thu Feb 11 23:56:03 2010	(r203791)
@@ -191,7 +191,7 @@ int		lltable_sysctl_dumparp(int, struct 
 
 void		llentry_free(struct llentry *);
 int		llentry_update(struct llentry **, struct lltable *,
-                       struct sockaddr *, struct ifnet *);
+                       struct sockaddr_storage *, struct ifnet *);
 
 /*
  * Generic link layer address lookup function.


More information about the svn-src-user mailing list