Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/net Pull RTM_CHANGE code out of route_output to make fur...



details:   https://anonhg.NetBSD.org/src/rev/7e5d123fbe8e
branches:  trunk
changeset: 348558:7e5d123fbe8e
user:      ozaki-r <ozaki-r%NetBSD.org@localhost>
date:      Wed Oct 26 06:49:10 2016 +0000

description:
Pull RTM_CHANGE code out of route_output to make further changes easy

No functional change.

diffstat:

 sys/net/rtsock.c |  141 ++++++++++++++++++++++++++++--------------------------
 1 files changed, 73 insertions(+), 68 deletions(-)

diffs (179 lines):

diff -r c432c4205587 -r 7e5d123fbe8e sys/net/rtsock.c
--- a/sys/net/rtsock.c  Wed Oct 26 06:10:39 2016 +0000
+++ b/sys/net/rtsock.c  Wed Oct 26 06:49:10 2016 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: rtsock.c,v 1.197 2016/10/03 11:06:06 ozaki-r Exp $     */
+/*     $NetBSD: rtsock.c,v 1.198 2016/10/26 06:49:10 ozaki-r Exp $     */
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -61,7 +61,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rtsock.c,v 1.197 2016/10/03 11:06:06 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rtsock.c,v 1.198 2016/10/26 06:49:10 ozaki-r Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -593,6 +593,73 @@
        return ifa;
 }
 
+static int
+route_output_change(struct rtentry *rt, struct rt_addrinfo *info,
+    struct rt_xmsghdr *rtm)
+{
+       int error = 0;
+       struct ifnet *ifp, *new_ifp;
+       struct ifaddr *ifa, *new_ifa;
+       struct psref psref_ifa, psref_new_ifa, psref_ifp;
+
+       /*
+        * new gateway could require new ifaddr, ifp;
+        * flags may also be different; ifp may be specified
+        * by ll sockaddr when protocol address is ambiguous
+        */
+       ifp = rt_getifp(info, &psref_ifp);
+       ifa = rt_getifa(info, &psref_ifa);
+       if (ifa == NULL) {
+               error = ENETUNREACH;
+               goto out;
+       }
+       if (info->rti_info[RTAX_GATEWAY]) {
+               error = rt_setgate(rt, info->rti_info[RTAX_GATEWAY]);
+               if (error != 0)
+                       goto out;
+       }
+       if (info->rti_info[RTAX_TAG]) {
+               const struct sockaddr *tag;
+               tag = rt_settag(rt, info->rti_info[RTAX_TAG]);
+               if (tag == NULL) {
+                       error = ENOBUFS;
+                       goto out;
+               }
+       }
+       /* new gateway could require new ifaddr, ifp;
+          flags may also be different; ifp may be specified
+          by ll sockaddr when protocol address is ambiguous */
+       new_ifa = route_output_get_ifa(*info, rt, &new_ifp, &psref_new_ifa);
+       if (new_ifa != NULL) {
+               ifa_release(ifa, &psref_ifa);
+               ifa = new_ifa;
+       }
+       if (ifa) {
+               struct ifaddr *oifa = rt->rt_ifa;
+               if (oifa != ifa) {
+                       if (oifa && oifa->ifa_rtrequest)
+                               oifa->ifa_rtrequest(RTM_DELETE, rt, info);
+                       rt_replace_ifa(rt, ifa);
+                       rt->rt_ifp = new_ifp;
+               }
+               if (new_ifa == NULL)
+                       ifa_release(ifa, &psref_ifa);
+       }
+       ifa_release(new_ifa, &psref_new_ifa);
+       if (new_ifp && rt->rt_ifp != new_ifp)
+               rt->rt_ifp = new_ifp;
+       rt_setmetrics(rtm->rtm_inits, rtm, rt);
+       if (rt->rt_flags != info->rti_flags)
+               rt->rt_flags = (info->rti_flags & ~PRESERVED_RTF)
+                   | (rt->rt_flags & PRESERVED_RTF);
+       if (rt->rt_ifa && rt->rt_ifa->ifa_rtrequest)
+               rt->rt_ifa->ifa_rtrequest(RTM_ADD, rt, info);
+out:
+       if_put(ifp, &psref_ifp);
+
+       return error;
+}
+
 /*ARGSUSED*/
 int
 COMPATNAME(route_output)(struct mbuf *m, struct socket *so)
