/** * mipv6_mn_move_homeaddr - Move home address from one interface to another. * @ifindex: interface index to which home address is moved * @haddr: home address * * When an interface is stopped home addresses on that if need to be * moved to another interface. **/ int mipv6_mn_move_homeaddr(int ifindex, struct in6_addr *haddr) { struct in6_ifreq ifreq; #ifdef CONFIG_IPV6_MOBILITY_DEBUG struct net_device *dev = NULL; #endif DEBUG_FUNC(); /* TODO!! */ ifreq.ifr6_prefixlen = 64; ipv6_addr_copy(&ifreq.ifr6_addr, haddr); addrconf_del_ifaddr((void *)&ifreq); ifreq.ifr6_ifindex = ifindex; addrconf_add_ifaddr((void *)&ifreq); #ifdef CONFIG_IPV6_MOBILITY_DEBUG dev = dev_get_by_index(ifindex); if (dev) { DEBUG((DBG_INFO, "Moved HA to %s", dev->name)); dev_put(dev); } #endif return 0; }
static int inet6_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) { struct sock *sk = sock->sk; int err = -EINVAL; int pid; switch(cmd) { case FIOSETOWN: case SIOCSPGRP: err = get_user(pid, (int *) arg); if(err) return err; /* see sock_no_fcntl */ if (current->pid != pid && current->pgrp != -pid && !capable(CAP_NET_ADMIN)) return -EPERM; sk->proc = pid; return(0); case FIOGETOWN: case SIOCGPGRP: err = put_user(sk->proc,(int *)arg); if(err) return err; return(0); case SIOCGSTAMP: if(sk->stamp.tv_sec==0) return -ENOENT; err = copy_to_user((void *)arg, &sk->stamp, sizeof(struct timeval)); if (err) return -EFAULT; return 0; case SIOCADDRT: case SIOCDELRT: return(ipv6_route_ioctl(cmd,(void *)arg)); case SIOCSIFADDR: return addrconf_add_ifaddr((void *) arg); case SIOCDIFADDR: return addrconf_del_ifaddr((void *) arg); case SIOCSIFDSTADDR: return addrconf_set_dstaddr((void *) arg); default: if ((cmd >= SIOCDEVPRIVATE) && (cmd <= (SIOCDEVPRIVATE + 15))) return(dev_ioctl(cmd,(void *) arg)); if(sk->prot->ioctl==0 || (err=sk->prot->ioctl(sk, cmd, arg))==-ENOIOCTLCMD) return(dev_ioctl(cmd,(void *) arg)); return err; } /*NOTREACHED*/ return(0); }