[OpenWrt-Devel] [PATCH] comgt: add ncm proto support
John Crispin
blogic at openwrt.org
Thu Oct 9 08:25:37 EDT 2014
On 09/10/2014 14:14, Bjørn Mork wrote:
> "Conor O'Gorman" <i at conorogorman.net> writes:
>> On 08/10/14 11:00, John Crispin wrote:
>>> the e3267 that sami sent me works with this proto, but i am
>>> failing to get a DHCP addr. could someone with a ncm dongle
>>> please try this patch on top of latest trunk please and tell me
>>> if they are getting a dhcp addr ?
>>
>> I had a similar problem with a Huawei device. It worked after
>> removing some zero padding in the ncm driver.
>>
>> In cdc_ncm.c, cdc_ncm_fill_tx_frame(), towards the end there is
>> handling for Zero Length Packets (ZLP) and padding short packets.
>> I removed the padding, and it worked. Are you testing 3.10 or
>> 3.14? It's changed ever so slightly between them.
>>
>> I am somewhat confused by the comment. It won't pad out short
>> packets, but does make shortish packets long.
>
> I don't have an fix for this bug, but I can try to add some
> background wrt the driver code...
>
> The NCM protocol assumes a powerful host and a much less powerful
> device (modem). It also assumes that devices can operate more
> efficiently if all (or most) packets have the same length, enabling
> the device DMA engine to operate on its own without involving the
> device CPU. These assumptions were true for all NCM devices and
> hosts implemented at the time the protocol was finalized. They are
> not necessarily true today. But we still have to deal with those
> assumptions somehow.
>
> One of the implications of this is that the device will operate
> more efficiently if the host pads packets the maximum length. On
> the other hand, this padding does of course cost extra bandwidth
> and buffer usage, so there is some cutoff point for really short
> packets. This is CDC_NCM_MIN_TX_PKT (512 bytes in the current NCM
> linux driver).
>
> So if a NCM packet exceeds 512 bytes then it is padded to max
> size. This maximum size is decided by the device (i.e. modem), but
> sanitized by the Linux driver. Most traditional NCM devices have
> buffers in the order of 4 or 8kB, which limits the overhead caused
> by the padding somewhat. But some Huawei devices have much larger
> buffers, causing an insane padding overhead given the fixed 512
> bytes cutoff even if the driver sanitize the values somewhat. This
> is one of the issues I tried to fix in Linux v3.16. Whether it was
> successful remains to be seen, but at least v3.16 gives us (the
> users) a lot more control over the process by adding a few
> tunables. And some informational attributes as well.
>
> This is an example from v3.16+ (with an MBIM device, but the code
> and issues are both common):
>
> bjorn at nemi:~$ grep . /sys/class/net/wwan0/cdc_ncm/*
> /sys/class/net/wwan0/cdc_ncm/bmNtbFormatsSupported:0x0001
> /sys/class/net/wwan0/cdc_ncm/dwNtbInMaxSize:15360
> /sys/class/net/wwan0/cdc_ncm/dwNtbOutMaxSize:15360
> /sys/class/net/wwan0/cdc_ncm/min_tx_pkt:13824
> /sys/class/net/wwan0/cdc_ncm/rx_max:15360
> /sys/class/net/wwan0/cdc_ncm/tx_max:15360
> /sys/class/net/wwan0/cdc_ncm/tx_timer_usecs:400
> /sys/class/net/wwan0/cdc_ncm/wNdpInAlignment:4
> /sys/class/net/wwan0/cdc_ncm/wNdpInDivisor:1
> /sys/class/net/wwan0/cdc_ncm/wNdpInPayloadRemainder:0
> /sys/class/net/wwan0/cdc_ncm/wNdpOutAlignment:4
> /sys/class/net/wwan0/cdc_ncm/wNdpOutDivisor:32
> /sys/class/net/wwan0/cdc_ncm/wNdpOutPayloadRemainder:0
> /sys/class/net/wwan0/cdc_ncm/wNtbOutMaxDatagrams:32
>
>
> Here you can see the device specified TX and RX buffer sizes
> ("dwNtb*MaxSize") and also the buffers sizes currently in use by
> the driver ("rx_max"/"tx_max"). And finally the "min_tx_pkt"
> attribute, which has replaced the fixed CDC_NCM_MIN_TX_PKT. This
> is now dynamically calculated based on rx_max, and, as you can see
> from the values above, not causing that much overhead.
>
> Here's an example from a Huawei device (also MBIM), where the
> driver has sanitized the insane 128 kB buffer to 16 kB.
>
> bjorn at nemi:~$ grep . /sys/class/net/wwan1/cdc_ncm/*
> /sys/class/net/wwan1/cdc_ncm/bmNtbFormatsSupported:0x0003
> /sys/class/net/wwan1/cdc_ncm/dwNtbInMaxSize:131072
> /sys/class/net/wwan1/cdc_ncm/dwNtbOutMaxSize:32768
> /sys/class/net/wwan1/cdc_ncm/min_tx_pkt:14849
> /sys/class/net/wwan1/cdc_ncm/rx_max:16384
> /sys/class/net/wwan1/cdc_ncm/tx_max:16385
> /sys/class/net/wwan1/cdc_ncm/tx_timer_usecs:400
> /sys/class/net/wwan1/cdc_ncm/wNdpInAlignment:4
> /sys/class/net/wwan1/cdc_ncm/wNdpInDivisor:4
> /sys/class/net/wwan1/cdc_ncm/wNdpInPayloadRemainder:0
> /sys/class/net/wwan1/cdc_ncm/wNdpOutAlignment:4
> /sys/class/net/wwan1/cdc_ncm/wNdpOutDivisor:4
> /sys/class/net/wwan1/cdc_ncm/wNdpOutPayloadRemainder:0
> /sys/class/net/wwan1/cdc_ncm/wNtbOutMaxDatagrams:0
>
> And the last example from a device with extremely small buffers:
>
> bjorn at nemi:~$ grep . /sys/class/net/wwan2/cdc_ncm/*
> /sys/class/net/wwan2/cdc_ncm/bmNtbFormatsSupported:0x0001
> /sys/class/net/wwan2/cdc_ncm/dwNtbInMaxSize:2048
> /sys/class/net/wwan2/cdc_ncm/dwNtbOutMaxSize:2048
> /sys/class/net/wwan2/cdc_ncm/min_tx_pkt:512
> /sys/class/net/wwan2/cdc_ncm/rx_max:2048
> /sys/class/net/wwan2/cdc_ncm/tx_max:2048
> /sys/class/net/wwan2/cdc_ncm/tx_timer_usecs:400
> /sys/class/net/wwan2/cdc_ncm/wNdpInAlignment:4
> /sys/class/net/wwan2/cdc_ncm/wNdpInDivisor:4
> /sys/class/net/wwan2/cdc_ncm/wNdpInPayloadRemainder:0
> /sys/class/net/wwan2/cdc_ncm/wNdpOutAlignment:4
> /sys/class/net/wwan2/cdc_ncm/wNdpOutDivisor:4
> /sys/class/net/wwan2/cdc_ncm/wNdpOutPayloadRemainder:0
> /sys/class/net/wwan2/cdc_ncm/wNtbOutMaxDatagrams:1
>
>
> An interesting feature here is those 3 buffer size attributes are
> writeable, along with the aggregation timeout:
>
> bjorn at nemi:~$ ls -l /sys/class/net/wwan0/cdc_ncm/* -r--r--r-- 1
> root root 4096 Oct 9 10:27
> /sys/class/net/wwan0/cdc_ncm/bmNtbFormatsSupported -r--r--r-- 1
> root root 4096 Oct 9 10:27
> /sys/class/net/wwan0/cdc_ncm/dwNtbInMaxSize -r--r--r-- 1 root root
> 4096 Oct 9 10:27 /sys/class/net/wwan0/cdc_ncm/dwNtbOutMaxSize
> -rw-r--r-- 1 root root 4096 Oct 9 10:27
> /sys/class/net/wwan0/cdc_ncm/min_tx_pkt -rw-r--r-- 1 root root 4096
> Oct 9 10:27 /sys/class/net/wwan0/cdc_ncm/rx_max -rw-r--r-- 1 root
> root 4096 Oct 9 10:27 /sys/class/net/wwan0/cdc_ncm/tx_max
> -rw-r--r-- 1 root root 4096 Oct 9 10:27
> /sys/class/net/wwan0/cdc_ncm/tx_timer_usecs -r--r--r-- 1 root root
> 4096 Oct 9 10:27 /sys/class/net/wwan0/cdc_ncm/wNdpInAlignment
> -r--r--r-- 1 root root 4096 Oct 9 10:27
> /sys/class/net/wwan0/cdc_ncm/wNdpInDivisor -r--r--r-- 1 root root
> 4096 Oct 9 10:27
> /sys/class/net/wwan0/cdc_ncm/wNdpInPayloadRemainder -r--r--r-- 1
> root root 4096 Oct 9 10:27
> /sys/class/net/wwan0/cdc_ncm/wNdpOutAlignment -r--r--r-- 1 root
> root 4096 Oct 9 10:27 /sys/class/net/wwan0/cdc_ncm/wNdpOutDivisor
> -r--r--r-- 1 root root 4096 Oct 9 10:27
> /sys/class/net/wwan0/cdc_ncm/wNdpOutPayloadRemainder -r--r--r-- 1
> root root 4096 Oct 9 10:27
> /sys/class/net/wwan0/cdc_ncm/wNtbOutMaxDatagrams
>
> I know some OpenWRT hosts have had problems using NCM modems with
> really big buffers (typically Huawei modems), and am hoping that
> this feature will allow those issues to be resolved. Unfortunately
> not for anything based on v3.10 or v3.14, but at least in CC...
>
> Just one warning: I initially hoped to auto-configure the
> attributes to globally perfect values, but that turned out to be
> impossible due to device differences. Some buggy devices will fail
> if you change any of the buffer sizes from their defaults. So
> don't do that blindly, or on a wholesale basis. That's also one of
> the reasons why these settings are per-device.
>
> Hmm, I thought I had written some docs for this somewhere, but it
> doesn't seem so. Well, feel free to improve that now that I've
> posted everything I remember :-)
>
>
>
> Bjørn
ok, i am currently bumping some targets to v3.17. lets assume it is
broken for < 3.16 and hope 3.17 works.
NCM seems to be broken by design and only a container as each dongle
apparently uses its own AT magic. at least between Motorola, Sony and
Huawei they are totally different.
personally i have been using mbim since i wrote umbim and it just works :)
thanks for the insight, lets hope it works after the kernel bump
> _______________________________________________ openwrt-devel
> mailing list openwrt-devel at lists.openwrt.org
> https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel
>
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel
More information about the openwrt-devel
mailing list