From: "Daniel P. Berrange" <berrange@redhat.com>
To: Yang Hongyang <yanghy@cn.fujitsu.com>
Cc: thuth@redhat.com, zhang.zhanghailiang@huawei.com,
lizhijian@cn.fujitsu.com, jasowang@redhat.com,
qemu-devel@nongnu.org, armbru@redhat.com, stefanha@redhat.com
Subject: Re: [Qemu-devel] [PATCH v10 02/10] init/cleanup of netfilter object
Date: Mon, 14 Sep 2015 09:54:42 +0100 [thread overview]
Message-ID: <20150914085442.GA7611@redhat.com> (raw)
In-Reply-To: <1441783481-17698-3-git-send-email-yanghy@cn.fujitsu.com>
On Wed, Sep 09, 2015 at 03:24:33PM +0800, Yang Hongyang wrote:
> Add a netfilter object based on QOM.
>
> A netfilter is attached to a netdev, captures all network packets
> that pass through the netdev. When we delete the netdev, we also
> delete the netfilter object attached to it, because if the netdev is
> removed, the filter which attached to it is useless.
>
> QTAILQ_ENTRY global_list but used by filter layer, so that we can
> manage all filters together.
> QTAILQ_ENTRY next used by netdev, filter belongs to the specific netdev is
> in this queue.
>
> Also init delayed object after net_init_clients, because netfilters need
> to be initialized after net clients initialized.
>
> Signed-off-by: Yang Hongyang <yanghy@cn.fujitsu.com>
> diff --git a/net/filter.c b/net/filter.c
> new file mode 100644
> index 0000000..5192c6d
> --- /dev/null
> +++ b/net/filter.c
> +static void netfilter_init(Object *obj)
> +{
> + QTAILQ_INIT(&net_filters);
> + object_property_add_str(obj, "netdev",
> + netfilter_get_netdev_id, netfilter_set_netdev_id,
> + NULL);
> + object_property_add_enum(obj, "chain", "NetFilterChain",
> + NetFilterChain_lookup,
> + netfilter_get_chain, netfilter_set_chain,
> + NULL);
> +}
> +
> +static void netfilter_cleanup(Object *obj)
Nit-pick, it is preferable to name methods to match the class callback
they're registered against, so if you have to re-spin a v11 plesae
rename this to netfilter_finalize.
> +{
> + NetFilterState *nf = NETFILTER(obj);
> + NetFilterClass *nfc = NETFILTER_GET_CLASS(obj);
> +
> + if (nfc->cleanup) {
> + nfc->cleanup(nf);
> + }
> +
> + if (nf->netdev && !QTAILQ_EMPTY(&nf->netdev->filters)) {
> + QTAILQ_REMOVE(&nf->netdev->filters, nf, next);
> + }
> + if (!QTAILQ_EMPTY(&net_filters)) {
> + QTAILQ_REMOVE(&net_filters, nf, global_list);
> + }
> +
> + g_free(nf->netdev_id);
> +}
> +
> +static void netfilter_complete(UserCreatable *uc, Error **errp)
> +{
> + NetFilterState *nf = NETFILTER(uc);
> + NetClientState *ncs[MAX_QUEUE_NUM];
> + NetFilterClass *nfc = NETFILTER_GET_CLASS(uc);
> + int queues;
> + Error *local_err = NULL;
> +
> + if (!nf->netdev_id) {
> + error_setg(errp, "Parameter 'netdev' is required");
> + return;
> + }
> +
> + queues = qemu_find_net_clients_except(nf->netdev_id, ncs,
> + NET_CLIENT_OPTIONS_KIND_NIC,
> + MAX_QUEUE_NUM);
> + if (queues < 1) {
> + error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "netdev",
> + "a network backend id");
> + return;
> + } else if (queues > 1) {
> + error_setg(errp, "Multi queue is not supported");
> + return;
> + }
> +
> + if (get_vhost_net(ncs[0])) {
> + error_setg(errp, "Vhost is not supported");
> + return;
> + }
> +
> + nf->netdev = ncs[0];
> +
> + if (nfc->setup) {
> + nfc->setup(nf, &local_err);
> + if (local_err) {
> + error_propagate(errp, local_err);
> + return;
> + }
> + }
> + QTAILQ_INSERT_TAIL(&net_filters, nf, global_list);
> + QTAILQ_INSERT_TAIL(&nf->netdev->filters, nf, next);
> +}
> +
> +static bool netfilter_can_be_deleted(UserCreatable *uc, Error **errp)
> +{
> + return true;
> +}
You can just leave out the netfilter_can_be_deleted() method if you are
only going to return "true", since that's the default semantics.
> +static void netfilter_class_init(ObjectClass *oc, void *data)
> +{
> + UserCreatableClass *ucc = USER_CREATABLE_CLASS(oc);
> +
> + ucc->complete = netfilter_complete;
> + ucc->can_be_deleted = netfilter_can_be_deleted;
> +}
> +
> +static const TypeInfo netfilter_info = {
> + .name = TYPE_NETFILTER,
> + .parent = TYPE_OBJECT,
> + .abstract = true,
> + .class_size = sizeof(NetFilterClass),
> + .class_init = netfilter_class_init,
> + .instance_size = sizeof(NetFilterState),
> + .instance_init = netfilter_init,
> + .instance_finalize = netfilter_cleanup,
> + .interfaces = (InterfaceInfo[]) {
> + { TYPE_USER_CREATABLE },
> + { }
> + }
> +};
> +
> +static void register_types(void)
> +{
> + type_register_static(&netfilter_info);
> +}
> +
> +type_init(register_types);
> diff --git a/vl.c b/vl.c
> index 584ca88..672f8b2 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -2783,6 +2783,7 @@ static bool object_create_initial(const char *type)
> if (g_str_equal(type, "rng-egd")) {
> return false;
> }
> + /* TODO: reture false for concrete netfilters */
> return true;
> }
Don't you want to be adding your object type here, alongside rng-egd
since IIRC, you said it needed to be created later
> @@ -4302,12 +4303,6 @@ int main(int argc, char **argv, char **envp)
> exit(0);
> }
>
> - if (qemu_opts_foreach(qemu_find_opts("object"),
> - object_create,
> - object_create_delayed, NULL)) {
> - exit(1);
> - }
> -
> machine_opts = qemu_get_machine_opts();
> if (qemu_opt_foreach(machine_opts, machine_set_property, current_machine,
> NULL)) {
> @@ -4413,6 +4408,12 @@ int main(int argc, char **argv, char **envp)
> exit(1);
> }
>
> + if (qemu_opts_foreach(qemu_find_opts("object"),
> + object_create,
> + object_create_delayed, NULL)) {
> + exit(1);
> + }
> +
> #ifdef CONFIG_TPM
Regards,
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
next prev parent reply other threads:[~2015-09-14 8:54 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-09-09 7:24 [Qemu-devel] [PATCH v10 00/10] Add a netfilter object and netbuffer filter Yang Hongyang
2015-09-09 7:24 ` [Qemu-devel] [PATCH v10 01/10] qmp: delete qemu opts when delete an object Yang Hongyang
2015-09-09 7:24 ` [Qemu-devel] [PATCH v10 02/10] init/cleanup of netfilter object Yang Hongyang
2015-09-14 8:54 ` Daniel P. Berrange [this message]
2015-09-14 8:56 ` Daniel P. Berrange
2015-09-14 9:05 ` Yang Hongyang
2015-09-16 9:28 ` Jason Wang
2015-09-16 11:11 ` Yang Hongyang
2015-09-09 7:24 ` [Qemu-devel] [PATCH v10 03/10] netfilter: hook packets before net queue send Yang Hongyang
2015-09-09 7:24 ` [Qemu-devel] [PATCH v10 04/10] net: merge qemu_deliver_packet and qemu_deliver_packet_iov Yang Hongyang
2015-09-09 7:24 ` [Qemu-devel] [PATCH v10 05/10] net/queue: introduce NetQueueDeliverFunc Yang Hongyang
2015-09-09 7:24 ` [Qemu-devel] [PATCH v10 06/10] netfilter: add an API to pass the packet to next filter Yang Hongyang
2015-09-16 9:29 ` Jason Wang
2015-09-09 7:24 ` [Qemu-devel] [PATCH v10 07/10] netfilter: print filter info associate with the netdev Yang Hongyang
2015-09-09 7:24 ` [Qemu-devel] [PATCH v10 08/10] net/queue: export qemu_net_queue_append_iov Yang Hongyang
2015-09-09 7:24 ` [Qemu-devel] [PATCH v10 09/10] netfilter: add a netbuffer filter Yang Hongyang
2015-09-14 9:04 ` Daniel P. Berrange
2015-09-14 9:53 ` Yang Hongyang
2015-09-16 9:42 ` Jason Wang
2015-09-16 11:19 ` Yang Hongyang
2015-09-09 7:24 ` [Qemu-devel] [PATCH v10 10/10] tests: add test cases for netfilter object Yang Hongyang
2015-09-14 5:09 ` [Qemu-devel] [PATCH v10 00/10] Add a netfilter object and netbuffer filter Yang Hongyang
2015-09-14 5:22 ` Jason Wang
2015-09-14 5:36 ` Yang Hongyang
2015-09-16 9:48 ` Jason Wang
2015-09-16 11:22 ` Yang Hongyang
2015-09-14 9:05 ` Daniel P. Berrange
2015-09-14 9:14 ` Yang Hongyang
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=20150914085442.GA7611@redhat.com \
--to=berrange@redhat.com \
--cc=armbru@redhat.com \
--cc=jasowang@redhat.com \
--cc=lizhijian@cn.fujitsu.com \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.com \
--cc=thuth@redhat.com \
--cc=yanghy@cn.fujitsu.com \
--cc=zhang.zhanghailiang@huawei.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).