From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47195) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Yb0PS-0008FL-H1 for qemu-devel@nongnu.org; Thu, 26 Mar 2015 01:32:54 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Yb0PO-0007GE-B6 for qemu-devel@nongnu.org; Thu, 26 Mar 2015 01:32:50 -0400 Received: from szxga01-in.huawei.com ([58.251.152.64]:34606) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Yb0PN-0007Fh-9l for qemu-devel@nongnu.org; Thu, 26 Mar 2015 01:32:46 -0400 From: zhanghailiang Date: Thu, 26 Mar 2015 13:29:25 +0800 Message-ID: <1427347774-8960-20-git-send-email-zhang.zhanghailiang@huawei.com> In-Reply-To: <1427347774-8960-1-git-send-email-zhang.zhanghailiang@huawei.com> References: <1427347774-8960-1-git-send-email-zhang.zhanghailiang@huawei.com> MIME-Version: 1.0 Content-Type: text/plain Subject: [Qemu-devel] [RFC PATCH v4 19/28] COLO NIC: Implement colo nic device interface configure() List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: lizhijian@cn.fujitsu.com, quintela@redhat.com, yunhong.jiang@intel.com, eddie.dong@intel.com, peter.huangpeng@huawei.com, dgilbert@redhat.com, zhanghailiang , arei.gonglei@huawei.com, amit.shah@redhat.com, david@gibson.dropbear.id.au Implement colo nic device interface configure() add a script to configure nic devices: ${QEMU_SCRIPT_DIR}/colo-proxy-script.sh Signed-off-by: zhanghailiang Signed-off-by: Li Zhijian --- net/colo-nic.c | 56 ++++++++++++++++++++++++- scripts/colo-proxy-script.sh | 97 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 152 insertions(+), 1 deletion(-) create mode 100755 scripts/colo-proxy-script.sh diff --git a/net/colo-nic.c b/net/colo-nic.c index 965af49..f8fc35d 100644 --- a/net/colo-nic.c +++ b/net/colo-nic.c @@ -39,12 +39,66 @@ static bool colo_nic_support(NetClientState *nc) return nc && nc->colo_script[0] && nc->colo_nicname[0]; } +static int launch_colo_script(char *argv[]) +{ + int pid, status; + char *script = argv[0]; + + /* try to launch network script */ + pid = fork(); + if (pid == 0) { + execv(script, argv); + _exit(1); + } else if (pid > 0) { + while (waitpid(pid, &status, 0) != pid) { + /* loop */ + } + + if (WIFEXITED(status) && WEXITSTATUS(status) == 0) { + return 0; + } + } + return -1; +} + +static int colo_nic_configure(NetClientState *nc, + bool up, int side, int index) +{ + int i, argc = 6; + char *argv[7], index_str[32]; + char **parg; + + if (!nc && index <= 0) { + error_report("Can not parse colo_script or colo_nicname"); + return -1; + } + + parg = argv; + *parg++ = nc->colo_script; + *parg++ = (char *)(side == COLO_SECONDARY_MODE ? "slave" : "master"); + *parg++ = (char *)(up ? "install" : "uninstall"); + *parg++ = nc->colo_nicname; + *parg++ = nc->ifname; + sprintf(index_str, "%d", index); + *parg++ = index_str; + *parg = NULL; + + for (i = 0; i < argc; i++) { + if (!argv[i][0]) { + error_report("Can not get colo_script argument"); + return -1; + } + } + + return launch_colo_script(argv); +} + void colo_add_nic_devices(NetClientState *nc) { struct nic_device *nic = g_malloc0(sizeof(*nic)); nic->support_colo = colo_nic_support; - nic->configure = NULL; + nic->configure = colo_nic_configure; /* * TODO * only support "-netdev tap,colo_scripte..." options diff --git a/scripts/colo-proxy-script.sh b/scripts/colo-proxy-script.sh new file mode 100755 index 0000000..e1a9154 --- /dev/null +++ b/scripts/colo-proxy-script.sh @@ -0,0 +1,97 @@ +#!/bin/sh +#usage: colo-proxy-script.sh master/slave install/uninstall phy_if virt_if index +#.e.g colo-proxy-script.sh master install eth2 tap0 1 + +side=$1 +action=$2 +phy_if=$3 +virt_if=$4 +index=$5 +br=br1 +failover_br=br0 + +script_usage() +{ + echo -n "usage: ./colo-proxy-script.sh master/slave " + echo -e "install/uninstall phy_if virt_if index\n" +} + +master_install() +{ + tc qdisc add dev $virt_if root handle 1: prio + tc filter add dev $virt_if parent 1: protocol ip prio 10 u32 match u32 \ + 0 0 flowid 1:2 action mirred egress mirror dev $phy_if + tc filter add dev $virt_if parent 1: protocol arp prio 11 u32 match u32 \ + 0 0 flowid 1:2 action mirred egress mirror dev $phy_if + tc filter add dev $virt_if parent 1: protocol ipv6 prio 12 u32 match u32 \ + 0 0 flowid 1:2 action mirred egress mirror dev $phy_if + + modprobe nf_conntrack_ipv4 + modprobe xt_PMYCOLO sec_dev=$phy_if + + /usr/local/sbin/iptables -t mangle -I PREROUTING -m physdev --physdev-in \ + $virt_if -j PMYCOLO --index $index + /usr/local/sbin/ip6tables -t mangle -I PREROUTING -m physdev --physdev-in \ + $virt_if -j PMYCOLO --index $index + /usr/local/sbin/arptables -I INPUT -i $phy_if -j MARK --set-mark $index +} + +master_uninstall() +{ + tc filter del dev $virt_if parent 1: protocol ip prio 10 u32 match u32 \ + 0 0 flowid 1:2 action mirred egress mirror dev $phy_if + tc filter del dev $virt_if parent 1: protocol arp prio 11 u32 match u32 \ + 0 0 flowid 1:2 action mirred egress mirror dev $phy_if + tc filter del dev $virt_if parent 1: protocol ipv6 prio 12 u32 match u32 \ + 0 0 flowid 1:2 action mirred egress mirror dev $phy_if + tc qdisc del dev $virt_if root handle 1: prio + + /usr/local/sbin/iptables -t mangle -F + /usr/local/sbin/ip6tables -t mangle -F + /usr/local/sbin/arptables -F + rmmod xt_PMYCOLO +} + +slave_install() +{ + brctl addif $br $phy_if + modprobe xt_SECCOLO + + /usr/local/sbin/iptables -t mangle -I PREROUTING -m physdev --physdev-in \ + $virt_if -j SECCOLO --index $index + /usr/local/sbin/ip6tables -t mangle -I PREROUTING -m physdev --physdev-in \ + $virt_if -j SECCOLO --index $index +} + +slave_uninstall() +{ + brctl delif $br $phy_if + brctl delif $br $virt_if + brctl addif $failover_br $virt_if + + /usr/local/sbin/iptables -t mangle -F + /usr/local/sbin/ip6tables -t mangle -F + rmmod xt_SECCOLO +} + +if [ $# -ne 5 ]; then + script_usage + exit 1 +fi + +if [ "x$side" != "xmaster" ] && [ "x$side" != "xslave" ]; then + script_usage + exit 2 +fi + +if [ "x$action" != "xinstall" ] && [ "x$action" != "xuninstall" ]; then + script_usage + exit 3 +fi + +if [ $index -lt 0 ] || [ $index -gt 100 ]; then + echo "index overflow" + exit 4 +fi + +${side}_${action} -- 1.7.12.4