~serge-hallyn/ubuntu/quantal/lxc/lxc-fixapi

« back to all changes in this revision

Viewing changes to src/lxc/network.c

  • Committer: Bazaar Package Importer
  • Author(s): Guido Trotter
  • Date: 2010-01-10 10:40:21 UTC
  • mto: (1.1.2 upstream) (3.1.2 sid)
  • mto: This revision was merged to the branch mainline in revision 5.
  • Revision ID: james.westby@ubuntu.com-20100110104021-ff3ukvpu7yzc36hm
ImportĀ upstreamĀ versionĀ 0.6.4

Show diffs side-by-side

added added

removed removed

Lines of Context:
81
81
        struct ifaddrmsg ifa;
82
82
};
83
83
 
84
 
int lxc_device_move(const char *name, pid_t pid)
 
84
int lxc_device_move(int ifindex, pid_t pid)
85
85
{
86
86
        struct nl_handler nlh;
87
87
        struct nlmsg *nlmsg = NULL;
88
88
        struct link_req *link_req;
89
 
        int index, len, err = -1;
 
89
        int err = -1;
90
90
 
91
91
        if (netlink_open(&nlh, NETLINK_ROUTE))
92
92
                return -1;
93
93
 
94
 
        len = strlen(name);
95
 
        if (len == 1 || len > IFNAMSIZ)
96
 
                goto out;
97
 
 
98
94
        nlmsg = nlmsg_alloc(NLMSG_GOOD_SIZE);
99
95
        if (!nlmsg)
100
96
                goto out;
101
97
 
102
 
        index = if_nametoindex(name);
103
 
        if (!index)
104
 
                goto out;
105
 
 
106
98
        link_req = (struct link_req *)nlmsg;
107
99
        link_req->ifinfomsg.ifi_family = AF_UNSPEC;
108
 
        link_req->ifinfomsg.ifi_index = index;
 
100
        link_req->ifinfomsg.ifi_index = ifindex;
109
101
        nlmsg->nlmsghdr.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg));
110
102
        nlmsg->nlmsghdr.nlmsg_flags = NLM_F_REQUEST|NLM_F_ACK;
111
103
        nlmsg->nlmsghdr.nlmsg_type = RTM_NEWLINK;
113
105
        if (nla_put_u32(nlmsg, IFLA_NET_NS_PID, pid))
114
106
                goto out;
115
107
 
116
 
        if (nla_put_string(nlmsg, IFLA_IFNAME, name))
117
 
                goto out;
118
 
 
119
108
        if (netlink_transaction(&nlh, nlmsg, nlmsg))
120
109
                goto out;
121
110
 
576
565
    return 0;
577
566
}
578
567
 
579
 
int lxc_ip_addr_add(const char *ifname, const char *addr,
580
 
                    int prefix, const char *bcast)
 
568
int lxc_ip_addr_add(int family, int ifindex, void *addr, int prefix)
581
569
{
582
570
        struct nl_handler nlh;
583
 
        struct in_addr in_addr;
584
 
/*      struct in_addr in_bcast; */
585
571
        struct nlmsg *nlmsg = NULL, *answer = NULL;
586
572
        struct ip_req *ip_req;
587
 
        int ifindex, err = -1;
 
573
        int addrlen;
 
574
        int err = -1;
 
575
 
 
576
        addrlen = family == AF_INET ? sizeof(struct in_addr) :
 
577
                sizeof(struct in6_addr);
588
578
 
589
579
        if (netlink_open(&nlh, NETLINK_ROUTE))
590
580
                return -1;
591
581
 
592
 
        if (inet_pton(AF_INET, addr, (void *)&in_addr) < 0)
593
 
                goto out;
594
 
 
595
 
/*      if (inet_pton(AF_INET, bcast, (void *)&in_bcast) < 0) */
596
 
/*                      goto out; */
597
 
 
598
582
        nlmsg = nlmsg_alloc(NLMSG_GOOD_SIZE);
599
583
        if (!nlmsg)
600
584
                goto out;
603
587
        if (!answer)
604
588
                goto out;
605
589
 
606
 
        ifindex = if_nametoindex(ifname);
607
 
        if (!ifindex)
608
 
                goto out;
609
 
 
610
590
        ip_req = (struct ip_req *)nlmsg;
611
591
        ip_req->nlmsg.nlmsghdr.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifaddrmsg));
612
592
        ip_req->nlmsg.nlmsghdr.nlmsg_flags =
