今天把RNDIS的包抓了。
总的来说,感觉和CDC的区别不是很大。
枚举之后就是大量的这种send - response - get的流程。
然后就是在Data EP上跑以太包。
和普通CDC的区别在于,普通CDC的data EP上传的是应用数据, RNDIS的data EP上传的是以太包。
有个有趣的问题,如何知道一个以太包的开始和结束?
spec给出的解决方案是:
USB BULK 一次最大传512字节。
如果以太包小于512,那收下来的就是一个完整的以太包。
如果以太包大于512,就发送512*N + M, M<512。
这就是说,从开始就收512字节的包,一直到收到小于512的BULK包为止。
如果以太包是512的倍数,spec要求必须要在最后发一个长度为0的包。
这样我们就可以从BULK包(USB信道)中恢复出一个完整的以太包了。
下图解析了ARP是如何over USB的,以及RNDIS是如何解析的。