IP 前缀转换上意外遇到的 Undefined Behavior

最近发现了两个很神奇的 Undefined Behavior ,出现在 Prefix Len 和 Netmask 的转换的问题下。一个简单思路可能是: #define PREFIX_BIN2DEC(bin) (32 - __builtin_ctz((bin))) #define PREFIX_DEC2BIN(hex) (((~0) >> (32 - (hex))) << (32 - (hex)) 乍一看,似乎没有什么问题。但是,在一些平台下,可能会出现这样的结果: PREFIX_BIN2DEC(0x00000000) = 33 PREFIX_DEC2BIN(0) = 0xFFFFFFFF 而且只能在一些平台上不确定地复现,最后发现其实是 Undefined Behavior,在 C 的标准中: In any case, the behavior is undefined if rhs is negative or is greater or equal the number of bits in the promoted lhs. 意味着, 0xFFFFFFFF >> 32 是一个 UB ,所以出现了上面的问题。

Read More

每周分享第 29 期

ZFS on Linux 发布 0.8.1 https://github.com/zfsonlinux/zfs/releases/tag/zfs-0.8.1 slim: Dockerfile to VM image https://github.com/ottomatica/slim Rust 重写的 du 替代物 确实很快 https://github.com/Byron/dua-cli iOS 13/macOS Catalina beta 2 出了 并且可以 OTA 相关信息 https://9to5mac.com/2019/06/17/ios-13-beta-2-features/ https://developer.apple.com/documentation/macos_release_notes/macos_catalina_10_15_beta_2_release_notes https://mp.weixin.qq.com/s/Ae1SIcK9ho4Mh0g_UsbAyA Steam 已经解决了 Catalina 上 32 位程序不能运行的问题 https://www.reddit.com/r/MacOS/comments/c17lh8/steam_and_macos_catalina 在一些老的 Mac 上 Sidecar 是默认关闭的,但是可以开启 https://github.com/pookjw/SidecarPatcher/blob/master/README.md 虽然效果不会很好

Read More

每周分享第 28 期

Rust Sec https://github.com/RustSec/advisory-db opendrop 开源的 AirDrop 实现 https://github.com/seemoo-lab/opendrop 代码内嵌图片 https://javl.github.io/image2cpp/ RAMBleed 攻击 https://readhacker.news/s/44MHD WSL2 可以体验了 https://devblogs.microsoft.com/commandline/wsl-2-is-now-available-in-windows-insiders/ Rust 2019 生态报告 https://www.jetbrains.com/lp/devecosystem-2019/rust/

Read More

每周分享第 27 期

高考加油! Fallout 漏洞 https://arxiv.org/abs/1905.12701 PageRank 专利到期 https://patents.google.com/patent/US6285999B1/en 终端电量可视化 https://github.com/svartalf/rust-battop 查找 DB 的 DB https://dbdb.io 在 Rust 里写 GPU 程序 https://github.com/calebwin/emu WWDC 2019 挺不错的 Alfred 4 发布 https://www.alfredapp.com/blog/announcements/alfred-4-is-here/ Mac Pro AR https://www.apple.com/105/media/us/mac-pro/2019/36178e80-30fd-441c-9a5b-349c6365bb36/quick-look/case-on.usdz VSCode 稳定版也可以 Remote 了 https://code.visualstudio.com/docs/remote/ssh 2019 高考语文作文 https://mp.weixin.qq.com/s/2NwkbbMlAUJpOKKuln1T4g

Read More

在 FPGA 上实现路由器(3)

前言 又半个月过去了,在写了上篇系列博文之后也是做了很多新的更改。上次做的主要是关于性能方面的提升,怎么提高频率,从而达到比较大的流量,而这段时间做的则是功能,做实现 RIP 协议和转发表的动态更新。 软件部分 软件部分目前是用 C 代码写的,用 Xilinx SDK 提供的各个 AXI 外设的驱动和PS自己的驱动,实现了所需要的,RIP协议的处理,转发表的更新和统计信息的读取。 实际上做的时候比较粗暴,主要是通过三种 AXI 外设与硬件部分进行交互:AXI Stream FIFO,AXI GPIO 和 AXI BRAM Controller 。其中 AXI Stream FIFO 是用来接收和发送需要CPU处理的以太网帧的,AXI GPIO则是用来读取统计的信息,AXI BRAM Controller 是用来读写转发表的。最后在顶层设计中把这些外设连接起来。 硬件部分 硬件部分还是继续之前的部分往下写,添加了统计信息,直接暴露出去,让 CPU 走 AXI GPIO 读,因为不需要很高的精确度;转发表本身,一开始想的是自己写一些接口转换,后来发现,直接用 True Dual Port RAM 然后把一个 port 暴露给 AXI BRAM Controller 即可,免去了各种麻烦,PS可以直接进行修改,不需要额外的工作。 最终效果 为了测试这套东西是否正常工作,就开了两个 Arch Linux 的虚拟机,分别 Bridge 到两个千兆的 USB 网卡上,都连到 FPGA 上。然后在两边都配上了 BIRD ,配置 RIP 和一些路由,确实能更新硬件的转发表,并两边的 RIP 可以学习到对方的路由。

