From 5e72785d4280b46fdf0d2f9a7e158ed8bd43e031 Mon Sep 17 00:00:00 2001 From: PFierek Date: Mon, 5 Dec 2016 15:24:38 +0100 Subject: [PATCH] Move tunnel interface dependency from a codec to spinel-cli. Issue: #960 (#1041) --- tools/spinel-cli/spinel-cli.py | 33 +++++++++++++++++++------------- tools/spinel-cli/spinel/codec.py | 15 +-------------- tools/spinel-cli/spinel/tun.py | 6 +++++- 3 files changed, 26 insertions(+), 28 deletions(-) diff --git a/tools/spinel-cli/spinel-cli.py b/tools/spinel-cli/spinel-cli.py index 240cf9ad7..d423df5bc 100755 --- a/tools/spinel-cli/spinel-cli.py +++ b/tools/spinel-cli/spinel-cli.py @@ -72,6 +72,7 @@ from spinel.const import kThread from spinel.codec import WpanApi from spinel.codec import SpinelCodec from spinel.stream import StreamOpen +from spinel.tun import TunInterface import spinel.config as CONFIG import spinel.util as util @@ -98,6 +99,7 @@ class SpinelCliCmd(Cmd, SpinelCodec): def __init__(self, stream_desc, nodeid, *_a, **kw): self.nodeid = kw.get('nodeid', '1') + self.tun_if = None self.wpan_api = WpanApi(stream_desc, nodeid) self.wpan_api.queue_register(SPINEL.HEADER_DEFAULT) @@ -879,8 +881,8 @@ class SpinelCliCmd(Cmd, SpinelCodec): self.prop_insert_value(SPINEL.PROP_IPV6_ADDRESS_TABLE, arr, str(len(arr)) + 's') - if self.wpan_api.tun_if: - self.wpan_api.tun_if.addr_add(ipaddr) + if self.tun_if: + self.tun_if.addr_add(ipaddr) elif params[0] == "remove": arr += self.wpan_api.encode_fields('CLLC', @@ -891,8 +893,8 @@ class SpinelCliCmd(Cmd, SpinelCodec): self.prop_remove_value(SPINEL.PROP_IPV6_ADDRESS_TABLE, arr, str(len(arr)) + 's') - if self.wpan_api.tun_if: - self.wpan_api.tun_if.addr_del(ipaddr) + if self.tun_if: + self.tun_if.addr_del(ipaddr) print("Done") @@ -1741,18 +1743,23 @@ class SpinelCliCmd(Cmd, SpinelCodec): pass elif params[0] == "add": - if self.wpan_api.tun_if: - self.wpan_api.tun_if.addr_add(ipaddr) + if self.tun_if: + self.tun_if.addr_add(ipaddr) elif params[0] == "remove": - if self.wpan_api.tun_if: - self.wpan_api.tun_if.addr_del(ipaddr) + if self.tun_if: + self.tun_if.addr_del(ipaddr) - elif params[0] == "up": - self.wpan_api.if_up(self.nodeid) + elif params[0] == "up": + if os.geteuid() == 0: + self.tun_if = TunInterface(nodeid) + else: + print("Warning: superuser required to start tun interface.") elif params[0] == "down": - self.wpan_api.if_down() + if self.tun_if: + self.tun_if.close() + self.tun_if = None elif params[0] == "ping": # Use tunnel to send ping @@ -1766,8 +1773,8 @@ class SpinelCliCmd(Cmd, SpinelCodec): if len(params) > 3: _interval = params[3] - if self.wpan_api.tun_if: - self.wpan_api.tun_if.ping6( + if self.tun_if: + self.tun_if.ping6( " -c " + count + " -s " + size + " " + ipaddr) print("Done") diff --git a/tools/spinel-cli/spinel/codec.py b/tools/spinel-cli/spinel/codec.py index be332f518..4a72182a3 100644 --- a/tools/spinel-cli/spinel/codec.py +++ b/tools/spinel-cli/spinel/codec.py @@ -57,7 +57,7 @@ from spinel.const import kThread from spinel.const import SPINEL from spinel.const import SPINEL_LAST_STATUS_MAP from spinel.hdlc import Hdlc -from spinel.tun import TunInterface + FEATURE_USE_HDLC = 1 @@ -724,8 +724,6 @@ class WpanApi(SpinelCodec): """ Helper class to format wpan command packets """ def __init__(self, stream, nodeid, use_hdlc=FEATURE_USE_HDLC): - - self.tun_if = None self.stream = stream self.nodeid = nodeid @@ -859,17 +857,6 @@ class WpanApi(SpinelCodec): return item - def if_up(self, nodeid='1'): - if os.geteuid() == 0: - self.tun_if = TunInterface(nodeid) - else: - print("Warning: superuser required to start tun interface.") - - def if_down(self): - if self.tun_if: - self.tun_if.close() - self.tun_if = None - def ip_send(self, pkt): pay = self.encode_i(SPINEL.PROP_STREAM_NET) diff --git a/tools/spinel-cli/spinel/tun.py b/tools/spinel-cli/spinel/tun.py index b40ed325c..c48f31e67 100644 --- a/tools/spinel-cli/spinel/tun.py +++ b/tools/spinel-cli/spinel/tun.py @@ -31,13 +31,15 @@ from __future__ import print_function import os import sys -import fcntl import struct import logging import threading import traceback import subprocess +if sys.platform == "linux" or sys.platform == "linux2": + import fcntl + from select import select import spinel.util as util @@ -63,6 +65,8 @@ class TunInterface(object): self.__init_linux() elif platform == "darwin": self.__init_osx() + else: + raise RuntimeError("Platform \"{}\" is not supported.".format(platform)) self.ifconfig("up") #self.ifconfig("inet6 add fd00::1/64")