virtio_net: add VIRTIO_NET_F_MTU support
Change-Id: Ie61fa0e0fe13a63d5b0ebde08303a1df836b1b52 Reviewed-on: https://review.haiku-os.org/c/haiku/+/2384 Reviewed-by: Adrien Destugues <pulkomandy@gmail.com> Reviewed-by: waddlesplash <waddlesplash@gmail.com>
This commit is contained in:
parent
d8e1fd6eda
commit
6d72c4188e
@ -125,6 +125,8 @@ get_feature_name(uint32 feature)
|
|||||||
return "host checksum";
|
return "host checksum";
|
||||||
case VIRTIO_NET_F_GUEST_CSUM:
|
case VIRTIO_NET_F_GUEST_CSUM:
|
||||||
return "guest checksum";
|
return "guest checksum";
|
||||||
|
case VIRTIO_NET_F_MTU:
|
||||||
|
return "mtu";
|
||||||
case VIRTIO_NET_F_MAC:
|
case VIRTIO_NET_F_MAC:
|
||||||
return "macaddress";
|
return "macaddress";
|
||||||
case VIRTIO_NET_F_GSO:
|
case VIRTIO_NET_F_GSO:
|
||||||
@ -224,7 +226,7 @@ virtio_net_init_device(void* _info, void** _cookie)
|
|||||||
sDeviceManager->put_node(parent);
|
sDeviceManager->put_node(parent);
|
||||||
|
|
||||||
info->virtio->negotiate_features(info->virtio_device,
|
info->virtio->negotiate_features(info->virtio_device,
|
||||||
VIRTIO_NET_F_STATUS | VIRTIO_NET_F_MAC
|
VIRTIO_NET_F_STATUS | VIRTIO_NET_F_MAC | VIRTIO_NET_F_MTU
|
||||||
/* VIRTIO_NET_F_CTRL_VQ | VIRTIO_NET_F_MQ */,
|
/* VIRTIO_NET_F_CTRL_VQ | VIRTIO_NET_F_MQ */,
|
||||||
&info->features, &get_feature_name);
|
&info->features, &get_feature_name);
|
||||||
|
|
||||||
@ -474,6 +476,21 @@ virtio_net_open(void* _info, const char* path, int openMode, void** _cookie)
|
|||||||
&info->macaddr, sizeof(info->macaddr));
|
&info->macaddr, sizeof(info->macaddr));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((info->features & VIRTIO_NET_F_MTU) != 0) {
|
||||||
|
dprintf("mtu feature\n");
|
||||||
|
uint16 mtu;
|
||||||
|
info->virtio->read_device_config(info->virtio_device,
|
||||||
|
offsetof(struct virtio_net_config, mtu),
|
||||||
|
&mtu, sizeof(mtu));
|
||||||
|
// check against minimum MTU
|
||||||
|
if (mtu > 68)
|
||||||
|
info->maxframesize = mtu;
|
||||||
|
else
|
||||||
|
info->virtio->clear_feature(info->virtio_device, VIRTIO_NET_F_MTU);
|
||||||
|
} else {
|
||||||
|
dprintf("no mtu feature\n");
|
||||||
|
}
|
||||||
|
|
||||||
for (int i = 0; i < info->rxSizes[0]; i++)
|
for (int i = 0; i < info->rxSizes[0]; i++)
|
||||||
virtio_net_rx_enqueue_buf(info, info->rxBufInfos[i]);
|
virtio_net_rx_enqueue_buf(info, info->rxBufInfos[i]);
|
||||||
|
|
||||||
|
@ -34,6 +34,7 @@
|
|||||||
/* The feature bitmap for virtio net */
|
/* The feature bitmap for virtio net */
|
||||||
#define VIRTIO_NET_F_CSUM 0x00001 /* Host handles pkts w/ partial csum */
|
#define VIRTIO_NET_F_CSUM 0x00001 /* Host handles pkts w/ partial csum */
|
||||||
#define VIRTIO_NET_F_GUEST_CSUM 0x00002 /* Guest handles pkts w/ partial csum*/
|
#define VIRTIO_NET_F_GUEST_CSUM 0x00002 /* Guest handles pkts w/ partial csum*/
|
||||||
|
#define VIRTIO_NET_F_MTU 0x00008 /* Initial MTU advice. */
|
||||||
#define VIRTIO_NET_F_MAC 0x00020 /* Host has given MAC address. */
|
#define VIRTIO_NET_F_MAC 0x00020 /* Host has given MAC address. */
|
||||||
#define VIRTIO_NET_F_GSO 0x00040 /* Host handles pkts w/ any GSO type */
|
#define VIRTIO_NET_F_GSO 0x00040 /* Host handles pkts w/ any GSO type */
|
||||||
#define VIRTIO_NET_F_GUEST_TSO4 0x00080 /* Guest can handle TSOv4 in. */
|
#define VIRTIO_NET_F_GUEST_TSO4 0x00080 /* Guest can handle TSOv4 in. */
|
||||||
@ -66,6 +67,7 @@ struct virtio_net_config {
|
|||||||
* Legal values are between 1 and 0x8000.
|
* Legal values are between 1 and 0x8000.
|
||||||
*/
|
*/
|
||||||
uint16_t max_virtqueue_pairs;
|
uint16_t max_virtqueue_pairs;
|
||||||
|
uint16_t mtu;
|
||||||
} _PACKED;
|
} _PACKED;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user