私は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_callback
PIDは同じですが、TIDが異なることがわかりました。
問題は、別のスレッドがメインスレッドのオブジェクトから関数を呼び出すことの意味は何ですか(そのスレッドは常にループしています)?