From: Alex Williamson <alex.williamson@hp.com>
To: Mark McLoughlin <markmc@redhat.com>
Cc: kvm <kvm@vger.kernel.org>, qemu-devel <qemu-devel@nongnu.org>
Subject: Re: [PATCH 5/5] virtio-net: Add additional MACs via a filter table
Date: Wed, 14 Jan 2009 09:54:39 -0700 [thread overview]
Message-ID: <1231952079.7109.340.camel@lappy> (raw)
In-Reply-To: <1231928117.4944.294.camel@localhost.localdomain>
On Wed, 2009-01-14 at 10:15 +0000, Mark McLoughlin wrote:
> > -#define VIRTIO_VM_VERSION 3
> > +#define VIRTIO_VM_VERSION 4
>
> We could probably do with an ETH_ALEN macro at this stage. There's a lot
> of '6's around the place :-)
Yep, that'd be easier to search for too. I'll at least make a local
define for that.
> ...
> > @@ -157,10 +173,46 @@ static void virtio_net_handle_ctrl(VirtIODevice *vdev, VirtQueue *vq)
> > n->allmulti = *on;
> > else
> > *status = VIRTIO_NET_ERR;
> > +
> > + } else if (ctrl->class == VIRTIO_NET_CTRL_MAC_TABLE) {
>
> Hmm, it'd be nice to factor each of the commands out in their own
> function.
It's setup to do that, but each case is still pretty short and simple,
so I hadn't made the cut yet.
> > + if (ctrl->cmd == VIRTIO_NET_CTRL_MAC_TABLE_ALLOC) {
> > + uint32_t *entries;
> > +
> > + if (n->mac_table.entries || elem.out_num != 2 ||
> > + elem.out_sg[1].iov_len != sizeof(*entries)) {
> > + *status = VIRTIO_NET_ERR;
> > + goto reply;
> > + }
> > +
> > + entries = (void *)elem.out_sg[1].iov_base;
>
> No need for the cast.
>
> > + n->mac_table.macs = qemu_mallocz(*entries * 6);
>
> We should put a limit on the size of the table.
Agree, I put one on the guest driver and thought I had one here, but
must have missed it. Need to protect from malicious guests.
> > + if (!n->mac_table.macs) {
> > + *status = VIRTIO_NET_ERR;
> > + goto reply;
> > + }
> > +
> > + n->mac_table.entries = *entries;
> > + *status = VIRTIO_NET_OK;
> > + } else if (ctrl->cmd == VIRTIO_NET_CTRL_MAC_TABLE_SET) {
> > + if (!n->mac_table.entries || (elem.out_num == 2 &&
>
> Think I'd just check that out_num is 1 or 2 here ...
Good idea, I'll play with this and see what comes out. Thanks for the
comments.
Alex
> then e.g.
>
> n_entries = 0;
> if (elem.out_num == 2)
> n_entries = elem.out_sg[1].iov_len / 6;
>
> if (n_entries > n->mac_table.entries) {
> *status = VIRTIO_NET_HDR
> ...
>
> n->mac_table.in_use = 0;
> if (n_entries) {
> ...
>
> > + (elem.out_sg[1].iov_len / 6) > n->mac_table.entries)) {
> > + *status = VIRTIO_NET_ERR;
> > + goto reply;
> > + }
> > +
> > + if (elem.out_num == 2) {
> > + memcpy(n->mac_table.macs, elem.out_sg[1].iov_base,
> > + elem.out_sg[1].iov_len);
> > + n->mac_table.in_use = elem.out_sg[1].iov_len / 6;
> > + } else {
> > + n->mac_table.in_use = 0;
> > + }
> > + }
> ...
--
Alex Williamson HP Open Source & Linux Org.
WARNING: multiple messages have this Message-ID (diff)
From: Alex Williamson <alex.williamson@hp.com>
To: Mark McLoughlin <markmc@redhat.com>
Cc: qemu-devel <qemu-devel@nongnu.org>, kvm <kvm@vger.kernel.org>
Subject: [Qemu-devel] Re: [PATCH 5/5] virtio-net: Add additional MACs via a filter table
Date: Wed, 14 Jan 2009 09:54:39 -0700 [thread overview]
Message-ID: <1231952079.7109.340.camel@lappy> (raw)
In-Reply-To: <1231928117.4944.294.camel@localhost.localdomain>
On Wed, 2009-01-14 at 10:15 +0000, Mark McLoughlin wrote:
> > -#define VIRTIO_VM_VERSION 3
> > +#define VIRTIO_VM_VERSION 4
>
> We could probably do with an ETH_ALEN macro at this stage. There's a lot
> of '6's around the place :-)
Yep, that'd be easier to search for too. I'll at least make a local
define for that.
> ...
> > @@ -157,10 +173,46 @@ static void virtio_net_handle_ctrl(VirtIODevice *vdev, VirtQueue *vq)
> > n->allmulti = *on;
> > else
> > *status = VIRTIO_NET_ERR;
> > +
> > + } else if (ctrl->class == VIRTIO_NET_CTRL_MAC_TABLE) {
>
> Hmm, it'd be nice to factor each of the commands out in their own
> function.
It's setup to do that, but each case is still pretty short and simple,
so I hadn't made the cut yet.
> > + if (ctrl->cmd == VIRTIO_NET_CTRL_MAC_TABLE_ALLOC) {
> > + uint32_t *entries;
> > +
> > + if (n->mac_table.entries || elem.out_num != 2 ||
> > + elem.out_sg[1].iov_len != sizeof(*entries)) {
> > + *status = VIRTIO_NET_ERR;
> > + goto reply;
> > + }
> > +
> > + entries = (void *)elem.out_sg[1].iov_base;
>
> No need for the cast.
>
> > + n->mac_table.macs = qemu_mallocz(*entries * 6);
>
> We should put a limit on the size of the table.
Agree, I put one on the guest driver and thought I had one here, but
must have missed it. Need to protect from malicious guests.
> > + if (!n->mac_table.macs) {
> > + *status = VIRTIO_NET_ERR;
> > + goto reply;
> > + }
> > +
> > + n->mac_table.entries = *entries;
> > + *status = VIRTIO_NET_OK;
> > + } else if (ctrl->cmd == VIRTIO_NET_CTRL_MAC_TABLE_SET) {
> > + if (!n->mac_table.entries || (elem.out_num == 2 &&
>
> Think I'd just check that out_num is 1 or 2 here ...
Good idea, I'll play with this and see what comes out. Thanks for the
comments.
Alex
> then e.g.
>
> n_entries = 0;
> if (elem.out_num == 2)
> n_entries = elem.out_sg[1].iov_len / 6;
>
> if (n_entries > n->mac_table.entries) {
> *status = VIRTIO_NET_HDR
> ...
>
> n->mac_table.in_use = 0;
> if (n_entries) {
> ...
>
> > + (elem.out_sg[1].iov_len / 6) > n->mac_table.entries)) {
> > + *status = VIRTIO_NET_ERR;
> > + goto reply;
> > + }
> > +
> > + if (elem.out_num == 2) {
> > + memcpy(n->mac_table.macs, elem.out_sg[1].iov_base,
> > + elem.out_sg[1].iov_len);
> > + n->mac_table.in_use = elem.out_sg[1].iov_len / 6;
> > + } else {
> > + n->mac_table.in_use = 0;
> > + }
> > + }
> ...
--
Alex Williamson HP Open Source & Linux Org.
next prev parent reply other threads:[~2009-01-14 16:54 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-01-13 21:24 [PATCH 5/5] virtio-net: Add additional MACs via a filter table Alex Williamson
2009-01-13 21:24 ` [Qemu-devel] " Alex Williamson
2009-01-14 10:15 ` Mark McLoughlin
2009-01-14 10:15 ` [Qemu-devel] " Mark McLoughlin
2009-01-14 16:54 ` Alex Williamson [this message]
2009-01-14 16:54 ` Alex Williamson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1231952079.7109.340.camel@lappy \
--to=alex.williamson@hp.com \
--cc=kvm@vger.kernel.org \
--cc=markmc@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.