我一直在尝试使用GNU Radio并遇到了tunnel.py程序.此程序允许您使用Linux TUN/TAP设备通过无线电链路隧道传输IP流量.在大多数情况下,它正在工作,但代码的一部分让我感到困惑.
有一个实现'基本MAC层'的类.该类具有回调函数,该函数将新数据包写入TUN设备.此函数(phy_rx_callback)从单独的线程调用.
该功能main_loop在发送新数据包之前执行载波检测.我不明白的是它为什么在单独的非重叠发送信道上发送之前检测接收信道.
RX和TX通道都是独立的频率,我们的硬件允许全双工通信.
所以,我的问题是main_loop执行,另一个线程异步调用phy_rx_callback函数的含义是什么?问题是我试图理解载波侦听循环的目的,我发现评论该代码会严重降低性能.在使用发送通道之前监视接收通道对我来说没有意义,实质上是将其转换为半双工.然后我没有看到使用两个频率的目的,一个用于发送,一个用于接收.我开始怀疑这里是否存在一个奇怪的线程问题.
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: …Run Code Online (Sandbox Code Playgroud) 可能重复:
如何计算数据包校验和而不发送它?
我已经在捕获的数据包中欺骗了源IP和MAC地址,但是现在我需要重新计算校验和,以便在收到它之后检查它(当然在注入网络之后).我自己并不想真正实现校验和,我认为scapy可以为我做这个.我读到该show2()函数应该重新计算校验和,但我似乎无法让它工作.
那么,我如何使用scapy重新计算(和替换)捕获+欺骗数据包的校验和?
谢谢!
我有两台机器,每台机器有两个有效的网络接口,一个以太网接口eth0和一个tun/tap接口gr0.目标是使用接口在机器A上启动TCP连接,gr0然后让机器B的响应(ACK等)通过以太网接口返回eth0.因此,机器A发出SYN gr0并且机器B自己接收SYN,gr0然后通过它发送它的SYN/ACK eth0.tun/tap设备是GNU Radio无线链路,我们只希望响应来自以太网.
最简单的方法是什么?我需要更多地研究TCP/IP,但我最初认为源欺骗传出数据包会告诉接收器响应欺骗地址(应该被路由到eth0).这将涉及从tun/tap接口路由IP gr0并将其他流量留给eth0.
我们使用Linux并且Python解决方案更可取.
谢谢你的期待!
我最近一直在研究一些用于软驱的bootstrap代码.我的目标是修改程序,以便它使用我的USB闪存驱动器.现在我看到INT 13H功能如何与软盘设备一起使用,但我想我的问题是,与USB驱动器的通信将如何不同?
例如,这是一个软盘代码片段(GNU汇编程序):
movb $0x00,%dl /* select 1st floppy */
/* later */
movw sec,%cx /* get sector number */
movw head,%dx /* get head number */
movw $0x0201,%ax /* read 1 sector */
int $0x13
Run Code Online (Sandbox Code Playgroud)
现在我已经读过将0x80移动到%dl将选择BIOS中的第一个HDD.在我的特定BIOS中,我可以更改驱动器顺序,其中包括USB驱动器.我很确定这会依赖于BIOS,但我认为BIOS中列出的顺序可能与我进入%dl的值相对应.我需要追踪一些文档......
我真的不熟悉使用块设备,有人能指出我开始学习更多的好地方吗?
谢谢!
最近我看着'dirent'结构(在dirent.h中)并且对它的定义感到有些困惑.
注意:此头文件来自我学校的Solaris计算机.
typedef struct dirent {
ino_t d_ino;
off_t d_off;
unsigned short d_reclen;
char d_name[1];
} dirent_t;
特别是d_name字段.这在操作系统中如何工作?如果你需要存储一个空终止字符串,那么单个字符串的数组有什么用?我知道你可以通过它的第一个元素获得数组的地址,但我仍然感到困惑.显然有些事情正在发生,但我不知道是什么.在我家的Fedora Linux系统上,这个字段简单地定义为:
char d_name[256];
Run Code Online (Sandbox Code Playgroud)
现在,由于显而易见的原因,这更有意义.有人可以解释为什么Solaris头文件定义结构吗?
好的,我需要对PCI BIOS服务目录(32位模式)执行CALL FAR以验证PCI BIOS是否存在.
注意:我正在开发一个简单的磁盘驱动程序,用于我们正在开发大学的简单操作系统.我知道这是非常具体的,但我将从内核代码中完成所有这些工作.
假设我已找到相关地址.执行远程调用给定地址的正确汇编语言是什么?有人可以发布一些远程调用给定32位地址的汇编代码吗?到目前为止我看到的例子的语法一直令人困惑.
谢谢!
编辑:在我的具体情况下,我已经找到了PCI BIOS服务目录,它给了我物理地址(32位).鉴于这个32位地址,我需要什么类型的远程调用?例如,我在英特尔手册中读到,远程调用可以改变任务,什么不可以.我怎么知道我要做什么来远远调用这个PCI BIOS服务目录的物理地址?
更新:
以下是我发现的一些令我困惑的代码(内联):
asm("lcall (%%edi)"
: "=a" (return_code),
"=b" (address),
"=c" (length),
"=d" (entry)
: "0" (service),
"1" (0),
"D" (&bios32_indirect));
我发现在这个源文件中:http://www.pell.portland.or.us/~orc/Code/Archive/linux-1.2.13/arch/i386/kernel/bios32.c
我想我想要做的就是在实际装配中相当于上面的内联.
我目前正在开发一个业余爱好操作系统,特别是ATA驱动程序.我在使用带有中断的PIO数据输入命令时遇到了一些问题.我正在尝试执行READ MULTIPLE命令,逐块地从驱动器读取多个扇区,每个块都有一个中断触发.
如果我请求读取4个块(每个块1个扇区).我希望得到4个中断,每个数据块一个.收到第4个中断后,我可以识别出我已经传输了所有数据并相应地更新了我的请求结构.但是,在VirtualBox中,我发现在传输完最后一个数据块后,我收到了另一个中断(STATUS = 0x50,READY,OVERLAPPED MODE SERVER REQ).我可以简单地读取STATUS寄存器然后清除它,但我不认为我应该根据规格接收第5个中断.
那么确认ATA设备发出的中断的正确方法是什么?
在这个例子中,我发出了一个READ MULTIPLE命令,然后我的ISR执行以下操作:
PIO数据输入命令协议的ATA规范并不表示您需要读取状态寄存器.由此我假设当我收到中断时,我所要做的就是遵循协议并通过将EOI发送到PIC完成.至于nIEN的设置/清除,在处理VirtualBox时我发现如果我不这样做,我就不会收到任何超过第一个的中断.所以我在进入ISR时设置了nIEN,然后在我离开之前将其清除.我认为这不会产生任何影响,但它必须与读/写特定寄存器有关.
我已经看过一些关于在Python程序中分析内存使用情况的问题,但到目前为止还没有能够解决任何问题.我的程序必须以root身份运行(它打开一个TUN/TAP设备).
首先,我试过heapy; 不幸的是,这对我不起作用.每次我的代码试图执行hpy().heap()程序冻结.不想浪费太多时间我决定尝试valgrind.
我试着带有地块的valgrind:
# valgrind --tool=massif ./my_prog.py --some-options value
Run Code Online (Sandbox Code Playgroud)
我认为这个问题与分析Python程序有关.我尝试了我的程序(以root身份运行)并且没有生成massif输出文件.我也无法使用另一个Python程序(不以root身份运行)生成输出文件.但是,一个简单的C测试程序工作正常并生成了massif文件.
阻止Valgrind和massif正确使用Python程序的问题是什么?
我需要编译一个以前使用Compaq Fortran编译器的旧Fortran程序.我似乎无法弄清楚以'#'开头的常数是什么.gfortran说它的语法错误,我似乎找不到很多答案.
CHAR2 = IATA(KK) - #20202030
CHAR3 = IATA(KK+1) - #20202030
Run Code Online (Sandbox Code Playgroud)
什么样的常数是#20202030什么?根据评论,此代码应在IATA中使用两个ASCII字符并将其转换为二进制.有人可以解释一下吗?
再向下:
IF (IATA(KK+1) .EQ. #2020202C) THEN
Run Code Online (Sandbox Code Playgroud)
现在最后有一个'C'.那是什么意思?
我该怎么把它移植到gfortran?感觉我错过了一些明显的东西.请赐教.
谢谢!
我知道这应该很简单,但我找不到类似的例子.
我需要以不同方式绘制不同范围的数据文件,但需要在同一图表上.
例如,假设我的数据文件表示具有x和y值的函数.我想使用类似线条的样式绘制前N个值,然后使用不同的样式(如点)绘制下一个M值.
我以为我需要一个类似于此的绘图命令:
plot [1:5] "my.data" using 1:2 with lines, [6:12] using 1:2 with points, [13:19] using 1:2 with lines
Run Code Online (Sandbox Code Playgroud)
基本上我想区分功能的不同区域.
有任何想法吗?我很抱歉,如果这听起来像是在漫无边际,但我很难过.
提前致谢!
我认为这是一个简单的问题,但我找不到答案.我主要是阅读这些规格:
http://www.nongnu.org/ext2-doc/ext2.html
似乎没有提到目录条目的名称是否应该以空值终止.我认为这是未定义的.有一个name_len字段,因此您可以轻松打印该名称.
ext2目录名是否保证以null结尾?
我问,因为在我的业余爱好操作系统上测试我的ext2驱动程序时,我注意到当我打印一些目录名时,最后会出现一些垃圾字符.如果我只是打印name_len字符,一切都很好,虽然它是好的,如果它是空终止的.
谢谢!
所以我有Python代码创建一个Linux TAP接口,但它总是提供一个随机的,自动生成的MAC地址.为了简化测试,我想在初始化后手动为接口分配MAC地址.我知道我可以用SIOCSIFHWADDRioctl 做到这一点struct ifreq,但我对实现有一些问题.
这是C结构:
struct ifreq
{
# define IFHWADDRLEN 6
# define IFNAMSIZ IF_NAMESIZE
union
{
char ifrn_name[IFNAMSIZ]; /* Interface name, e.g. "en0". */
} ifr_ifrn;
union
{
struct sockaddr ifru_addr;
struct sockaddr ifru_dstaddr;
struct sockaddr ifru_broadaddr;
struct sockaddr ifru_netmask;
struct sockaddr ifru_hwaddr;
short int ifru_flags;
int ifru_ivalue;
int ifru_mtu;
struct ifmap ifru_map;
char ifru_slave[IFNAMSIZ]; /* Just fits the size */
char ifru_newname[IFNAMSIZ];
__caddr_t ifru_data;
} ifr_ifru;
};
Run Code Online (Sandbox Code Playgroud)
现在我认为我只需填写该hwaddr字段,但这是一个联合我不知道如何在Python中创建结构.
在Python中调用SIOCSIFHWADDRioctl …