* [Qemu-devel] [PATCH v3 0/2] Introduce 'status' property for netfilter
@ 2016-03-01 5:37 zhanghailiang
2016-03-01 5:37 ` [Qemu-devel] [PATCH v3 1/2] filter: Add 'status' property for filter object zhanghailiang
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: zhanghailiang @ 2016-03-01 5:37 UTC (permalink / raw)
To: qemu-devel; +Cc: jasowang, zhanghailiang, hongyang.yang
This is picked from COLO series, which is to realize the new 'status'
property for filter.
With this property, users can control if the filter is enabled or
disabled.
ChangeLog:
v3:
- Use 'bool on' instead of member 'char *status' (Jason)
- Extract the process of setup timer into a new helper
zhanghailiang (2):
filter: Add 'status' property for filter object
filter-buffer: Add status_changed callback processing
include/net/filter.h | 4 ++++
net/filter-buffer.c | 34 ++++++++++++++++++++++++++++------
net/filter.c | 41 +++++++++++++++++++++++++++++++++++++++++
qemu-options.hx | 4 +++-
4 files changed, 76 insertions(+), 7 deletions(-)
--
1.8.3.1
^ permalink raw reply [flat|nested] 4+ messages in thread
* [Qemu-devel] [PATCH v3 1/2] filter: Add 'status' property for filter object
2016-03-01 5:37 [Qemu-devel] [PATCH v3 0/2] Introduce 'status' property for netfilter zhanghailiang
@ 2016-03-01 5:37 ` zhanghailiang
2016-03-01 5:37 ` [Qemu-devel] [PATCH v3 2/2] filter-buffer: Add status_changed callback processing zhanghailiang
2016-03-02 5:37 ` [Qemu-devel] [PATCH v3 0/2] Introduce 'status' property for netfilter Jason Wang
2 siblings, 0 replies; 4+ messages in thread
From: zhanghailiang @ 2016-03-01 5:37 UTC (permalink / raw)
To: qemu-devel; +Cc: jasowang, zhanghailiang, hongyang.yang
With this property, users can control if this filter is 'on'
or 'off'. The default behavior for filter is 'on'.
For some types of filters, they may need to react to status changing,
So here, we introduced status changing callback/notifier for filter class.
We will skip the disabled ('off') filter when delivering packets in net layer.
Signed-off-by: zhanghailiang <zhang.zhanghailiang@huawei.com>
Cc: Jason Wang <jasowang@redhat.com>
Cc: Yang Hongyang <hongyang.yang@easystack.cn>
---
v3:
- Use 'bool on' instead of member 'char *status' (Jason)
v2:
- Split the processing of buffer-filter into a new patch (Jason)
- Use 'status' instead of 'enabled' to store the filter state (Jason)
- Rename FilterDisable() callback to FilterStatusChanged(Jason)
---
include/net/filter.h | 4 ++++
net/filter.c | 41 +++++++++++++++++++++++++++++++++++++++++
qemu-options.hx | 4 +++-
3 files changed, 48 insertions(+), 1 deletion(-)
diff --git a/include/net/filter.h b/include/net/filter.h
index 5639976..cfb1172 100644
--- a/include/net/filter.h
+++ b/include/net/filter.h
@@ -36,12 +36,15 @@ typedef ssize_t (FilterReceiveIOV)(NetFilterState *nc,
int iovcnt,
NetPacketSent *sent_cb);
+typedef void (FilterStatusChanged) (NetFilterState *nf, Error **errp);
+
typedef struct NetFilterClass {
ObjectClass parent_class;
/* optional */
FilterSetup *setup;
FilterCleanup *cleanup;
+ FilterStatusChanged *status_changed;
/* mandatory */
FilterReceiveIOV *receive_iov;
} NetFilterClass;
@@ -55,6 +58,7 @@ struct NetFilterState {
char *netdev_id;
NetClientState *netdev;
NetFilterDirection direction;
+ bool on;
QTAILQ_ENTRY(NetFilterState) next;
};
diff --git a/net/filter.c b/net/filter.c
index d2a514e..60203a0 100644
--- a/net/filter.c
+++ b/net/filter.c
@@ -17,6 +17,11 @@
#include "qom/object_interfaces.h"
#include "qemu/iov.h"
+static inline bool qemu_can_skip_netfilter(NetFilterState *nf)
+{
+ return !nf->on;
+}
+
ssize_t qemu_netfilter_receive(NetFilterState *nf,
NetFilterDirection direction,
NetClientState *sender,
@@ -25,6 +30,9 @@ ssize_t qemu_netfilter_receive(NetFilterState *nf,
int iovcnt,
NetPacketSent *sent_cb)
{
+ if (qemu_can_skip_netfilter(nf)) {
+ return 0;
+ }
if (nf->direction == direction ||
nf->direction == NET_FILTER_DIRECTION_ALL) {
return NETFILTER_GET_CLASS(OBJECT(nf))->receive_iov(
@@ -134,8 +142,38 @@ static void netfilter_set_direction(Object *obj, int direction, Error **errp)
nf->direction = direction;
}
+static char *netfilter_get_status(Object *obj, Error **errp)
+{
+ NetFilterState *nf = NETFILTER(obj);
+
+ return nf->on ? g_strdup("on") : g_strdup("off");
+}
+
+static void netfilter_set_status(Object *obj, const char *str, Error **errp)
+{
+ NetFilterState *nf = NETFILTER(obj);
+ NetFilterClass *nfc = NETFILTER_GET_CLASS(obj);
+
+ if (strcmp(str, "on") && strcmp(str, "off")) {
+ error_setg(errp, "Invalid value for netfilter status, "
+ "should be 'on' or 'off'");
+ return;
+ }
+ if (nf->on == !strcmp(str, "on")) {
+ return;
+ }
+ nf->on = !nf->on;
+ if (nfc->status_changed) {
+ nfc->status_changed(nf, errp);
+ }
+}
+
static void netfilter_init(Object *obj)
{
+ NetFilterState *nf = NETFILTER(obj);
+
+ nf->on = true;
+
object_property_add_str(obj, "netdev",
netfilter_get_netdev_id, netfilter_set_netdev_id,
NULL);
@@ -143,6 +181,9 @@ static void netfilter_init(Object *obj)
NetFilterDirection_lookup,
netfilter_get_direction, netfilter_set_direction,
NULL);
+ object_property_add_str(obj, "status",
+ netfilter_get_status, netfilter_set_status,
+ NULL);
}
static void netfilter_complete(UserCreatable *uc, Error **errp)
diff --git a/qemu-options.hx b/qemu-options.hx
index 144e6a9..10a402b 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -3788,11 +3788,13 @@ version by providing the @var{passwordid} parameter. This provides
the ID of a previously created @code{secret} object containing the
password for decryption.
-@item -object filter-buffer,id=@var{id},netdev=@var{netdevid},interval=@var{t}[,queue=@var{all|rx|tx}]
+@item -object filter-buffer,id=@var{id},netdev=@var{netdevid},interval=@var{t}[,queue=@var{all|rx|tx}][,status=@var{on|off}]
Interval @var{t} can't be 0, this filter batches the packet delivery: all
packets arriving in a given interval on netdev @var{netdevid} are delayed
until the end of the interval. Interval is in microseconds.
+@option{status} is optional that indicate whether the netfilter is
+on (enabled) or off (disabled), the default status for netfilter will be 'on'.
queue @var{all|rx|tx} is an option that can be applied to any netfilter.
--
1.8.3.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [Qemu-devel] [PATCH v3 2/2] filter-buffer: Add status_changed callback processing
2016-03-01 5:37 [Qemu-devel] [PATCH v3 0/2] Introduce 'status' property for netfilter zhanghailiang
2016-03-01 5:37 ` [Qemu-devel] [PATCH v3 1/2] filter: Add 'status' property for filter object zhanghailiang
@ 2016-03-01 5:37 ` zhanghailiang
2016-03-02 5:37 ` [Qemu-devel] [PATCH v3 0/2] Introduce 'status' property for netfilter Jason Wang
2 siblings, 0 replies; 4+ messages in thread
From: zhanghailiang @ 2016-03-01 5:37 UTC (permalink / raw)
To: qemu-devel; +Cc: jasowang, zhanghailiang, hongyang.yang
While the status of filter-buffer changing from 'on' to 'off',
it need to release all the buffered packets, and delete the related
timer, while switch from 'off' to 'on', it need to resume the release
packets timer.
Here, we extract the process of setup timer into a new helper,
which will be used in the new status_changed callback.
Signed-off-by: zhanghailiang <zhang.zhanghailiang@huawei.com>
Cc: Jason Wang <jasowang@redhat.com>
Cc: Yang Hongyang <hongyang.yang@easystack.cn>
---
v3:
- Extract the process of setup timer into a new helper
v2:
- New patch
---
net/filter-buffer.c | 34 ++++++++++++++++++++++++++++------
1 file changed, 28 insertions(+), 6 deletions(-)
diff --git a/net/filter-buffer.c b/net/filter-buffer.c
index 12ad2e3..972177b 100644
--- a/net/filter-buffer.c
+++ b/net/filter-buffer.c
@@ -100,6 +100,19 @@ static void filter_buffer_cleanup(NetFilterState *nf)
}
}
+static void filter_buffer_setup_timer(NetFilterState *nf)
+{
+ FilterBufferState *s = FILTER_BUFFER(nf);
+
+ if (s->interval) {
+ timer_init_us(&s->release_timer, QEMU_CLOCK_VIRTUAL,
+ filter_buffer_release_timer, nf);
+ /* Timer armed to fire in s->interval microseconds. */
+ timer_mod(&s->release_timer,
+ qemu_clock_get_us(QEMU_CLOCK_VIRTUAL) + s->interval);
+ }
+}
+
static void filter_buffer_setup(NetFilterState *nf, Error **errp)
{
FilterBufferState *s = FILTER_BUFFER(nf);
@@ -115,12 +128,20 @@ static void filter_buffer_setup(NetFilterState *nf, Error **errp)
}
s->incoming_queue = qemu_new_net_queue(qemu_netfilter_pass_to_next, nf);
- if (s->interval) {
- timer_init_us(&s->release_timer, QEMU_CLOCK_VIRTUAL,
- filter_buffer_release_timer, nf);
- /* Timer armed to fire in s->interval microseconds. */
- timer_mod(&s->release_timer,
- qemu_clock_get_us(QEMU_CLOCK_VIRTUAL) + s->interval);
+ filter_buffer_setup_timer(nf);
+}
+
+static void filter_buffer_status_changed(NetFilterState *nf, Error **errp)
+{
+ FilterBufferState *s = FILTER_BUFFER(nf);
+
+ if (!nf->on) {
+ if (s->interval) {
+ timer_del(&s->release_timer);
+ }
+ filter_buffer_flush(nf);
+ } else {
+ filter_buffer_setup_timer(nf);
}
}
@@ -131,6 +152,7 @@ static void filter_buffer_class_init(ObjectClass *oc, void *data)
nfc->setup = filter_buffer_setup;
nfc->cleanup = filter_buffer_cleanup;
nfc->receive_iov = filter_buffer_receive_iov;
+ nfc->status_changed = filter_buffer_status_changed;
}
static void filter_buffer_get_interval(Object *obj, Visitor *v,
--
1.8.3.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [Qemu-devel] [PATCH v3 0/2] Introduce 'status' property for netfilter
2016-03-01 5:37 [Qemu-devel] [PATCH v3 0/2] Introduce 'status' property for netfilter zhanghailiang
2016-03-01 5:37 ` [Qemu-devel] [PATCH v3 1/2] filter: Add 'status' property for filter object zhanghailiang
2016-03-01 5:37 ` [Qemu-devel] [PATCH v3 2/2] filter-buffer: Add status_changed callback processing zhanghailiang
@ 2016-03-02 5:37 ` Jason Wang
2 siblings, 0 replies; 4+ messages in thread
From: Jason Wang @ 2016-03-02 5:37 UTC (permalink / raw)
To: zhanghailiang, qemu-devel; +Cc: hongyang.yang
On 03/01/2016 01:37 PM, zhanghailiang wrote:
> This is picked from COLO series, which is to realize the new 'status'
> property for filter.
>
> With this property, users can control if the filter is enabled or
> disabled.
>
> ChangeLog:
> v3:
> - Use 'bool on' instead of member 'char *status' (Jason)
> - Extract the process of setup timer into a new helper
>
> zhanghailiang (2):
> filter: Add 'status' property for filter object
> filter-buffer: Add status_changed callback processing
>
> include/net/filter.h | 4 ++++
> net/filter-buffer.c | 34 ++++++++++++++++++++++++++++------
> net/filter.c | 41 +++++++++++++++++++++++++++++++++++++++++
> qemu-options.hx | 4 +++-
> 4 files changed, 76 insertions(+), 7 deletions(-)
>
Apply to -net.
Thanks
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2016-03-02 5:37 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-03-01 5:37 [Qemu-devel] [PATCH v3 0/2] Introduce 'status' property for netfilter zhanghailiang
2016-03-01 5:37 ` [Qemu-devel] [PATCH v3 1/2] filter: Add 'status' property for filter object zhanghailiang
2016-03-01 5:37 ` [Qemu-devel] [PATCH v3 2/2] filter-buffer: Add status_changed callback processing zhanghailiang
2016-03-02 5:37 ` [Qemu-devel] [PATCH v3 0/2] Introduce 'status' property for netfilter Jason Wang
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).