Module Name: src Committed By: ozaki-r Date: Fri Jul 8 04:33:30 UTC 2016
Modified Files: src/sys/net: if_stf.c src/sys/netinet: if_arp.c igmp.c in.c in_pcb.c in_var.h ip_icmp.c ip_output.c src/sys/netinet6: in6_var.h mld6.c Log Message: Replace macros to get an IP address with proper inline functions The inline functions are more friendly for applying psz/psref; they consist of only simple interations. To generate a diff of this commit: cvs rdiff -u -r1.95 -r1.96 src/sys/net/if_stf.c cvs rdiff -u -r1.216 -r1.217 src/sys/netinet/if_arp.c cvs rdiff -u -r1.60 -r1.61 src/sys/netinet/igmp.c cvs rdiff -u -r1.172 -r1.173 src/sys/netinet/in.c cvs rdiff -u -r1.165 -r1.166 src/sys/netinet/in_pcb.c cvs rdiff -u -r1.77 -r1.78 src/sys/netinet/in_var.h cvs rdiff -u -r1.149 -r1.150 src/sys/netinet/ip_icmp.c cvs rdiff -u -r1.258 -r1.259 src/sys/netinet/ip_output.c cvs rdiff -u -r1.82 -r1.83 src/sys/netinet6/in6_var.h cvs rdiff -u -r1.71 -r1.72 src/sys/netinet6/mld6.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/net/if_stf.c diff -u src/sys/net/if_stf.c:1.95 src/sys/net/if_stf.c:1.96 --- src/sys/net/if_stf.c:1.95 Thu Jul 7 09:32:02 2016 +++ src/sys/net/if_stf.c Fri Jul 8 04:33:30 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: if_stf.c,v 1.95 2016/07/07 09:32:02 ozaki-r Exp $ */ +/* $NetBSD: if_stf.c,v 1.96 2016/07/08 04:33:30 ozaki-r Exp $ */ /* $KAME: if_stf.c,v 1.62 2001/06/07 22:32:16 itojun Exp $ */ /* @@ -75,7 +75,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_stf.c,v 1.95 2016/07/07 09:32:02 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_stf.c,v 1.96 2016/07/08 04:33:30 ozaki-r Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -322,7 +322,7 @@ stf_getsrcifa6(struct ifnet *ifp) continue; memcpy(&in, GET_V4(&sin6->sin6_addr), sizeof(in)); - INADDR_TO_IA(in, ia4); + ia4 = in_get_ia(in); if (ia4 == NULL) continue; Index: src/sys/netinet/if_arp.c diff -u src/sys/netinet/if_arp.c:1.216 src/sys/netinet/if_arp.c:1.217 --- src/sys/netinet/if_arp.c:1.216 Wed Jul 6 06:30:08 2016 +++ src/sys/netinet/if_arp.c Fri Jul 8 04:33:30 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: if_arp.c,v 1.216 2016/07/06 06:30:08 ozaki-r Exp $ */ +/* $NetBSD: if_arp.c,v 1.217 2016/07/08 04:33:30 ozaki-r Exp $ */ /*- * Copyright (c) 1998, 2000, 2008 The NetBSD Foundation, Inc. @@ -68,7 +68,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_arp.c,v 1.216 2016/07/06 06:30:08 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_arp.c,v 1.217 2016/07/08 04:33:30 ozaki-r Exp $"); #ifdef _KERNEL_OPT #include "opt_ddb.h" @@ -555,9 +555,8 @@ arp_rtrequest(int req, struct rtentry *r } /* Announce a new entry if requested. */ if (rt->rt_flags & RTF_ANNOUNCE) { - INADDR_TO_IA(satocsin(rt_getkey(rt))->sin_addr, ia); - while (ia && ia->ia_ifp != ifp) - NEXT_IA_WITH_SAME_ADDR(ia); + ia = in_get_ia_on_iface( + satocsin(rt_getkey(rt))->sin_addr, ifp); if (ia == NULL || ia->ia4_flags & (IN_IFF_NOTREADY | IN_IFF_DETACHED)) ; @@ -603,10 +602,7 @@ arp_rtrequest(int req, struct rtentry *r break; } - INADDR_TO_IA(satocsin(rt_getkey(rt))->sin_addr, ia); - while (ia && ia->ia_ifp != ifp) - NEXT_IA_WITH_SAME_ADDR(ia); - + ia = in_get_ia_on_iface(satocsin(rt_getkey(rt))->sin_addr, ifp); if (ia == NULL) break; @@ -1028,9 +1024,9 @@ in_arpinput(struct mbuf *m) * or any address on the interface to use * as a dummy address in the rest of this function */ - - INADDR_TO_IA(itaddr, ia); - while (ia != NULL) { + IN_ADDRHASH_READER_FOREACH(ia, itaddr.s_addr) { + if (!in_hosteq(ia->ia_addr.sin_addr, itaddr)) + continue; #if NCARP > 0 if (ia->ia_ifp->if_type == IFT_CARP && ((ia->ia_ifp->if_flags & (IFF_UP|IFF_RUNNING)) == @@ -1057,8 +1053,6 @@ in_arpinput(struct mbuf *m) rcvif->if_bridge == ia->ia_ifp->if_bridge) bridge_ia = ia; #endif /* NBRIDGE > 0 */ - - NEXT_IA_WITH_SAME_ADDR(ia); } #if NBRIDGE > 0 @@ -1072,12 +1066,9 @@ in_arpinput(struct mbuf *m) #endif if (ia == NULL) { - INADDR_TO_IA(isaddr, ia); - while ((ia != NULL) && ia->ia_ifp != rcvif) - NEXT_IA_WITH_SAME_ADDR(ia); - + ia = in_get_ia_on_iface(isaddr, rcvif); if (ia == NULL) { - IFP_TO_IA(ifp, ia); + ia = in_get_ia_from_ifp(ifp); if (ia == NULL) { ARP_STATINC(ARP_STAT_RCVNOINT); goto out; Index: src/sys/netinet/igmp.c diff -u src/sys/netinet/igmp.c:1.60 src/sys/netinet/igmp.c:1.61 --- src/sys/netinet/igmp.c:1.60 Tue Jun 28 02:02:56 2016 +++ src/sys/netinet/igmp.c Fri Jul 8 04:33:30 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: igmp.c,v 1.60 2016/06/28 02:02:56 ozaki-r Exp $ */ +/* $NetBSD: igmp.c,v 1.61 2016/07/08 04:33:30 ozaki-r Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -40,7 +40,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: igmp.c,v 1.60 2016/06/28 02:02:56 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: igmp.c,v 1.61 2016/07/08 04:33:30 ozaki-r Exp $"); #ifdef _KERNEL_OPT #include "opt_mrouting.h" @@ -361,7 +361,7 @@ igmp_input(struct mbuf *m, ...) * determine the arrival interface of an incoming packet. */ if ((ip->ip_src.s_addr & IN_CLASSA_NET) == 0) { - IFP_TO_IA(ifp, ia); /* XXX */ + ia = in_get_ia_from_ifp(ifp); /* XXX */ if (ia) ip->ip_src.s_addr = ia->ia_subnet; } @@ -401,7 +401,7 @@ igmp_input(struct mbuf *m, ...) * leave requires knowing that we are the only member of a * group. */ - IFP_TO_IA(ifp, ia); /* XXX */ + ia = in_get_ia_from_ifp(ifp); /* XXX */ if (ia && in_hosteq(ip->ip_src, ia->ia_addr.sin_addr)) break; #endif @@ -428,7 +428,7 @@ igmp_input(struct mbuf *m, ...) */ if ((ip->ip_src.s_addr & IN_CLASSA_NET) == 0) { #ifndef MROUTING - IFP_TO_IA(ifp, ia); /* XXX */ + ia = in_get_ia_from_ifp(ifp); /* XXX */ #endif if (ia) ip->ip_src.s_addr = ia->ia_subnet; Index: src/sys/netinet/in.c diff -u src/sys/netinet/in.c:1.172 src/sys/netinet/in.c:1.173 --- src/sys/netinet/in.c:1.172 Thu Jul 7 09:32:02 2016 +++ src/sys/netinet/in.c Fri Jul 8 04:33:30 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: in.c,v 1.172 2016/07/07 09:32:02 ozaki-r Exp $ */ +/* $NetBSD: in.c,v 1.173 2016/07/08 04:33:30 ozaki-r Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -91,7 +91,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: in.c,v 1.172 2016/07/07 09:32:02 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: in.c,v 1.173 2016/07/08 04:33:30 ozaki-r Exp $"); #include "arp.h" @@ -390,7 +390,7 @@ in_control(struct socket *so, u_long cmd * Find address for this interface, if it exists. */ if (ifp != NULL) - IFP_TO_IA(ifp, ia); + ia = in_get_ia_from_ifp(ifp); hostIsNew = 1; /* moved here to appease gcc */ switch (cmd) { @@ -1559,7 +1559,7 @@ in_selectsrc(struct sockaddr_in *sin, st ifp = if_byindex(imo->imo_multicast_if_index); if (ifp != NULL) { - IFP_TO_IA(ifp, ia); /* XXX */ + ia = in_get_ia_from_ifp(ifp); /* XXX */ } else ia = NULL; if (ia == NULL || ia->ia4_flags & IN_IFF_NOTREADY) { Index: src/sys/netinet/in_pcb.c diff -u src/sys/netinet/in_pcb.c:1.165 src/sys/netinet/in_pcb.c:1.166 --- src/sys/netinet/in_pcb.c:1.165 Wed Jul 6 08:42:34 2016 +++ src/sys/netinet/in_pcb.c Fri Jul 8 04:33:30 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: in_pcb.c,v 1.165 2016/07/06 08:42:34 ozaki-r Exp $ */ +/* $NetBSD: in_pcb.c,v 1.166 2016/07/08 04:33:30 ozaki-r Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -93,7 +93,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: in_pcb.c,v 1.165 2016/07/06 08:42:34 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: in_pcb.c,v 1.166 2016/07/08 04:33:30 ozaki-r Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -283,7 +283,7 @@ in_pcbbind_addr(struct inpcb *inp, struc } else if (!in_nullhost(sin->sin_addr)) { struct in_ifaddr *ia = NULL; - INADDR_TO_IA(sin->sin_addr, ia); + ia = in_get_ia(sin->sin_addr); /* check for broadcast addresses */ if (ia == NULL) ia = ifatoia(ifa_ifwithaddr(sintosa(sin))); @@ -514,7 +514,7 @@ in_pcbconnect(void *v, struct sockaddr_i xerror = EADDRNOTAVAIL; return xerror; } - INADDR_TO_IA(ifaddr->sin_addr, ia); + ia = in_get_ia(ifaddr->sin_addr); if (ia == NULL) return (EADDRNOTAVAIL); } Index: src/sys/netinet/in_var.h diff -u src/sys/netinet/in_var.h:1.77 src/sys/netinet/in_var.h:1.78 --- src/sys/netinet/in_var.h:1.77 Fri Jul 8 03:40:34 2016 +++ src/sys/netinet/in_var.h Fri Jul 8 04:33:30 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: in_var.h,v 1.77 2016/07/08 03:40:34 ozaki-r Exp $ */ +/* $NetBSD: in_var.h,v 1.78 2016/07/08 04:33:30 ozaki-r Exp $ */ /*- * Copyright (c) 1998 The NetBSD Foundation, Inc. @@ -222,64 +222,55 @@ extern struct pslist_head in_ifaddrhead_ extern const int inetctlerrmap[]; /* - * Macro for finding whether an internet address (in_addr) belongs to one + * Find whether an internet address (in_addr) belongs to one * of our interfaces (in_ifaddr). NULL if the address isn't ours. */ -#define INADDR_TO_IA(addr, ia) \ - /* struct in_addr addr; */ \ - /* struct in_ifaddr *ia; */ \ -{ \ - IN_ADDRHASH_READER_FOREACH(ia, addr.s_addr) { \ - if (in_hosteq(ia->ia_addr.sin_addr, (addr))) \ - break; \ - } \ -} +static inline struct in_ifaddr * +in_get_ia(struct in_addr addr) +{ + struct in_ifaddr *ia; -/* - * Macro for finding the next in_ifaddr structure with the same internet - * address as ia. Call only with a valid ia pointer. - * Will set ia to NULL if none found. - */ + IN_ADDRHASH_READER_FOREACH(ia, addr.s_addr) { + if (in_hosteq(ia->ia_addr.sin_addr, addr)) + break; + } -#define NEXT_IA_WITH_SAME_ADDR(ia) \ - /* struct in_ifaddr *ia; */ \ -{ \ - struct in_addr addr; \ - addr = ia->ia_addr.sin_addr; \ - do { \ - ia = IN_ADDRHASH_READER_NEXT(ia); \ - } while ((ia != NULL) && !in_hosteq(ia->ia_addr.sin_addr, addr)); \ + return ia; } /* - * Macro for finding the interface (ifnet structure) corresponding to one - * of our IP addresses. + * Find whether an internet address (in_addr) belongs to a specified + * interface. NULL if the address isn't ours. */ -#define INADDR_TO_IFP(addr, ifp) \ - /* struct in_addr addr; */ \ - /* struct ifnet *ifp; */ \ -{ \ - struct in_ifaddr *ia; \ -\ - INADDR_TO_IA(addr, ia); \ - (ifp) = (ia == NULL) ? NULL : ia->ia_ifp; \ +static inline struct in_ifaddr * +in_get_ia_on_iface(struct in_addr addr, struct ifnet *ifp) +{ + struct in_ifaddr *ia; + + IN_ADDRHASH_READER_FOREACH(ia, addr.s_addr) { + if (in_hosteq(ia->ia_addr.sin_addr, addr) && + ia->ia_ifp == ifp) + break; + } + + return ia; } /* - * Macro for finding an internet address structure (in_ifaddr) corresponding + * Find an internet address structure (in_ifaddr) corresponding * to a given interface (ifnet structure). */ -#define IFP_TO_IA(ifp, ia) \ - /* struct ifnet *ifp; */ \ - /* struct in_ifaddr *ia; */ \ -{ \ - struct ifaddr *ifa; \ -\ - IFADDR_READER_FOREACH(ifa, ifp) { \ - if (ifa->ifa_addr->sa_family == AF_INET) \ - break; \ - } \ - (ia) = ifatoia(ifa); \ +static inline struct in_ifaddr * +in_get_ia_from_ifp(struct ifnet *ifp) +{ + struct ifaddr *ifa; + + IFADDR_READER_FOREACH(ifa, ifp) { + if (ifa->ifa_addr->sa_family == AF_INET) + break; + } + + return ifatoia(ifa); } #include <netinet/in_selsrc.h> Index: src/sys/netinet/ip_icmp.c diff -u src/sys/netinet/ip_icmp.c:1.149 src/sys/netinet/ip_icmp.c:1.150 --- src/sys/netinet/ip_icmp.c:1.149 Thu Jul 7 09:32:02 2016 +++ src/sys/netinet/ip_icmp.c Fri Jul 8 04:33:30 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: ip_icmp.c,v 1.149 2016/07/07 09:32:02 ozaki-r Exp $ */ +/* $NetBSD: ip_icmp.c,v 1.150 2016/07/08 04:33:30 ozaki-r Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -94,7 +94,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ip_icmp.c,v 1.149 2016/07/07 09:32:02 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ip_icmp.c,v 1.150 2016/07/08 04:33:30 ozaki-r Exp $"); #ifdef _KERNEL_OPT #include "opt_ipsec.h" @@ -712,7 +712,7 @@ icmp_reflect(struct mbuf *m) */ /* Look for packet addressed to us */ - INADDR_TO_IA(t, ia); + ia = in_get_ia(t); if (ia && (ia->ia4_flags & IN_IFF_NOTREADY)) ia = NULL; @@ -758,14 +758,9 @@ icmp_reflect(struct mbuf *m) if (sin) { t = sin->sin_addr; sin = NULL; - INADDR_TO_IA(t, ia); - while (ia) { - if (ia->ia_ifp == rcvif) { - sin = &ia->ia_addr; - break; - } - NEXT_IA_WITH_SAME_ADDR(ia); - } + ia = in_get_ia_on_iface(t, rcvif); + if (ia != NULL) + sin = &ia->ia_addr; } } Index: src/sys/netinet/ip_output.c diff -u src/sys/netinet/ip_output.c:1.258 src/sys/netinet/ip_output.c:1.259 --- src/sys/netinet/ip_output.c:1.258 Tue Jun 21 03:28:27 2016 +++ src/sys/netinet/ip_output.c Fri Jul 8 04:33:30 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: ip_output.c,v 1.258 2016/06/21 03:28:27 ozaki-r Exp $ */ +/* $NetBSD: ip_output.c,v 1.259 2016/07/08 04:33:30 ozaki-r Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -91,7 +91,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ip_output.c,v 1.258 2016/06/21 03:28:27 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ip_output.c,v 1.259 2016/07/08 04:33:30 ozaki-r Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -336,7 +336,7 @@ ip_output(struct mbuf *m0, struct mbuf * goto bad; } mtu = ifp->if_mtu; - IFP_TO_IA(ifp, ia); + ia = in_get_ia_from_ifp(ifp); isbroadcast = 0; } else { if (rt == NULL) @@ -404,7 +404,7 @@ ip_output(struct mbuf *m0, struct mbuf * struct in_ifaddr *xia; struct ifaddr *xifa; - IFP_TO_IA(ifp, xia); + xia = in_get_ia_from_ifp(ifp); if (!xia) { error = EADDRNOTAVAIL; goto bad; @@ -583,7 +583,7 @@ sendit: * search for the source address structure to * maintain output statistics. */ - INADDR_TO_IA(ip->ip_src, ia); + ia = in_get_ia(ip->ip_src); #endif /* Maybe skip checksums on loopback interfaces. */ @@ -1734,7 +1734,7 @@ ip_getmoptions(struct ip_moptions *imo, ifp = if_byindex(imo->imo_multicast_if_index); if (ifp != NULL) { - IFP_TO_IA(ifp, ia); + ia = in_get_ia_from_ifp(ifp); } addr = ia ? ia->ia_addr.sin_addr : zeroin_addr; pserialize_read_exit(s); Index: src/sys/netinet6/in6_var.h diff -u src/sys/netinet6/in6_var.h:1.82 src/sys/netinet6/in6_var.h:1.83 --- src/sys/netinet6/in6_var.h:1.82 Fri Jul 8 03:40:34 2016 +++ src/sys/netinet6/in6_var.h Fri Jul 8 04:33:30 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: in6_var.h,v 1.82 2016/07/08 03:40:34 ozaki-r Exp $ */ +/* $NetBSD: in6_var.h,v 1.83 2016/07/08 04:33:30 ozaki-r Exp $ */ /* $KAME: in6_var.h,v 1.81 2002/06/08 11:16:51 itojun Exp $ */ /* @@ -562,7 +562,7 @@ extern callout_t in6_tmpaddrtimer_ch; * to a given interface (ifnet structure). */ static inline struct in6_ifaddr * -ifp_to_ia6(struct ifnet *ifp) +in6_get_ia_from_ifp(struct ifnet *ifp) { struct ifaddr *ifa; @@ -573,12 +573,6 @@ ifp_to_ia6(struct ifnet *ifp) return (struct in6_ifaddr *)ifa; } -#define IFP_TO_IA6(__ifp, __ia) \ -do { \ - (__ia) = ifp_to_ia6((__ifp)); \ -} while (/*CONSTCOND*/0) - - #endif /* _KERNEL */ /* @@ -630,7 +624,7 @@ in6_lookup_multi(struct in6_addr *addr, struct in6_multi *in6m; struct in6_ifaddr *ia; - if ((ia = ifp_to_ia6(ifp)) == NULL) + if ((ia = in6_get_ia_from_ifp(ifp)) == NULL) return NULL; LIST_FOREACH(in6m, &ia->ia6_multiaddrs, in6m_entry) { if (IN6_ARE_ADDR_EQUAL(&in6m->in6m_addr, addr)) Index: src/sys/netinet6/mld6.c diff -u src/sys/netinet6/mld6.c:1.71 src/sys/netinet6/mld6.c:1.72 --- src/sys/netinet6/mld6.c:1.71 Thu Jul 7 09:32:03 2016 +++ src/sys/netinet6/mld6.c Fri Jul 8 04:33:30 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: mld6.c,v 1.71 2016/07/07 09:32:03 ozaki-r Exp $ */ +/* $NetBSD: mld6.c,v 1.72 2016/07/08 04:33:30 ozaki-r Exp $ */ /* $KAME: mld6.c,v 1.25 2001/01/16 14:14:18 itojun Exp $ */ /* @@ -102,7 +102,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: mld6.c,v 1.71 2016/07/07 09:32:03 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: mld6.c,v 1.72 2016/07/08 04:33:30 ozaki-r Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -428,7 +428,7 @@ mld_input(struct mbuf *m, int off) */ timer = ntohs(mldh->mld_maxdelay); - IFP_TO_IA6(ifp, ia); + ia = in6_get_ia_from_ifp(ifp); if (ia == NULL) break; @@ -664,7 +664,7 @@ in6_addmulti(struct in6_addr *maddr6, st callout_init(&in6m->in6m_timer_ch, CALLOUT_MPSAFE); callout_setfunc(&in6m->in6m_timer_ch, mld_timeo, in6m); - IFP_TO_IA6(ifp, ia); + ia = in6_get_ia_from_ifp(ifp); if (ia == NULL) { callout_destroy(&in6m->in6m_timer_ch); free(in6m, M_IPMADDR); @@ -813,7 +813,7 @@ in6_savemkludge(struct in6_ifaddr *oia) struct in6_ifaddr *ia; struct in6_multi *in6m; - IFP_TO_IA6(oia->ia_ifp, ia); + ia = in6_get_ia_from_ifp(oia->ia_ifp); if (ia) { /* there is another address */ KASSERT(ia != oia); while ((in6m = LIST_FIRST(&oia->ia6_multiaddrs)) != NULL) {