Matias Elo(matiaselo) replied on github web page:

platform/linux-generic/pktio/socket_mmap.c
line 64
@@ -202,6 +202,12 @@ static inline unsigned pkt_mmap_v2_rx(pktio_entry_t 
*pktio_entry,
                pkt_buf = (uint8_t *)ppd.raw + ppd.v2->tp_h.tp_mac;
                pkt_len = ppd.v2->tp_h.tp_snaplen;
 
+               if (odp_unlikely(pkt_len > pkt_sock->mtu)) {


Comment:
At this point the API is quite clear:
> Maximum frame length in bytes that the packet IO interface can receive.


> JannePeltonen wrote
> Why do these extra long packets need to be dropped?
> 
> Maybe odp_pktin_maxlen() is not defined clearly enough regarding unexpectedly 
> long packets. Does it merely promise that packets up to the maxlen can always 
> be received (as I thought) or does it also promise that no bigger packets 
> than that ever come out of the pktin? Would the latter be even useful?


>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>> Ok, clever. A comment might be useful here. 


>>> Matias Elo(matiaselo) wrote:
>>> Problem is that you cannot increase drop counters manually with socket 
>>> pktio. The counters are read directly from ethtool or sysfs. ODP_DBG() may 
>>> be the best option here.


>>>> muvarov wrote
>>>> inconsistent with counters.  You do not increase drop counter for pktio 
>>>> and silently drop packet. I would add at least ODP_DBG() so people on 
>>>> debug can see what is happening.


>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>> OK. From the original code's use of `%` I assumed that was the case. 
>>>>> Perhaps that's why this is a fix. :)


>>>>>> Matias Elo(matiaselo) wrote:
>>>>>> Will fix.


>>>>>>> Matias Elo(matiaselo) wrote:
>>>>>>> ring->rd_num is not guaranteed to be a power of two. At least on my 
>>>>>>> test system (28 lcores) it is not.


>>>>>>>> Matias Elo(matiaselo) wrote:
>>>>>>>> Will fix.


>>>>>>>>> Matias Elo(matiaselo) wrote:
>>>>>>>>> This array is used to update `stats.out_octets` correctly if 
>>>>>>>>> `enq_multi()` fails to enqueue all packets. Without it a second for 
>>>>>>>>> loop would be required inside `if (ret > 0)` clause below.


>>>>>>>>>> Matias Elo(matiaselo) wrote:
>>>>>>>>>> The most specific error type an application can see is 
>>>>>>>>>> odp_packet_has_l2_error(), so it cannot trust packet contents anyway.


>>>>>>>>>>> Matias Elo(matiaselo) wrote:
>>>>>>>>>>> Will fix.


>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>> The error bit simply says the packet was truncated to max length. 
>>>>>>>>>>>> Perhaps the application is only interested in the first few bytes 
>>>>>>>>>>>> of a packet?


>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>>> `ring->frame_num = next_frame(first_frame_num + nb_tx - 1, 
>>>>>>>>>>>>> frame_count);` is an alternative here.


>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>>>> Since `ring->rd_num` is a power of two, is the concern here that 
>>>>>>>>>>>>>> the `%` operator might result in a division if the compiler 
>>>>>>>>>>>>>> doesn't know that it's a power of two? In that case:
>>>>>>>>>>>>>> ```
>>>>>>>>>>>>>> return ++cur_frame & (frame_count - 1);
>>>>>>>>>>>>>> ```
>>>>>>>>>>>>>> solves that problem and avoids conditional branching.


>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>>>>> If we're cleaning up, might as well delete that extraneous `+` 
>>>>>>>>>>>>>>> in the above line: `TPACKET_ALIGNMENT + + (pz - 1)) & (-pz);` 
>>>>>>>>>>>>>>> I'm surprised the compiler doesn't flag that since it's 
>>>>>>>>>>>>>>> normally so picky about issuing warnings.


>>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>>>>>> Not sure I understand what `out_octets_tbl` is accumulating 
>>>>>>>>>>>>>>>> here. If I'm sending three 100 byte packets this will set 
>>>>>>>>>>>>>>>> `out_octets_tbl[0]` to 100, `out_octets_tbl[1]` to 200, and 
>>>>>>>>>>>>>>>> `out_octets_tbl[2]` to 300. 


>>>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>>>>>>> Since you're doing miscellaneous cleanups anyway, perhaps 
>>>>>>>>>>>>>>>>> changing `len` to `num` here should be considered? `len` is 
>>>>>>>>>>>>>>>>> confusing since it doesn't represent packet length.


>>>>>>>>>>>>>>>>>> Matias Elo(matiaselo) wrote:
>>>>>>>>>>>>>>>>>> The odp_pktin_maxlen() API states:
>>>>>>>>>>>>>>>>>> > Maximum frame length in bytes that the packet IO interface 
>>>>>>>>>>>>>>>>>> > can receive.
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> I interpret this so that the application shouln't see 
>>>>>>>>>>>>>>>>>> packets which exceed pktin max length.
>>>>>>>>>>>>>>>>>> 


>>>>>>>>>>>>>>>>>>> muvarov wrote
>>>>>>>>>>>>>>>>>>> same here.


>>>>>>>>>>>>>>>>>>>> muvarov wrote
>>>>>>>>>>>>>>>>>>>> maybe to just set error bit and deliver this packet to 
>>>>>>>>>>>>>>>>>>>> application?


https://github.com/Linaro/odp/pull/397#discussion_r162599656
updated_at 2018-01-19 11:33:00

Reply via email to