@@ -180,35 +180,36 @@ static ssize_t handle_write(netdev_t *netdev,
180
180
/* Require existing 'desc_idx' to use as iteration variable, and input
181
181
* 'buffer_idx'.
182
182
*/
183
- #define VNET_ITERATE_BUFFER (checked , body ) \
184
- desc_idx = buffer_idx; \
185
- while (1) { \
186
- if (checked && desc_idx >= queue->QueueNum) \
187
- return virtio_net_set_fail(vnet); \
188
- const uint32_t *desc = &ram[queue->QueueDesc + desc_idx * 4]; \
189
- uint16_t desc_flags = desc[3]; \
190
- body if (!(desc_flags & VIRTIO_DESC_F_NEXT)) break; \
191
- desc_idx = desc[3] >> 16; \
183
+ #define VNET_ITERATE_BUFFER (checked , body ) \
184
+ desc_idx = buffer_idx; \
185
+ while (1) { \
186
+ if (checked && desc_idx >= queue->QueueNum) \
187
+ return virtio_net_set_fail(vnet); \
188
+ const struct virtq_desc *desc = \
189
+ (struct virtq_desc *) &ram[queue->QueueDesc + desc_idx * 4]; \
190
+ uint16_t desc_flags = desc->flags; \
191
+ body if (!(desc_flags & VIRTIO_DESC_F_NEXT)) break; \
192
+ desc_idx = desc->next; \
192
193
}
193
194
194
195
/* Input: 'buffer_idx'.
195
196
* Output: 'buffer_niovs' and 'buffer_iovs'
196
197
*/
197
- #define VNET_BUFFER_TO_IOV (expect_readable ) \
198
- uint16_t desc_idx; \
199
- /* do a first pass to validate flags and count buffers */ \
200
- size_t buffer_niovs = 0; \
201
- VNET_ITERATE_BUFFER( \
202
- true, if ((!!(desc_flags & VIRTIO_DESC_F_WRITE)) != \
203
- (expect_readable)) return virtio_net_set_fail(vnet); \
204
- buffer_niovs++;) \
205
- /* convert to iov */ \
206
- struct iovec buffer_iovs [buffer_niovs ]; \
207
- buffer_niovs = 0 ; \
208
- VNET_ITERATE_BUFFER ( \
209
- false , uint32_t desc_addr = desc [ 0 ] ; uint32_t desc_len = desc [ 2 ] ; \
210
- buffer_iovs [buffer_niovs ].iov_base = \
211
- (void * ) ((uintptr_t ) ram + desc_addr ); \
198
+ #define VNET_BUFFER_TO_IOV (expect_readable ) \
199
+ uint16_t desc_idx; \
200
+ /* do a first pass to validate flags and count buffers */ \
201
+ size_t buffer_niovs = 0 ; \
202
+ VNET_ITERATE_BUFFER ( \
203
+ true , if ((!!(desc_flags & VIRTIO_DESC_F_WRITE )) != \
204
+ (expect_readable )) return virtio_net_set_fail (vnet ); \
205
+ buffer_niovs ++ ;) \
206
+ /* convert to iov */ \
207
+ struct iovec buffer_iovs [buffer_niovs ]; \
208
+ buffer_niovs = 0 ; \
209
+ VNET_ITERATE_BUFFER ( \
210
+ false, uint64_t desc_addr = desc -> addr ; uint32_t desc_len = desc -> len ; \
211
+ buffer_iovs [buffer_niovs ].iov_base = \
212
+ (void * ) ((uintptr_t ) ram + desc_addr ); \
212
213
buffer_iovs [buffer_niovs ].iov_len = desc_len ; buffer_niovs ++ ;)
213
214
214
215
#define VNET_GENERATE_QUEUE_HANDLER (NAME_SUFFIX , VERB , QUEUE_IDX , READ ) \
0 commit comments