@@ -180,35 +180,36 @@ static ssize_t handle_write(netdev_t *netdev,
180180/* Require existing 'desc_idx' to use as iteration variable, and input
181181 * 'buffer_idx'.
182182 */
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; \
192193 }
193194
194195/* Input: 'buffer_idx'.
195196 * Output: 'buffer_niovs' and 'buffer_iovs'
196197 */
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 ); \
212213 buffer_iovs [buffer_niovs ].iov_len = desc_len ; buffer_niovs ++ ;)
213214
214215#define VNET_GENERATE_QUEUE_HANDLER (NAME_SUFFIX , VERB , QUEUE_IDX , READ ) \
0 commit comments