Read More

每周分享第 26 期

Grafana 6.2 发布 https://grafana.com/blog/2019/05/22/grafana-v6.2-released/ Program Synthesis Talk by Paul Zhu https://paulz.me/talk/program-synthesis/ VSCode 摸鱼插件 https://github.com/cteams/Thief-Book 编译期 C++ 计算器 https://www.zhihu.com/question/28582706/answer/691444859 一个在线的 tomasulo 算法实现 https://tomasulo.harrychen.xyz/ Safari Technology Preview 83 发布,含 WebAuthN 支持 https://webkit.org/blog/8967/release-notes-for-safari-technology-preview-83/ Markdown -> 微信 https://github.com/lyricat/wechat-format Rust 的 Code Coverage 库 https://github.com/xd009642/tarpaulin

Read More

IP 和 UDP Checksum 的增量更新问题

之前在写 IP Checksum 的增量更新,就是当 TTL -= 1 的时候,Checksum 应该增加 0x0100 ,但是这样会有问题,在于,如果按照原来的 IP Checksum 计算方法,是不会出现 0xFFFF 的(求和,进位,然后取反写入),这种加法就有可能出现 0xFFFF 。于是翻阅了相关的RFC: 首先是 RFC 1141 相关部分: unsigned long sum; ipptr->ttl--; /* decrement ttl */ sum = ipptr->Checksum + 0x100; /* increment checksum high byte*/ ipptr->Checksum = (sum + (sum>>16)) /* add carry */ 这也是比较直接能想到的一种方法,但是会出现刚才提到的问题。于是 RFC 1624 纠正了这个问题: Although this equation appears to work, there are boundary conditions under which it produces a result which differs from the one obtained by checksum computation from scratch.

Read More

每周分享第 25 期

关掉各种 Intel BUG 的 mitigation https://t.me/one_real_world/1517 GCC 10 支持用 MMX 模拟 SSE http://www.phoronix.com/scan.php?page=news_item&px=GCC-10-Emulating-MMX-With-SSE Minecraft Earth 发布 https://www.minecraft.net/en-us/article/new-game--minecraft-earth# Python 官方 format 工具 https://github.com/python/black JS Binary AST Proposal https://github.com/tc39/proposal-binary-ast 用 Rust 实现的 ld https://github.com/aep/elfkit Verilog -> Minecraft https://github.com/itsFrank/MinecraftHDL Rust 实现的 光栅化输出 https://github.com/ecumene/rust-sloth/ Nokia 的 Rust 内存 profiler https://github.com/nokia/memory-profiler Linux 5.2 更新的 Logitech Wireless Device 驱动 正好能用上 http://www.phoronix.com/scan.php?page=news_item&px=Better-Logitech-Linux-5.2

Read More

Nginx 反代到 HTTPS 上游

这次遇到一个需求,要反代到不在内网的地址,为了保证安全,还是得上 HTTPS ,所以尝试了一下怎么给 upstream 配置自签名 HTTPS 证书的验证。 upstream subpath { server 4.3.2.1:4321; } server { listen 443 ssl; server_name test.example.com; location /abc { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_ssl_trusted_certificate /path/to/self_signed_cert.crt; proxy_ssl_name 1.2.3.4; // to override server name checking proxy_ssl_verify on; proxy_ssl_depth 2; proxy_ssl_reuse on; proxy_pass https://subpath; } } 可以用 openssl 获得自签名的 cert : echo | openssl s_client -showcerts -connect 4.3.2.1:4321 2>/dev/null | \ openssl x509 -text > /path/to/self_signed_cert.crt ref: https://stackoverflow.

Read More