@@ -604,11 +671,8 @@
        struct rtentry *saved_nrt = NULL;
        struct rt_addrinfo info;
        int len, error = 0;
-       struct ifnet *ifp = NULL;
-       struct ifaddr *ifa = NULL;
        sa_family_t family;
        struct sockaddr_dl sdl;
-       struct psref psref;
        int bound = curlwp_bind();
 
 #define senderr(e) do { error = e; goto flush;} while (/*CONSTCOND*/ 0)
@@ -818,70 +882,11 @@
                        }
                        break;
 
-               case RTM_CHANGE: {
-                       struct ifnet *_ifp;
-                       struct ifaddr *_ifa;
-                       struct psref _psref, psref_ifp;
-                       /*
-                        * new gateway could require new ifaddr, ifp;
-                        * flags may also be different; ifp may be specified
-                        * by ll sockaddr when protocol address is ambiguous
-                        */
-                       _ifp = rt_getifp(&info, &psref_ifp);
-                       ifa = rt_getifa(&info, &psref);
-                       if (ifa == NULL) {
-                               if_put(_ifp, &psref_ifp);
-                               senderr(ENETUNREACH);
-                       }
-                       if (info.rti_info[RTAX_GATEWAY]) {
-                               error = rt_setgate(rt,
-                                   info.rti_info[RTAX_GATEWAY]);
-                               if (error != 0) {
-                                       if_put(_ifp, &psref_ifp);
-                                       senderr(error);
-                               }
-                       }
-                       if (info.rti_info[RTAX_TAG]) {
-                               const struct sockaddr *tag;
-                               tag = rt_settag(rt, info.rti_info[RTAX_TAG]);
-                               if (tag == NULL) {
-                                       if_put(_ifp, &psref_ifp);
-                                       senderr(ENOBUFS);
-                               }
-                       }
-                       /* new gateway could require new ifaddr, ifp;
-                          flags may also be different; ifp may be specified
-                          by ll sockaddr when protocol address is ambiguous */
-                       _ifa = route_output_get_ifa(info, rt, &ifp, &_psref);
-                       if (_ifa != NULL) {
-                               ifa_release(ifa, &psref);
-                               ifa = _ifa;
-                       }
-                       if (ifa) {
-                               struct ifaddr *oifa = rt->rt_ifa;
-                               if (oifa != ifa) {
-                                       if (oifa && oifa->ifa_rtrequest) {
-                                               oifa->ifa_rtrequest(RTM_DELETE,
-                                                   rt, &info);
-                                       }
-                                       rt_replace_ifa(rt, ifa);
-                                       rt->rt_ifp = ifp;
-                               }
-                               if (_ifa == NULL)
-                                       ifa_release(ifa, &psref);
-                       }
-                       ifa_release(_ifa, &_psref);
-                       if (ifp && rt->rt_ifp != ifp)
-                               rt->rt_ifp = ifp;
-                       rt_setmetrics(rtm->rtm_inits, rtm, rt);
-                       if (rt->rt_flags != info.rti_flags)
-                               rt->rt_flags = (info.rti_flags & ~PRESERVED_RTF)
-                                   | (rt->rt_flags & PRESERVED_RTF);
-                       if (rt->rt_ifa && rt->rt_ifa->ifa_rtrequest)
-                               rt->rt_ifa->ifa_rtrequest(RTM_ADD, rt, &info);
-                       if_put(_ifp, &psref_ifp);
+               case RTM_CHANGE:
+                       error = route_output_change(rt, &info, rtm);
+                       if (error != 0)
+                               goto flush;
                        /*FALLTHROUGH*/
-                   }
                case RTM_LOCK:
                        rt->rt_rmx.rmx_locks &= ~(rtm->rtm_inits);
                        rt->rt_rmx.rmx_locks |=



Home | Main Index | Thread Index | Old Index