diff options
Diffstat (limited to 'usr/src/cmd')
-rw-r--r-- | usr/src/cmd/cmd-inet/usr.sbin/ifconfig/ifconfig.c | 135 | ||||
-rw-r--r-- | usr/src/cmd/netadm/iu.ap.sh | 2 | ||||
-rw-r--r-- | usr/src/cmd/rcm_daemon/common/ip_rcm.c | 77 |
3 files changed, 114 insertions, 100 deletions
diff --git a/usr/src/cmd/cmd-inet/usr.sbin/ifconfig/ifconfig.c b/usr/src/cmd/cmd-inet/usr.sbin/ifconfig/ifconfig.c index 595b76248e..ed8ab462f5 100644 --- a/usr/src/cmd/cmd-inet/usr.sbin/ifconfig/ifconfig.c +++ b/usr/src/cmd/cmd-inet/usr.sbin/ifconfig/ifconfig.c @@ -182,8 +182,8 @@ static void usage(void); static int strioctl(int s, int cmd, char *buf, int buflen); static int setifdhcp(const char *caller, const char *ifname, int argc, char *argv[]); -static int ip_domux2fd(int *, int *, int *, int *); -static int ip_plink(int, int, int, int); +static int ip_domux2fd(int *, int *, int *, int *, int *); +static int ip_plink(int, int, int, int, int); static int modop(char *arg, char op); static int get_lun(char *); static void selectifs(int argc, char *argv[], int af, @@ -571,7 +571,7 @@ foreachinterface(void (*func)(), int argc, char *argv[], int af, if (onflags || offflags) { (void) memset(&lifrl, 0, sizeof (lifrl)); (void) strncpy(lifrl.lifr_name, lifrp->lifr_name, - sizeof (lifrl.lifr_name)); + sizeof (lifrl.lifr_name)); if (ioctl(s, SIOCGLIFFLAGS, (caddr_t)&lifrl) < 0) { /* * Perror0() assumes the name to be in the @@ -1209,7 +1209,7 @@ static int set_tun_esp_encr_alg(char *addr, int64_t param) { return (set_tun_algs(ESP_ENCR_ALG, - parsealg(addr, IPSEC_PROTO_ESP))); + parsealg(addr, IPSEC_PROTO_ESP))); } /* ARGSUSED */ @@ -1217,7 +1217,7 @@ static int set_tun_esp_auth_alg(char *addr, int64_t param) { return (set_tun_algs(ESP_AUTH_ALG, - parsealg(addr, IPSEC_PROTO_AH))); + parsealg(addr, IPSEC_PROTO_AH))); } /* ARGSUSED */ @@ -1225,7 +1225,7 @@ static int set_tun_ah_alg(char *addr, int64_t param) { return (set_tun_algs(AH_AUTH_ALG, - parsealg(addr, IPSEC_PROTO_AH))); + parsealg(addr, IPSEC_PROTO_AH))); } /* ARGSUSED */ @@ -2224,6 +2224,7 @@ setifgroupname(char *grpname, int64_t param) static int modlist(char *null, int64_t param) { + int muxid_fd; int muxfd; int ipfd_lowstr; int arpfd_lowstr; @@ -2233,7 +2234,7 @@ modlist(char *null, int64_t param) int orig_arpid; (void) strncpy(lifr.lifr_name, name, sizeof (lifr.lifr_name)); - if (ip_domux2fd(&muxfd, &ipfd_lowstr, &arpfd_lowstr, + if (ip_domux2fd(&muxfd, &muxid_fd, &ipfd_lowstr, &arpfd_lowstr, &orig_arpid) < 0) { return (-1); } @@ -2255,14 +2256,15 @@ modlist(char *null, int64_t param) Perror0("cannot I_LIST for module names"); } else { for (i = 0; i < strlist.sl_nmods; i++) { - (void) printf("%d %s\n", i, - strlist.sl_modlist[i].l_name); + (void) printf("%d %s\n", i, + strlist.sl_modlist[i].l_name); } } free(strlist.sl_modlist); } } - return (ip_plink(muxfd, ipfd_lowstr, arpfd_lowstr, orig_arpid)); + return (ip_plink(muxfd, muxid_fd, ipfd_lowstr, arpfd_lowstr, + orig_arpid)); } #define MODINSERT_OP 'i' @@ -2291,27 +2293,26 @@ modremove(char *arg, int64_t param) } /* - * Open a stream on /dev/udp, pop off all undesired modules (note that - * the user may have configured autopush to add modules above or below - * udp), and push the arp module onto raw IP. + * Open a stream on /dev/udp{,6}, pop off all undesired modules (note that + * the user may have configured autopush to add modules above + * udp), and push the arp module onto the resulting stream. + * This is used to make IP+ARP be able to atomically track the muxid + * for the I_PLINKed STREAMS, thus it isn't related to ARP running the ARP + * protocol. */ static int open_arp_on_udp(char *udp_dev_name) { int fd; - boolean_t popped; if ((fd = open(udp_dev_name, O_RDWR)) == -1) { Perror2("open", udp_dev_name); return (-1); } errno = 0; - popped = _B_FALSE; while (ioctl(fd, I_POP, 0) != -1) - popped = _B_TRUE; - if (!popped) { - Perror2("cannot pop", udp_dev_name); - } else if (errno != EINVAL) { + ; + if (errno != EINVAL) { Perror2("pop", udp_dev_name); } else if (ioctl(fd, I_PUSH, ARP_MOD_NAME) == -1) { Perror2("arp PUSH", udp_dev_name); @@ -2328,8 +2329,10 @@ open_arp_on_udp(char *udp_dev_name) * global variable lifr. * * Param: - * int *udp_fd: (referenced) fd to /dev/udp (upper IP stream). - * int *fd: (referenced) fd to the lower IP stream. + * int *muxfd: fd to /dev/udp{,6} for I_PLINK/I_PUNLINK + * int *muxid_fd: fd to /dev/udp{,6} for LIFMUXID + * int *ipfd_lowstr: fd to the lower IP stream. + * int *arpfd_lowstr: fd to the lower ARP stream. * * Return: * -1 if operation fails, 0 otherwise. @@ -2338,12 +2341,11 @@ open_arp_on_udp(char *udp_dev_name) * for the logic of the PLINK/PUNLINK */ static int -ip_domux2fd(int *muxfd, int *ipfd_lowstr, int *arpfd_lowstr, int *orig_arpid) +ip_domux2fd(int *muxfd, int *muxid_fd, int *ipfd_lowstr, int *arpfd_lowstr, + int *orig_arpid) { - int ip_fd; uint64_t flags; char *udp_dev_name; - char *ip_dev_name; *orig_arpid = 0; (void) strncpy(lifr.lifr_name, name, sizeof (lifr.lifr_name)); @@ -2353,20 +2355,18 @@ ip_domux2fd(int *muxfd, int *ipfd_lowstr, int *arpfd_lowstr, int *orig_arpid) flags = lifr.lifr_flags; if (flags & IFF_IPV4) { udp_dev_name = UDP_DEV_NAME; - ip_dev_name = IP_DEV_NAME; } else if (flags & IFF_IPV6) { udp_dev_name = UDP6_DEV_NAME; - ip_dev_name = IP6_DEV_NAME; } else { return (-1); } - if ((ip_fd = open(ip_dev_name, O_RDWR)) < 0) { - Perror2("open", ip_dev_name); + if ((*muxid_fd = open(udp_dev_name, O_RDWR)) < 0) { + Perror2("open", udp_dev_name); return (-1); } - if (ioctl(ip_fd, SIOCGLIFMUXID, (caddr_t)&lifr) < 0) { - Perror2("SIOCGLIFMUXID", ip_dev_name); + if (ioctl(*muxid_fd, SIOCGLIFMUXID, (caddr_t)&lifr) < 0) { + Perror2("SIOCGLIFMUXID", udp_dev_name); return (-1); } if (debug > 0) { @@ -2374,6 +2374,9 @@ ip_domux2fd(int *muxfd, int *ipfd_lowstr, int *arpfd_lowstr, int *orig_arpid) lifr.lifr_arp_muxid, lifr.lifr_ip_muxid); } + /* + * Use /dev/udp{,6} as the mux to avoid linkcycles. + */ if ((*muxfd = open_arp_on_udp(udp_dev_name)) == -1) return (-1); @@ -2393,7 +2396,7 @@ ip_domux2fd(int *muxfd, int *ipfd_lowstr, int *arpfd_lowstr, int *orig_arpid) */ *orig_arpid = lifr.lifr_arp_muxid; lifr.lifr_arp_muxid = 0; - (void) ioctl(*muxfd, SIOCSLIFMUXID, + (void) ioctl(*muxid_fd, SIOCSLIFMUXID, (caddr_t)&lifr); *arpfd_lowstr = -1; } else { @@ -2415,7 +2418,7 @@ ip_domux2fd(int *muxfd, int *ipfd_lowstr, int *arpfd_lowstr, int *orig_arpid) /* Undo any changes we made */ if (*orig_arpid != 0) { lifr.lifr_arp_muxid = *orig_arpid; - (void) ioctl(*muxfd, SIOCSLIFMUXID, (caddr_t)&lifr); + (void) ioctl(*muxid_fd, SIOCSLIFMUXID, (caddr_t)&lifr); } return (-1); } @@ -2424,7 +2427,7 @@ ip_domux2fd(int *muxfd, int *ipfd_lowstr, int *arpfd_lowstr, int *orig_arpid) /* Undo any changes we made */ if (*orig_arpid != 0) { lifr.lifr_arp_muxid = *orig_arpid; - (void) ioctl(*muxfd, SIOCSLIFMUXID, (caddr_t)&lifr); + (void) ioctl(*muxid_fd, SIOCSLIFMUXID, (caddr_t)&lifr); } return (-1); } @@ -2439,8 +2442,10 @@ ip_domux2fd(int *muxfd, int *ipfd_lowstr, int *arpfd_lowstr, int *orig_arpid) * must be called in pairs. * * Param: - * int udp_fd: fd to /dev/udp (upper IP stream). - * int fd: fd to the lower IP stream. + * int muxfd: fd to /dev/udp{,6} for I_PLINK/I_PUNLINK + * int muxid_fd: fd to /dev/udp{,6} for LIFMUXID + * int ipfd_lowstr: fd to the lower IP stream. + * int arpfd_lowstr: fd to the lower ARP stream. * * Return: * -1 if operation fails, 0 otherwise. @@ -2449,7 +2454,8 @@ ip_domux2fd(int *muxfd, int *ipfd_lowstr, int *arpfd_lowstr, int *orig_arpid) * for the logic of the PLINK/PUNLINK */ static int -ip_plink(int muxfd, int ipfd_lowstr, int arpfd_lowstr, int orig_arpid) +ip_plink(int muxfd, int muxid_fd, int ipfd_lowstr, int arpfd_lowstr, + int orig_arpid) { int ip_muxid; @@ -2474,9 +2480,11 @@ ip_plink(int muxfd, int ipfd_lowstr, int arpfd_lowstr, int orig_arpid) /* Undo the changes we did in ip_domux2fd */ lifr.lifr_arp_muxid = orig_arpid; lifr.lifr_ip_muxid = ip_muxid; - (void) ioctl(muxfd, SIOCSLIFMUXID, (caddr_t)&lifr); + (void) ioctl(muxid_fd, SIOCSLIFMUXID, (caddr_t)&lifr); } + (void) close(muxfd); + (void) close(muxid_fd); return (0); } @@ -2497,6 +2505,7 @@ modop(char *arg, char op) { char *pos_p; int muxfd; + int muxid_fd; int ipfd_lowstr; /* IP stream (lower stream of mux) to be plinked */ int arpfd_lowstr; /* ARP stream (lower stream of mux) to be plinked */ struct strmodconf mod; @@ -2551,7 +2560,7 @@ modop(char *arg, char op) } mod.pos = atoi(pos_p); - if (ip_domux2fd(&muxfd, &ipfd_lowstr, &arpfd_lowstr, + if (ip_domux2fd(&muxfd, &muxid_fd, &ipfd_lowstr, &arpfd_lowstr, &orig_arpid) < 0) { free(arg_str); return (-1); @@ -2581,7 +2590,8 @@ modop(char *arg, char op) break; } free(arg_str); - return (ip_plink(muxfd, ipfd_lowstr, arpfd_lowstr, orig_arpid)); + return (ip_plink(muxfd, muxid_fd, ipfd_lowstr, arpfd_lowstr, + orig_arpid)); } /* @@ -3101,7 +3111,7 @@ configinfo(char *null, int64_t param) (void) printf(" metric %d ", lifr.lifr_metric); } if (((flags & (IFF_VIRTUAL|IFF_LOOPBACK)) != IFF_VIRTUAL) && - ioctl(s, SIOCGLIFMTU, (caddr_t)&lifr) >= 0) + ioctl(s, SIOCGLIFMTU, (caddr_t)&lifr) >= 0) (void) printf(" mtu %d", lifr.lifr_metric); /* don't print index when in compatibility mode */ @@ -3259,7 +3269,7 @@ tun_status(void) if ((protocol == AF_INET6) && (icfg_get_tunnel_encaplimit(handle, &encaplimit) == - ICFG_SUCCESS)) { + ICFG_SUCCESS)) { if (!tabbed) { (void) printf("\t"); tabbed = _B_TRUE; @@ -3350,7 +3360,7 @@ in_status(int force, uint64_t flags) (void) memset(&lifr.lifr_addr, 0, sizeof (lifr.lifr_addr)); else - Perror0_exit("in_status: SIOCGLIFDSTADDR"); + Perror0_exit("in_status: SIOCGLIFDSTADDR"); } sin = (struct sockaddr_in *)&lifr.lifr_dstaddr; (void) printf("--> %s ", inet_ntoa(sin->sin_addr)); @@ -3363,7 +3373,7 @@ in_status(int force, uint64_t flags) (void) memset(&lifr.lifr_addr, 0, sizeof (lifr.lifr_addr)); else - Perror0_exit("in_status: SIOCGLIFBRDADDR"); + Perror0_exit("in_status: SIOCGLIFBRDADDR"); } sin = (struct sockaddr_in *)&lifr.lifr_addr; if (sin->sin_addr.s_addr != 0) { @@ -3450,7 +3460,7 @@ in6_status(int force, uint64_t flags) (void) memset(&lifr.lifr_addr, 0, sizeof (lifr.lifr_addr)); else - Perror0_exit("in_status6: SIOCGLIFDSTADDR"); + Perror0_exit("in_status6: SIOCGLIFDSTADDR"); } sin6 = (struct sockaddr_in6 *)&lifr.lifr_dstaddr; (void) printf("--> %s ", @@ -3466,7 +3476,7 @@ in6_status(int force, uint64_t flags) (void) memset(&lifr.lifr_addr, 0, sizeof (lifr.lifr_addr)); else - Perror0_exit("in_status6: SIOCGLIFTOKEN"); + Perror0_exit("in_status6: SIOCGLIFTOKEN"); } else { sin6 = (struct sockaddr_in6 *)&lifr.lifr_addr; (void) printf("token %s/%d ", @@ -3569,7 +3579,7 @@ in_configinfo(int force, uint64_t flags) (void) memset(&lifr.lifr_addr, 0, sizeof (lifr.lifr_addr)); else - Perror0_exit("in_configinfo: SIOCGLIFDSTADDR"); + Perror0_exit("in_configinfo: SIOCGLIFDSTADDR"); } sin = (struct sockaddr_in *)&lifr.lifr_dstaddr; (void) printf(" destination %s ", inet_ntoa(sin->sin_addr)); @@ -3582,7 +3592,7 @@ in_configinfo(int force, uint64_t flags) (void) memset(&lifr.lifr_addr, 0, sizeof (lifr.lifr_addr)); else - Perror0_exit("in_configinfo: SIOCGLIFBRDADDR"); + Perror0_exit("in_configinfo: SIOCGLIFBRDADDR"); } sin = (struct sockaddr_in *)&lifr.lifr_addr; if (sin->sin_addr.s_addr != 0) { @@ -3678,7 +3688,7 @@ in6_configinfo(int force, uint64_t flags) (void) memset(&lifr.lifr_addr, 0, sizeof (lifr.lifr_addr)); else - Perror0_exit("in6_configinfo: SIOCGLIFDSTADDR"); + Perror0_exit("in6_configinfo: SIOCGLIFDSTADDR"); } sin6 = (struct sockaddr_in6 *)&lifr.lifr_dstaddr; (void) printf(" destination %s ", @@ -3692,7 +3702,7 @@ in6_configinfo(int force, uint64_t flags) (void) memset(&lifr.lifr_addr, 0, sizeof (lifr.lifr_addr)); else - Perror0_exit("in6_configinfo: SIOCGLIFTOKEN"); + Perror0_exit("in6_configinfo: SIOCGLIFTOKEN"); } else { sin6 = (struct sockaddr_in6 *)&lifr.lifr_addr; (void) printf(" token %s/%d ", @@ -3761,10 +3771,10 @@ get_lun(char *rsrc) * and IP uses the info in the I_PLINK message to get the muxid. * * a. STREAMS does not allow us to use /dev/ip itself as the mux. So we use - * /dev/udp[6]. + * /dev/udp{,6}. * b. SIOCGLIFMUXID returns the muxid corresponding to the V4 or V6 stream * depending on the open i.e. V4 vs V6 open. So we need to use /dev/udp - * or /dev/udp6. + * or /dev/udp6 for SIOCGLIFMUXID and SIOCSLIFMUXID. * c. We need to push ARP in order to get the required kernel support for * atomic plumbings. The actual work done by ARP is explained in arp.c * Without pushing ARP, we will still be able to plumb/unplumb. But @@ -3963,6 +3973,7 @@ inetunplumb(char *arg, int64_t param) { int ip_muxid, arp_muxid; int mux_fd; + int muxid_fd; char *udp_dev_name; char *strptr; uint64_t flags; @@ -3994,15 +4005,18 @@ inetunplumb(char *arg, int64_t param) else udp_dev_name = UDP_DEV_NAME; + if ((muxid_fd = open(udp_dev_name, O_RDWR)) == -1) + exit(EXIT_FAILURE); + if ((mux_fd = open_arp_on_udp(udp_dev_name)) == -1) exit(EXIT_FAILURE); (void) strncpy(lifr.lifr_name, name, sizeof (lifr.lifr_name)); - if (ioctl(mux_fd, SIOCGLIFFLAGS, (caddr_t)&lifr) < 0) { + if (ioctl(muxid_fd, SIOCGLIFFLAGS, (caddr_t)&lifr) < 0) { Perror0_exit("unplumb: SIOCGLIFFLAGS"); } flags = lifr.lifr_flags; - if (ioctl(mux_fd, SIOCGLIFMUXID, (caddr_t)&lifr) < 0) { + if (ioctl(muxid_fd, SIOCGLIFMUXID, (caddr_t)&lifr) < 0) { Perror0_exit("unplumb: SIOCGLIFMUXID"); } arp_muxid = lifr.lifr_arp_muxid; @@ -4028,7 +4042,7 @@ inetunplumb(char *arg, int64_t param) * for consistency of IP-ARP streams. */ lifr.lifr_arp_muxid = 0; - (void) ioctl(mux_fd, SIOCSLIFMUXID, + (void) ioctl(muxid_fd, SIOCSLIFMUXID, (caddr_t)&lifr); changed_arp_muxid = _B_TRUE; } else { @@ -4048,12 +4062,13 @@ inetunplumb(char *arg, int64_t param) save_errno = errno; lifr.lifr_arp_muxid = arp_muxid; lifr.lifr_ip_muxid = ip_muxid; - (void) ioctl(mux_fd, SIOCSLIFMUXID, (caddr_t)&lifr); + (void) ioctl(muxid_fd, SIOCSLIFMUXID, (caddr_t)&lifr); errno = save_errno; } Perror0_exit("I_PUNLINK for ip"); } (void) close(mux_fd); + (void) close(muxid_fd); return (0); } @@ -4146,17 +4161,17 @@ Perror0(char *cmd) case ENXIO: (void) fprintf(stderr, "%s: %s: no such interface\n", - cmd, lifr.lifr_name); + cmd, lifr.lifr_name); break; case EPERM: (void) fprintf(stderr, "%s: %s: permission denied\n", - cmd, lifr.lifr_name); + cmd, lifr.lifr_name); break; case EEXIST: (void) fprintf(stderr, "%s: %s: already exists\n", - cmd, lifr.lifr_name); + cmd, lifr.lifr_name); break; default: { @@ -4189,12 +4204,12 @@ Perror2(char *cmd, char *str) case ENXIO: (void) fprintf(stderr, "%s: %s: no such interface\n", - cmd, str); + cmd, str); break; case EPERM: (void) fprintf(stderr, "%s: %s: permission denied\n", - cmd, str); + cmd, str); break; default: { diff --git a/usr/src/cmd/netadm/iu.ap.sh b/usr/src/cmd/netadm/iu.ap.sh index cf7d61c15d..abf930cade 100644 --- a/usr/src/cmd/netadm/iu.ap.sh +++ b/usr/src/cmd/netadm/iu.ap.sh @@ -43,7 +43,6 @@ case "$MACH" in usbser_edge -1 0 ldterm ttcompat usbsprl -1 0 ldterm ttcompat usbsksp -1 0 ldterm ttcompat - rts -1 0 rts [anchor] ipsecesp -1 0 ipsecesp ipsecah -1 0 ipsecah " > iu.ap @@ -73,7 +72,6 @@ case "$MACH" in usbsacm -1 0 ldterm ttcompat usbsprl -1 0 ldterm ttcompat usbsksp -1 0 ldterm ttcompat - rts -1 0 rts [anchor] ttymux -1 0 ldterm ttcompat ipsecesp -1 0 ipsecesp ipsecah -1 0 ipsecah diff --git a/usr/src/cmd/rcm_daemon/common/ip_rcm.c b/usr/src/cmd/rcm_daemon/common/ip_rcm.c index 684df3130c..f4a896e41a 100644 --- a/usr/src/cmd/rcm_daemon/common/ip_rcm.c +++ b/usr/src/cmd/rcm_daemon/common/ip_rcm.c @@ -283,8 +283,8 @@ static int mpathd_send_cmd(mpathd_cmd_t *); static int connect_to_mpathd(int); static int modop(char *, char *, int, char); static int get_modlist(char *, ip_lif_t *); -static int ip_domux2fd(int *, int *, struct lifreq *); -static int ip_plink(int, int, struct lifreq *); +static int ip_domux2fd(int *, int *, int *, struct lifreq *); +static int ip_plink(int, int, int, struct lifreq *); static int ip_onlinelist(rcm_handle_t *, ip_cache_t *, char **, uint_t, rcm_info_t **); static int ip_offlinelist(rcm_handle_t *, ip_cache_t *, char **, uint_t, @@ -2287,7 +2287,8 @@ modop(char *name, char *arg, int pos, char op) static int get_modlist(char *name, ip_lif_t *lif) { - int udp_fd; + int mux_fd; + int muxid_fd; int fd; int i; int num_mods; @@ -2298,7 +2299,7 @@ get_modlist(char *name, ip_lif_t *lif) (void) strncpy(lifr.lifr_name, name, sizeof (lifr.lifr_name)); lifr.lifr_flags = lif->li_ifflags; - if (ip_domux2fd(&udp_fd, &fd, &lifr) < 0) { + if (ip_domux2fd(&mux_fd, &muxid_fd, &fd, &lifr) < 0) { rcm_log_message(RCM_ERROR, _("IP: ip_domux2fd(%s)\n"), name); return (-1); } @@ -2307,7 +2308,7 @@ get_modlist(char *name, ip_lif_t *lif) rcm_log_message(RCM_ERROR, _("IP: get_modlist(%s): I_LIST(%s) \n"), name, strerror(errno)); - (void) ip_plink(udp_fd, fd, &lifr); + (void) ip_plink(mux_fd, muxid_fd, fd, &lifr); return (-1); } @@ -2317,7 +2318,7 @@ get_modlist(char *name, ip_lif_t *lif) if (strlist.sl_modlist == NULL) { rcm_log_message(RCM_ERROR, _("IP: get_modlist(%s): %s\n"), name, strerror(errno)); - (void) ip_plink(udp_fd, fd, &lifr); + (void) ip_plink(mux_fd, muxid_fd, fd, &lifr); return (-1); } @@ -2325,7 +2326,7 @@ get_modlist(char *name, ip_lif_t *lif) rcm_log_message(RCM_ERROR, _("IP: get_modlist(%s): I_LIST error: %s\n"), name, strerror(errno)); - (void) ip_plink(udp_fd, fd, &lifr); + (void) ip_plink(mux_fd, muxid_fd, fd, &lifr); return (-1); } @@ -2336,7 +2337,7 @@ get_modlist(char *name, ip_lif_t *lif) rcm_log_message(RCM_ERROR, _("IP: get_modlist(%s): %s\n"), name, strerror(errno)); - (void) ip_plink(udp_fd, fd, &lifr); + (void) ip_plink(mux_fd, muxid_fd, fd, &lifr); return (-1); } (void) strcpy(lif->li_modules[i], strlist.sl_modlist[i].l_name); @@ -2346,7 +2347,7 @@ get_modlist(char *name, ip_lif_t *lif) free(strlist.sl_modlist); rcm_log_message(RCM_TRACE1, "IP: getmodlist(%s) success\n", name); - return (ip_plink(udp_fd, fd, &lifr)); + return (ip_plink(mux_fd, muxid_fd, fd, &lifr)); } /* @@ -2354,37 +2355,34 @@ get_modlist(char *name, ip_lif_t *lif) * Stolen from ifconfig.c */ static int -ip_domux2fd(int *udp_fd, int *fd, struct lifreq *lifr) +ip_domux2fd(int *mux_fd, int *muxid_fdp, int *fd, struct lifreq *lifr) { - int ip_fd; + int muxid_fd; char *udp_dev_name; - char *ip_dev_name; if (lifr->lifr_flags & IFF_IPV6) { - udp_dev_name = UDP6_DEV_NAME; - ip_dev_name = IP6_DEV_NAME; + udp_dev_name = UDP6_DEV_NAME; } else { - udp_dev_name = UDP_DEV_NAME; - ip_dev_name = IP_DEV_NAME; + udp_dev_name = UDP_DEV_NAME; } - if ((ip_fd = open(ip_dev_name, O_RDWR)) < 0) { + if ((muxid_fd = open(udp_dev_name, O_RDWR)) < 0) { rcm_log_message(RCM_ERROR, _("IP: ip_domux2fd: open(%s) %s\n"), - ip_dev_name, strerror(errno)); + udp_dev_name, strerror(errno)); return (-1); } - if ((*udp_fd = open(udp_dev_name, O_RDWR)) < 0) { + if ((*mux_fd = open(udp_dev_name, O_RDWR)) < 0) { rcm_log_message(RCM_ERROR, _("IP: ip_domux2fd: open(%s) %s\n"), udp_dev_name, strerror(errno)); - (void) close(ip_fd); + (void) close(muxid_fd); return (-1); } - if (ioctl(ip_fd, SIOCGLIFMUXID, (caddr_t)lifr) < 0) { + if (ioctl(muxid_fd, SIOCGLIFMUXID, (caddr_t)lifr) < 0) { rcm_log_message(RCM_ERROR, _("IP: ip_domux2fd: SIOCGLIFMUXID(%s): %s\n"), - ip_dev_name, strerror(errno)); - (void) close(*udp_fd); - (void) close(ip_fd); + udp_dev_name, strerror(errno)); + (void) close(*mux_fd); + (void) close(muxid_fd); return (-1); } @@ -2392,25 +2390,25 @@ ip_domux2fd(int *udp_fd, int *fd, struct lifreq *lifr) "IP: ip_domux2fd: ARP_muxid %d IP_muxid %d\n", lifr->lifr_arp_muxid, lifr->lifr_ip_muxid); - if ((*fd = ioctl(*udp_fd, _I_MUXID2FD, lifr->lifr_ip_muxid)) < 0) { + if ((*fd = ioctl(*mux_fd, _I_MUXID2FD, lifr->lifr_ip_muxid)) < 0) { rcm_log_message(RCM_ERROR, _("IP: ip_domux2fd: _I_MUXID2FD(%s): %s\n"), udp_dev_name, strerror(errno)); - (void) close(*udp_fd); - (void) close(ip_fd); + (void) close(*mux_fd); + (void) close(muxid_fd); return (-1); } - if (ioctl(*udp_fd, I_PUNLINK, lifr->lifr_ip_muxid) < 0) { + if (ioctl(*mux_fd, I_PUNLINK, lifr->lifr_ip_muxid) < 0) { rcm_log_message(RCM_ERROR, _("IP: ip_domux2fd: I_PUNLINK(%s): %s\n"), udp_dev_name, strerror(errno)); - (void) close(*udp_fd); - (void) close(ip_fd); + (void) close(*mux_fd); + (void) close(muxid_fd); return (-1); } - /* Note: udp_fd is closed in ip_plink below */ - (void) close(ip_fd); + /* Note: mux_fd and muxid_fd are closed in ip_plink below */ + *muxid_fdp = muxid_fd; return (0); } @@ -2419,29 +2417,32 @@ ip_domux2fd(int *udp_fd, int *fd, struct lifreq *lifr) * Stolen from ifconfig.c */ static int -ip_plink(int udp_fd, int fd, struct lifreq *lifr) +ip_plink(int mux_fd, int muxid_fd, int fd, struct lifreq *lifr) { int mux_id; - if ((mux_id = ioctl(udp_fd, I_PLINK, fd)) < 0) { + if ((mux_id = ioctl(mux_fd, I_PLINK, fd)) < 0) { rcm_log_message(RCM_ERROR, _("IP: ip_plink I_PLINK(%s): %s\n"), UDP_DEV_NAME, strerror(errno)); - (void) close(udp_fd); + (void) close(mux_fd); + (void) close(muxid_fd); (void) close(fd); return (-1); } lifr->lifr_ip_muxid = mux_id; - if (ioctl(udp_fd, SIOCSLIFMUXID, (caddr_t)lifr) < 0) { + if (ioctl(muxid_fd, SIOCSLIFMUXID, (caddr_t)lifr) < 0) { rcm_log_message(RCM_ERROR, _("IP: ip_plink SIOCSLIFMUXID(%s): %s\n"), UDP_DEV_NAME, strerror(errno)); - (void) close(udp_fd); + (void) close(mux_fd); + (void) close(muxid_fd); (void) close(fd); return (-1); } - (void) close(udp_fd); + (void) close(mux_fd); + (void) close(muxid_fd); (void) close(fd); return (0); } |