On 11/20/2014 04:05 PM, Gonglei wrote:
> On 2014/11/20 15:50, Jason Wang wrote:
>
>>>> Maybe just initialize iov unconditionally at the beginning and check
>>>>>> dot1q_buf instead of iov for the rest of the functions. (Need deal with
>>>>>> size < ETHER_ADDR_LEN * 2)
>>>> More complicated, because we can't initialize iov when
>>>>  "size < ETHER_ADDR_LEN * 2".
>>>>
>>>> Best regards,
>>>> -Gonglei
>>>>
>> Probably not: you can just do something like:
>>
>>     if (dot1q_buf && size < ETHER_ADDR_LEN * 2) {
>>         dot1q_buf = NULL;
>>     }
>>
>> and check dot1q_buf afterwards. Or just drop the packet since its size
>> was less than mininum frame length that Ethernet allows.
> Sorry, I don't understand. But,
> what's your meaning "initialize iov unconditionally at the beginning"?

Something like:

@@ -1774,7 +1774,12 @@ static uint32_t
rtl8139_RxConfig_read(RTL8139State *s)
 static void rtl8139_transfer_frame(RTL8139State *s, uint8_t *buf, int size,
     int do_interrupt, const uint8_t *dot1q_buf)
 {
-    struct iovec *iov = NULL;
+    struct iovec iov[3] = {
+        { .iov_base = buf, .iov_len = ETHER_ADDR_LEN * 2 },
+        { .iov_base = (void *) dot1q_buf, .iov_len = VLAN_HLEN },
+        { .iov_base = buf + ETHER_ADDR_LEN * 2,
+          .iov_len = size - ETHER_ADDR_LEN * 2 },
+    };

and assign dot1q_buf to NULL is size is not ok.

Just a suggestion, your call.

Reply via email to