7

私はGNURadioを試していて、tunnel.pyプログラムに出くわしました。このプログラムを使用すると、Linux TUN/TAPデバイスを使用してワイヤレス無線リンクを介してIPトラフィックをトンネリングできます。ほとんどの場合、それは機能していますが、コードの一部が私を混乱させています。

「基本MAC層」を実装するクラスがあります。このクラスには、TUNデバイスに新しいパケットを書き込むコールバック関数があります。この関数(phy_rx_callback)は別のスレッドから呼び出されます。

この関数main_loopは、新しいパケットを送信する前にキャリア検知を行います。私が理解していないのは、なぜそれが別の重複しない送信チャネルで送信する前に受信チャネルを検知しているのかということです。

RXチャネルとTXチャネルはどちらも別々の周波数であり、当社のハードウェアは全二重通信を可能にします。

だから、私の質問は実行に関するものです、関数main_loopを非同期的に呼び出す別のスレッドの意味は何ですか?phy_rx_callback問題は、キャリアセンスループの目的を理解しようとしていることです。そのコードにコメントを付けると、パフォーマンスが大幅に低下することがわかりました。送信チャネルを使用する前に受信チャネルを監視し、本質的にそれを半二重に変えることは私には意味がありません。次に、送信用と受信用の2つの周波数を使用する目的がわかりません。ここで奇妙なスレッドの問題が発生しているのではないかと思い始めました。

クラスの単一のインスタンスがcs_mac最初に作成されます。rx_callback関数への「ポインタ」は、実際にそれを呼び出すスレッドクラスにいくつかのレベルで渡されます。cs_macクラスは次のとおりです。

class cs_mac(object):
    def __init__(self, tun_fd, verbose=False):
        self.tun_fd = tun_fd       # file descriptor for TUN/TAP interface
        self.verbose = verbose
        self.tb = None             # top block (access to PHY)

    def set_top_block(self, tb):
        self.tb = tb

    def phy_rx_callback(self, ok, payload):
        if self.verbose:
            print "Rx: ok = %r  len(payload) = %4d" % (ok, len(payload))
        if ok:
            os.write(self.tun_fd, payload)

    def main_loop(self):
        min_delay = 0.001               # seconds
        while 1:
            payload = os.read(self.tun_fd, 10*1024)
            if not payload:
                self.tb.send_pkt(eof=True)
                break
            if self.verbose:
                print "Tx: len(payload) = %4d" % (len(payload),)
            delay = min_delay
            while self.tb.carrier_sensed():
                sys.stderr.write('B')
                time.sleep(delay)
                if delay < 0.050:
                    delay = delay * 2       # exponential back-off
            self.tb.send_pkt(payload)

さて、を使用すると、関数をctypes.CDLL('libc.so.6').syscall(186))呼び出すgettidスレッドのrx_callbackPIDは同じですが、TIDが異なることがわかりました。

問題は、別のスレッドがメインスレッドのオブジェクトから関数を呼び出すことの意味は何ですか(そのスレッドは常にループしています)?

4

1 に答える 1

0

関数main_loopは、新しいパケットを送信する前にキャリアセンスを実行します。私が理解していないのは、なぜそれが別の重複しない送信チャネルで送信する前に受信チャネルを検知しているのかということです。

CSMA / CAは、すべてのノードがTXとRXに同じ周波数を使用する半二重システムで使用することを目的としています。つまり、別のチャネルで送信している場合、RXチャネルを検知しても意味がありません。

carrier_sensed()はreceive_path.pyファイルで呼び出されるため、RXスレッドで実行する必要があります。私のコードでは、sys.stderr.write('B')とtime.sleep(delay)の行をコメントアウトしていますが、これはパフォーマンスに影響を与えていないようです。半二重のXCVRドーターボードを使用しているので、私の場合は違うかもしれません。

于 2011-04-21T03:19:43.137 に答える