614
594
        ip_req->nlmsg.nlmsghdr.nlmsg_type = RTM_NEWADDR;
615
595
        ip_req->ifa.ifa_prefixlen = prefix;
616
596
        ip_req->ifa.ifa_index = ifindex;
617
 
        ip_req->ifa.ifa_family = AF_INET;
 
597
        ip_req->ifa.ifa_family = family;
618
598
        ip_req->ifa.ifa_scope = 0;
619
599
        
620
 
        if (nla_put_buffer(nlmsg, IFA_LOCAL, &in_addr, sizeof(in_addr)))
 
600
        if (nla_put_buffer(nlmsg, IFA_LOCAL, addr, addrlen))
621
601
                goto out;
622
602
 
623
 
        if (nla_put_buffer(nlmsg, IFA_ADDRESS, &in_addr, sizeof(in_addr)))
 
603
        if (nla_put_buffer(nlmsg, IFA_ADDRESS, addr, addrlen))
624
604
                goto out;
625
605
 
626
606
/*      if (in_bcast.s_addr != INADDR_ANY) */
639
619
        return err;
640
620
}
641
621
 
642
 
int lxc_ip6_addr_add(const char *ifname, const char *addr,
643
 
                     int prefix, const char *bcast)
644
 
{
645
 
        struct nl_handler nlh;
646
 
        struct in6_addr in6_addr;
647
 
/*      struct in6_addr in6_bcast; */
648
 
        struct nlmsg *nlmsg = NULL, *answer = NULL;
649
 
        struct ip_req *ip_req;
650
 
        int ifindex, err = -1;
651
 
 
652
 
        if (netlink_open(&nlh, NETLINK_ROUTE))
653
 
                return -1;
654
 
 
655
 
        if (inet_pton(AF_INET6, addr, (void *)&in6_addr) < 0)
656
 
                goto out;
657
 
 
658
 
 
659
 
/*      if (inet_pton(AF_INET6, bcast, (void *)&in6_bcast) < 0) */
660
 
/*                      goto out; */
661
 
 
662
 
        nlmsg = nlmsg_alloc(NLMSG_GOOD_SIZE);
663
 
        if (!nlmsg)
664
 
                goto out;
665
 
 
666
 
        answer = nlmsg_alloc(NLMSG_GOOD_SIZE);
667
 
        if (!answer)
668
 
                goto out;
669
 
 
670
 
        ifindex = if_nametoindex(ifname);
671
 
        if (!ifindex)
672
 
                goto out;
673
 
 
674
 
        ip_req = (struct ip_req *)nlmsg;
675
 
        ip_req->nlmsg.nlmsghdr.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifaddrmsg));
676
 
        ip_req->nlmsg.nlmsghdr.nlmsg_flags =
677
 
                NLM_F_ACK|NLM_F_REQUEST|NLM_F_CREATE|NLM_F_EXCL;
678
 
        ip_req->nlmsg.nlmsghdr.nlmsg_type = RTM_NEWADDR;
679
 
        ip_req->ifa.ifa_prefixlen = prefix;
680
 
        ip_req->ifa.ifa_index = ifindex;
681
 
        ip_req->ifa.ifa_family = AF_INET6;
682
 
        ip_req->ifa.ifa_scope = 0;
683
 
        
684
 
        if (nla_put_buffer(nlmsg, IFA_LOCAL, &in6_addr, sizeof(in6_addr)))
685
 
                goto out;
686
 
 
687
 
        if (nla_put_buffer(nlmsg, IFA_ADDRESS, &in6_addr, sizeof(in6_addr)))
688
 
                goto out;
689
 
 
690
 
/*      if (in6_bcast.s6_addr != in6addr_any.s6_addr) */
691
 
/*              if (nla_put_buffer(nlmsg, IFA_BROADCAST, &in6_bcast, */
692
 
/*                                 sizeof(in6_bcast))) */
693
 
/*                      goto out; */
694
 
 
695
 
        if (netlink_transaction(&nlh, nlmsg, answer))
696
 
                goto out;
697
 
 
698
 
        err = 0;
699
 
out:
700
 
        netlink_close(&nlh);
701
 
        nlmsg_free(answer);
702
 
        nlmsg_free(nlmsg);
703
 
        return err;
704
 
}
705
 
 
706
622
static int bridge_add_del_interface(const char *bridge, 
707
623
                                    const char *ifname, int detach)
708
624
{