小编Sre*_*esh的帖子

发送原始数据包时,sendto函数不使用struct sockaddr_ll中提供的MAC地址

我正在尝试使用原始套接字发送OAM以太网帧.我成功了.

我写的发送功能是:

    int send_frame(sock_info *info,char *buf,int length)
    {
       struct sockaddr_ll dest_addr;
       memset(&dest_addr,0,sizeof(struct sockaddr_ll));
       dest_addr.sll_family = PF_PACKET;
       dest_addr.sll_protocol = htons(8902);
       dest_addr.sll_ifindex = info->if_index;
       dest_addr.sll_halen = ETH_MAC_ADDR_LEN;
       dest_addr.sll_pkttype = PACKET_OTHERHOST;
       dest_addr.sll_hatype   = ARPHRD_ETHER;
       memset(dest_addr.sll_addr,0,8);

       dest_addr.sll_addr[0] = 0x00;
       dest_addr.sll_addr[1] = 0xE0;
       dest_addr.sll_addr[2] = 0x0C;
       dest_addr.sll_addr[3] = 0x00;
       dest_addr.sll_addr[4] = 0x95;
       dest_addr.sll_addr[5] = 0x02;

       return sendto(info->sock_fd, buf, length, 0, (struct sockaddr*) &dest_addr, sizeof(struct sockaddr_ll));
    }
Run Code Online (Sandbox Code Playgroud)

我无法使用wireshark捕获数据包.在尝试了太多的东西之后,我发现用于发送的缓冲区应该具有所有以太网帧字段(从目标地址开始).当我将目标和源地址以及其他以太网字段添加到缓冲区时,我能够使用wireshark捕获数据包.因此send函数不使用存储的MAC地址dest_addr.sll_addr.

我的问题是,那么sll_addr现场的需求是struct sockaddr_ll什么?手册说它是目标MAC地址.

c sockets linux network-programming

6
推荐指数
1
解决办法
3150
查看次数

Openssl:在SSL_CTX_load_verify_locations API中使用CApath参数时,证书验证失败

我正在尝试建立到服务器计算机的TLS连接.我使用openssl CLI命令创建了根CA证书和服务器证书.我创建了服务器证书,其通用名称与其IP地址相同.根CA证书的通用名称是服务器的FQDN.

我使用openssl库API建立与服务器的连接.我正在使用API

int SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *CAfile, const char *CApath)

用于设置CA文件查找路径.

当我使用CAfile参数指定我的CA文件的路径时,一切正常,将CApath参数保留为NULL.

但是,如果我使用CApath参数指定包含CA文件的目录的路径,将CAfile参数保留为NULL,则由于证书验证错误,连接将失败.

当我使用wireshark捕获数据包时,我发现我的客户端代码正在从服务器发送"服务器问候"的TLS响应"未知CA".我使用了在成功连接中使用的相同CA证书文件.

根据我在探索openssl库源代码时的观察,我推断,在我的情况下,CA文件不被认为是有效的,因此由于某些未知原因而未被库API加载.

有人可以告诉我原因,如果可能的话,可以解决这个问题吗?

c ssl openssl x509 tls1.2

4
推荐指数
1
解决办法
3095
查看次数

arm-elf 和 arm-none-eabi 工具链生成的可执行文件的格式有什么不同吗?

我正在尝试构建一个裸机臂项目。我尝试了 GNU 工具链arm-elfarm-none-eabi. 两个工具链生成的可执行文件在转换为英特尔十六进制格式时运行良好。

我正在使用 Proteus 软件进行模拟。Proteus 支持调试 elf 和 coff 格式的可执行文件。

在我的情况下,Proteus 接受由生成的可执行文件,arm-elf但在加载由arm-none-eabi. Proteus 显示的错误信息是:

在此处输入图片说明

我只是file在 linux 中运行命令,将两个可执行文件作为参数,一一运行。

结果如下所示。

arm-none-eabi 输出

图像:ELF 32 位 LSB 可执行文件,ARM,EABI5 版本 1 (SYSV),静态链接,未剥离

手臂精灵输出

图像:ELF 32 位 LSB 可执行文件,ARM,版本 1,静态链接,未剥离

是否有任何选项可以使用 arm-none-eabi 工具链生成与 Proteus 兼容的 elf 文件?

编辑:我的收费链版本的详细信息。

C:\SysGCC\arm-elf\bin>arm-elf-gcc.exe --version
arm-elf-gcc.exe (GCC) 4.6.3
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO …
Run Code Online (Sandbox Code Playgroud)

c gcc arm elf gnu-toolchain

4
推荐指数
1
解决办法
984
查看次数

ARM IRQ 处理程序在 GCC 中无法正常工作

我正在使用 LPC2138 SoC 开发裸机 ARM 项目。我已经为 I2C 编写了一个 IRQ 中断处理程序。但它没有正确返回。为单个中断重复调用处理程序。

我对这个问题做了详细的调试分析。

在 ARM7TDMI 参考手册中,它清楚地提到了以下内容。

在此处输入图片说明 但是当我反汇编代码时,我发现GCC生成的代码并没有恢复CPSR寄存器。最后也是一个未知值。

在此处输入图片说明

我已经声明了如下的 IRQ 处理程序

void I2C0_IRQ_handler(void) __attribute__ ((interrupt("IRQ")));
Run Code Online (Sandbox Code Playgroud)

这是 GCC 中的错误还是我做错了什么?

我用于构建项目的编译器、汇编器和链接器标志是:

CFLAGS := -mcpu=arm7tdmi-s -g3 -Wall -I. -gdwarf-2
AS_FLAGS := -mcpu=arm7tdmi-s -g3 -gdwarf-2
LD_FLAGS := -Wl,-Map,$(TARGET:%.hex=%).map -nostartfiles
Run Code Online (Sandbox Code Playgroud)

c gcc arm

0
推荐指数
1
解决办法
854
查看次数

标签 统计

c ×4

arm ×2

gcc ×2

elf ×1

gnu-toolchain ×1

linux ×1

network-programming ×1

openssl ×1

sockets ×1

ssl ×1

tls1.2 ×1

x509 ×1