diff mbox series

[RFC,1/4] net/awd.c: Introduce Advanced Watch Dog module framework

Message ID 20191016112209.9024-2-chen.zhang@intel.com
State New
Headers show
Series Introduce Advanced Watch Dog module | expand

Commit Message

Zhang, Chen Oct. 16, 2019, 11:22 a.m. UTC
From: Zhang Chen <chen.zhang@intel.com>

This patch introduce a new module named Advanced Watch Dog,
and defined the input and output parameter. AWD use standard chardev
as the way of communicationg with the outside world.
Demo command:
-object advanced-watchdog,id=heart1,server=on,awd_node=h1,notification_node=heartbeat0,opt_script=opt_script_path,iothread=iothread1,pulse_interval=1000,timeout=5000

Signed-off-by: Zhang Chen <chen.zhang@intel.com>
---
 net/Makefile.objs |   1 +
 net/awd.c         | 261 ++++++++++++++++++++++++++++++++++++++++++++++
 qemu-options.hx   |   6 ++
 3 files changed, 268 insertions(+)
 create mode 100644 net/awd.c

Comments

Paolo Bonzini Oct. 21, 2019, 5:23 p.m. UTC | #1
On 16/10/19 13:22, Zhang Chen wrote:
> From: Zhang Chen <chen.zhang@intel.com>
> 
> This patch introduce a new module named Advanced Watch Dog, and
> defined the input and output parameter. AWD use standard chardev as
> the way of communicationg with the outside world. Demo command: 
> -object
> advanced-watchdog,id=heart1,server=on,awd_node=h1,notification_node=heartbeat0,opt_script=opt_script_path,iothread=iothread1,pulse_interval=1000,timeout=5000
Is there a standard or specification for how to interact with this?  Is
this something that was developed explicitly for these patches, or did
it exist before?

Paolo
Zhang, Chen Oct. 23, 2019, 6:50 a.m. UTC | #2
> -----Original Message-----
> From: Paolo Bonzini <pbonzini@redhat.com>
> Sent: Tuesday, October 22, 2019 1:24 AM
> To: Zhang, Chen <chen.zhang@intel.com>; Jason Wang
> <jasowang@redhat.com>; qemu-dev <qemu-devel@nongnu.org>
> Cc: Zhang Chen <zhangckid@gmail.com>
> Subject: Re: [RFC PATCH 1/4] net/awd.c: Introduce Advanced Watch Dog
> module framework
> 
> On 16/10/19 13:22, Zhang Chen wrote:
> > From: Zhang Chen <chen.zhang@intel.com>
> >
> > This patch introduce a new module named Advanced Watch Dog, and
> > defined the input and output parameter. AWD use standard chardev as
> > the way of communicationg with the outside world. Demo command:
> > -object
> > advanced-
> watchdog,id=heart1,server=on,awd_node=h1,notification_node=he
> > artbeat0,opt_script=opt_script_path,iothread=iothread1,pulse_interval=
> > 1000,timeout=5000
> Is there a standard or specification for how to interact with this?  Is this
> something that was developed explicitly for these patches, or did it exist
> before?
> 

Hi Paolo,

Thanks you for your attention.
Current AWD patch just accept any input as the signal to refresh the watchdog timer,
and we can also make a certain interactive protocol here. For the output user can pre-write
some command or some messages in the AWD opt-script. We noticed that there is no way
for VMM communicate directly, maybe some people think we don't need such things(up layer
software like openstack can handle it). But we engaged with real customer found that in some cases,
they need a lightweight and efficient mechanism to solve some practical problems(openstack is too heavy).
For example in COLO (https://wiki.qemu.org/Features/COLO).
We need heartbeat service to detect two node status, current implement need another application
running in the host to do this job, if found issue it will send message to local Qemu by qmp command,
This is very complicated in actual scenarios, we have to bind each heartbeat service with
the VM instance and handle lots of internal errors. Advanced watch dog can solve this issue in most cases.
At the same time, AWD also can be used in a variety of scenarios, it can active detect Qemu status and 
do some simple automatic processing for example kill itself when it loss control with openstack(just need simple paired service). 
 

Thanks
Zhang Chen

> Paolo
Philippe Mathieu-Daudé Oct. 23, 2019, 11:01 a.m. UTC | #3
Hi Chen,

On 10/16/19 1:22 PM, Zhang Chen wrote:
> From: Zhang Chen <chen.zhang@intel.com>
> 
> This patch introduce a new module named Advanced Watch Dog,
> and defined the input and output parameter. AWD use standard chardev
> as the way of communicationg with the outside world.
> Demo command:
> -object advanced-watchdog,id=heart1,server=on,awd_node=h1,notification_node=heartbeat0,opt_script=opt_script_path,iothread=iothread1,pulse_interval=1000,timeout=5000
> 
> Signed-off-by: Zhang Chen <chen.zhang@intel.com>
> ---
>   net/Makefile.objs |   1 +
>   net/awd.c         | 261 ++++++++++++++++++++++++++++++++++++++++++++++
>   qemu-options.hx   |   6 ++
>   3 files changed, 268 insertions(+)
>   create mode 100644 net/awd.c
> 
> diff --git a/net/Makefile.objs b/net/Makefile.objs
> index c5d076d19c..139b1394e9 100644
> --- a/net/Makefile.objs
> +++ b/net/Makefile.objs
> @@ -19,6 +19,7 @@ common-obj-y += colo-compare.o
>   common-obj-y += colo.o
>   common-obj-y += filter-rewriter.o
>   common-obj-y += filter-replay.o
> +common-obj-y += awd.o
Can you add a net/Kconfig file introducing the ADVANCED_WATCHDOG selector?

config COLO_ADVANCED_WATCHDOG
     bool
     default n

Then use here:

     common-obj-$(COLO_ADVANCED_WATCHDOG) += awd.o

Thanks,

Phil.

>   
>   tap-obj-$(CONFIG_LINUX) = tap-linux.o
>   tap-obj-$(CONFIG_BSD) = tap-bsd.o
[...]
Zhang, Chen Oct. 23, 2019, 11:09 a.m. UTC | #4
> -----Original Message-----
> From: Philippe Mathieu-Daudé <philmd@redhat.com>
> Sent: Wednesday, October 23, 2019 7:01 PM
> To: Zhang, Chen <chen.zhang@intel.com>; Jason Wang
> <jasowang@redhat.com>; Paolo Bonzini <pbonzini@redhat.com>; qemu-
> dev <qemu-devel@nongnu.org>
> Cc: Zhang Chen <zhangckid@gmail.com>
> Subject: Re: [RFC PATCH 1/4] net/awd.c: Introduce Advanced Watch Dog
> module framework
> 
> Hi Chen,
> 
> On 10/16/19 1:22 PM, Zhang Chen wrote:
> > From: Zhang Chen <chen.zhang@intel.com>
> >
> > This patch introduce a new module named Advanced Watch Dog, and
> > defined the input and output parameter. AWD use standard chardev as
> > the way of communicationg with the outside world.
> > Demo command:
> > -object
> > advanced-
> watchdog,id=heart1,server=on,awd_node=h1,notification_node=he
> > artbeat0,opt_script=opt_script_path,iothread=iothread1,pulse_interval=
> > 1000,timeout=5000
> >
> > Signed-off-by: Zhang Chen <chen.zhang@intel.com>
> > ---
> >   net/Makefile.objs |   1 +
> >   net/awd.c         | 261
> ++++++++++++++++++++++++++++++++++++++++++++++
> >   qemu-options.hx   |   6 ++
> >   3 files changed, 268 insertions(+)
> >   create mode 100644 net/awd.c
> >
> > diff --git a/net/Makefile.objs b/net/Makefile.objs index
> > c5d076d19c..139b1394e9 100644
> > --- a/net/Makefile.objs
> > +++ b/net/Makefile.objs
> > @@ -19,6 +19,7 @@ common-obj-y += colo-compare.o
> >   common-obj-y += colo.o
> >   common-obj-y += filter-rewriter.o
> >   common-obj-y += filter-replay.o
> > +common-obj-y += awd.o
> Can you add a net/Kconfig file introducing the ADVANCED_WATCHDOG
> selector?
> 
> config COLO_ADVANCED_WATCHDOG
>      bool
>      default n
> 
> Then use here:
> 
>      common-obj-$(COLO_ADVANCED_WATCHDOG) += awd.o
> 

Sure, but AWD is a universal module,  COLO is just the first user.
Maybe use "config ADVANCED_WATCHDOG" is better.

Thanks
Zhang Chen

> Thanks,
> 
> Phil.
> 
> >
> >   tap-obj-$(CONFIG_LINUX) = tap-linux.o
> >   tap-obj-$(CONFIG_BSD) = tap-bsd.o
> [...]
Philippe Mathieu-Daudé Oct. 23, 2019, 11:38 a.m. UTC | #5
On 10/23/19 1:09 PM, Zhang, Chen wrote:
>> -----Original Message-----
>> From: Philippe Mathieu-Daudé <philmd@redhat.com>
>> Sent: Wednesday, October 23, 2019 7:01 PM
>> To: Zhang, Chen <chen.zhang@intel.com>; Jason Wang
>> <jasowang@redhat.com>; Paolo Bonzini <pbonzini@redhat.com>; qemu-
>> dev <qemu-devel@nongnu.org>
>> Cc: Zhang Chen <zhangckid@gmail.com>
>> Subject: Re: [RFC PATCH 1/4] net/awd.c: Introduce Advanced Watch Dog
>> module framework
>>
>> Hi Chen,
>>
>> On 10/16/19 1:22 PM, Zhang Chen wrote:
>>> From: Zhang Chen <chen.zhang@intel.com>
>>>
>>> This patch introduce a new module named Advanced Watch Dog, and
>>> defined the input and output parameter. AWD use standard chardev as
>>> the way of communicationg with the outside world.
>>> Demo command:
>>> -object
>>> advanced-
>> watchdog,id=heart1,server=on,awd_node=h1,notification_node=he
>>> artbeat0,opt_script=opt_script_path,iothread=iothread1,pulse_interval=
>>> 1000,timeout=5000
>>>
>>> Signed-off-by: Zhang Chen <chen.zhang@intel.com>
>>> ---
>>>    net/Makefile.objs |   1 +
>>>    net/awd.c         | 261
>> ++++++++++++++++++++++++++++++++++++++++++++++
>>>    qemu-options.hx   |   6 ++
>>>    3 files changed, 268 insertions(+)
>>>    create mode 100644 net/awd.c
>>>
>>> diff --git a/net/Makefile.objs b/net/Makefile.objs index
>>> c5d076d19c..139b1394e9 100644
>>> --- a/net/Makefile.objs
>>> +++ b/net/Makefile.objs
>>> @@ -19,6 +19,7 @@ common-obj-y += colo-compare.o
>>>    common-obj-y += colo.o
>>>    common-obj-y += filter-rewriter.o
>>>    common-obj-y += filter-replay.o
>>> +common-obj-y += awd.o
>> Can you add a net/Kconfig file introducing the ADVANCED_WATCHDOG
>> selector?
>>
>> config COLO_ADVANCED_WATCHDOG
>>       bool
>>       default n
>>
>> Then use here:
>>
>>       common-obj-$(COLO_ADVANCED_WATCHDOG) += awd.o
>>
> 
> Sure, but AWD is a universal module,  COLO is just the first user.
> Maybe use "config ADVANCED_WATCHDOG" is better.

Oh I see, better then.

Then we might add (later)

   config COLO
       ...
       select ADVANCED_WATCHDOG

Thanks!

Phil.

>>>    tap-obj-$(CONFIG_LINUX) = tap-linux.o
>>>    tap-obj-$(CONFIG_BSD) = tap-bsd.o
>> [...]
Zhang, Chen Oct. 24, 2019, 3:07 a.m. UTC | #6
> -----Original Message-----
> From: Philippe Mathieu-Daudé <philmd@redhat.com>
> Sent: Wednesday, October 23, 2019 7:39 PM
> To: Zhang, Chen <chen.zhang@intel.com>; Jason Wang
> <jasowang@redhat.com>; Paolo Bonzini <pbonzini@redhat.com>; qemu-
> dev <qemu-devel@nongnu.org>
> Cc: Zhang Chen <zhangckid@gmail.com>
> Subject: Re: [RFC PATCH 1/4] net/awd.c: Introduce Advanced Watch Dog
> module framework
> 
> On 10/23/19 1:09 PM, Zhang, Chen wrote:
> >> -----Original Message-----
> >> From: Philippe Mathieu-Daudé <philmd@redhat.com>
> >> Sent: Wednesday, October 23, 2019 7:01 PM
> >> To: Zhang, Chen <chen.zhang@intel.com>; Jason Wang
> >> <jasowang@redhat.com>; Paolo Bonzini <pbonzini@redhat.com>; qemu-
> dev
> >> <qemu-devel@nongnu.org>
> >> Cc: Zhang Chen <zhangckid@gmail.com>
> >> Subject: Re: [RFC PATCH 1/4] net/awd.c: Introduce Advanced Watch Dog
> >> module framework
> >>
> >> Hi Chen,
> >>
> >> On 10/16/19 1:22 PM, Zhang Chen wrote:
> >>> From: Zhang Chen <chen.zhang@intel.com>
> >>>
> >>> This patch introduce a new module named Advanced Watch Dog, and
> >>> defined the input and output parameter. AWD use standard chardev as
> >>> the way of communicationg with the outside world.
> >>> Demo command:
> >>> -object
> >>> advanced-
> >> watchdog,id=heart1,server=on,awd_node=h1,notification_node=he
> >>> artbeat0,opt_script=opt_script_path,iothread=iothread1,pulse_interva
> >>> l=
> >>> 1000,timeout=5000
> >>>
> >>> Signed-off-by: Zhang Chen <chen.zhang@intel.com>
> >>> ---
> >>>    net/Makefile.objs |   1 +
> >>>    net/awd.c         | 261
> >> ++++++++++++++++++++++++++++++++++++++++++++++
> >>>    qemu-options.hx   |   6 ++
> >>>    3 files changed, 268 insertions(+)
> >>>    create mode 100644 net/awd.c
> >>>
> >>> diff --git a/net/Makefile.objs b/net/Makefile.objs index
> >>> c5d076d19c..139b1394e9 100644
> >>> --- a/net/Makefile.objs
> >>> +++ b/net/Makefile.objs
> >>> @@ -19,6 +19,7 @@ common-obj-y += colo-compare.o
> >>>    common-obj-y += colo.o
> >>>    common-obj-y += filter-rewriter.o
> >>>    common-obj-y += filter-replay.o
> >>> +common-obj-y += awd.o
> >> Can you add a net/Kconfig file introducing the ADVANCED_WATCHDOG
> >> selector?
> >>
> >> config COLO_ADVANCED_WATCHDOG
> >>       bool
> >>       default n
> >>
> >> Then use here:
> >>
> >>       common-obj-$(COLO_ADVANCED_WATCHDOG) += awd.o
> >>
> >
> > Sure, but AWD is a universal module,  COLO is just the first user.
> > Maybe use "config ADVANCED_WATCHDOG" is better.
> 
> Oh I see, better then.
> 
> Then we might add (later)
> 
>    config COLO
>        ...
>        select ADVANCED_WATCHDOG
> 

I noticed that we haven't the "net/kconfig" file, the AWD isn't a HW in the hw/net.
Do you means we can add the selector in "configuration" file?
We can add some related configuration command like "--enable-advanced-watchdog" and default is "no".

Thanks
Zhang Chen

> Thanks!
> 
> Phil.
> 
> >>>    tap-obj-$(CONFIG_LINUX) = tap-linux.o
> >>>    tap-obj-$(CONFIG_BSD) = tap-bsd.o
> >> [...]
diff mbox series

Patch

diff --git a/net/Makefile.objs b/net/Makefile.objs
index c5d076d19c..139b1394e9 100644
--- a/net/Makefile.objs
+++ b/net/Makefile.objs
@@ -19,6 +19,7 @@  common-obj-y += colo-compare.o
 common-obj-y += colo.o
 common-obj-y += filter-rewriter.o
 common-obj-y += filter-replay.o
+common-obj-y += awd.o
 
 tap-obj-$(CONFIG_LINUX) = tap-linux.o
 tap-obj-$(CONFIG_BSD) = tap-bsd.o
diff --git a/net/awd.c b/net/awd.c
new file mode 100644
index 0000000000..d42b4a7372
--- /dev/null
+++ b/net/awd.c
@@ -0,0 +1,261 @@ 
+/*
+ * Advanced Watch Dog
+ *
+ * COarse-grain LOck-stepping Virtual Machines for Non-stop Service (COLO)
+ * (a.k.a. Fault Tolerance or Continuous Replication)
+ *
+ * Copyright (c) 2019 Intel Corporation
+ *
+ * Author: Zhang Chen <chen.zhang@intel.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or
+ * later.  See the COPYING file in the top-level directory.
+ */
+
+#include "qemu/osdep.h"
+#include "qemu/error-report.h"
+#include "trace.h"
+#include "qemu-common.h"
+#include "qapi/error.h"
+#include "net/net.h"
+#include "qom/object_interfaces.h"
+#include "qom/object.h"
+#include "chardev/char-fe.h"
+#include "qemu/sockets.h"
+#include "sysemu/iothread.h"
+
+#define TYPE_AWD  "advanced-watchdog"
+#define AWD(obj)  OBJECT_CHECK(AwdState, (obj), TYPE_AWD)
+
+#define AWD_READ_LEN_MAX NET_BUFSIZE
+/* Default advanced watchdog pulse interval */
+#define AWD_PULSE_INTERVAL_DEFAULT 5000
+/* Default advanced watchdog timeout */
+#define AWD_TIMEOUT_DEFAULT 2000
+
+typedef struct AwdState {
+    Object parent;
+
+    bool server;
+    char *awd_node;
+    char *notification_node;
+    char *opt_script;
+    uint32_t pulse_interval;
+    uint32_t timeout;
+    IOThread *iothread;
+} AwdState;
+
+typedef struct AwdClass {
+    ObjectClass parent_class;
+} AwdClass;
+
+static char *awd_get_node(Object *obj, Error **errp)
+{
+    AwdState *s = AWD(obj);
+
+    return g_strdup(s->awd_node);
+}
+
+static void awd_set_node(Object *obj, const char *value, Error **errp)
+{
+    AwdState *s = AWD(obj);
+
+    g_free(s->awd_node);
+    s->awd_node = g_strdup(value);
+}
+
+static char *noti_get_node(Object *obj, Error **errp)
+{
+    AwdState *s = AWD(obj);
+
+    return g_strdup(s->notification_node);
+}
+
+static void noti_set_node(Object *obj, const char *value, Error **errp)
+{
+    AwdState *s = AWD(obj);
+
+    g_free(s->notification_node);
+    s->notification_node = g_strdup(value);
+}
+
+static char *opt_script_get_node(Object *obj, Error **errp)
+{
+    AwdState *s = AWD(obj);
+
+    return g_strdup(s->opt_script);
+}
+
+static void opt_script_set_node(Object *obj, const char *value, Error **errp)
+{
+    AwdState *s = AWD(obj);
+
+    g_free(s->opt_script);
+    s->opt_script = g_strdup(value);
+}
+
+static bool awd_get_server(Object *obj, Error **errp)
+{
+    AwdState *s = AWD(obj);
+
+    return s->server;
+}
+
+static void awd_set_server(Object *obj, bool value, Error **errp)
+{
+    AwdState *s = AWD(obj);
+
+    s->server = value;
+}
+
+static void awd_get_interval(Object *obj, Visitor *v,
+                                   const char *name, void *opaque,
+                                   Error **errp)
+{
+    AwdState *s = AWD(obj);
+    uint32_t value = s->pulse_interval;
+
+    visit_type_uint32(v, name, &value, errp);
+}
+
+static void awd_set_interval(Object *obj, Visitor *v,
+                                   const char *name, void *opaque,
+                                   Error **errp)
+{
+    AwdState *s = AWD(obj);
+    Error *local_err = NULL;
+    uint32_t value;
+
+    visit_type_uint32(v, name, &value, &local_err);
+    if (local_err) {
+        goto out;
+    }
+    if (!value) {
+        error_setg(&local_err, "Property '%s.%s' requires a positive value",
+                   object_get_typename(obj), name);
+        goto out;
+    }
+    s->pulse_interval = value;
+
+out:
+    error_propagate(errp, local_err);
+}
+
+static void awd_get_timeout(Object *obj, Visitor *v,
+                            const char *name, void *opaque,
+                            Error **errp)
+{
+    AwdState *s = AWD(obj);
+    uint32_t value = s->timeout;
+
+    visit_type_uint32(v, name, &value, errp);
+}
+
+static void awd_set_timeout(Object *obj, Visitor *v,
+                            const char *name, void *opaque,
+                            Error **errp)
+{
+    AwdState *s = AWD(obj);
+    Error *local_err = NULL;
+    uint32_t value;
+
+    visit_type_uint32(v, name, &value, &local_err);
+    if (local_err) {
+        goto out;
+    }
+
+    if (!value) {
+        error_setg(&local_err, "Property '%s.%s' requires a positive value",
+                   object_get_typename(obj), name);
+        goto out;
+    }
+    s->timeout = value;
+
+out:
+    error_propagate(errp, local_err);
+}
+
+static void awd_complete(UserCreatable *uc, Error **errp)
+{
+    AwdState *s = AWD(uc);
+
+    if (!s->awd_node || !s->iothread ||
+        !s->notification_node || !s->opt_script) {
+        error_setg(errp, "advanced-watchdog needs 'awd_node', "
+                   "'notification_node', 'opt_script' "
+                   "and 'server' property set");
+        return;
+    }
+
+    return;
+}
+
+static void awd_class_init(ObjectClass *oc, void *data)
+{
+    UserCreatableClass *ucc = USER_CREATABLE_CLASS(oc);
+
+    ucc->complete = awd_complete;
+}
+
+static void awd_init(Object *obj)
+{
+    AwdState *s = AWD(obj);
+
+    object_property_add_str(obj, "awd_node",
+                            awd_get_node, awd_set_node,
+                            NULL);
+
+    object_property_add_str(obj, "notification_node",
+                            noti_get_node, noti_set_node,
+                            NULL);
+
+    object_property_add_str(obj, "opt_script",
+                            opt_script_get_node, opt_script_set_node,
+                            NULL);
+
+    object_property_add_bool(obj, "server",
+                             awd_get_server,
+                             awd_set_server, NULL);
+
+    object_property_add(obj, "pulse_interval", "uint32",
+                        awd_get_interval,
+                        awd_set_interval, NULL, NULL, NULL);
+
+    object_property_add(obj, "timeout", "uint32",
+                        awd_get_timeout,
+                        awd_set_timeout, NULL, NULL, NULL);
+
+    object_property_add_link(obj, "iothread", TYPE_IOTHREAD,
+                            (Object **)&s->iothread,
+                            object_property_allow_set_link,
+                            OBJ_PROP_LINK_STRONG, NULL);
+}
+
+static void awd_finalize(Object *obj)
+{
+    AwdState *s = AWD(obj);
+
+    g_free(s->awd_node);
+    g_free(s->notification_node);
+}
+
+static const TypeInfo awd_info = {
+    .name = TYPE_AWD,
+    .parent = TYPE_OBJECT,
+    .instance_size = sizeof(AwdState),
+    .instance_init = awd_init,
+    .instance_finalize = awd_finalize,
+    .class_size = sizeof(AwdClass),
+    .class_init = awd_class_init,
+    .interfaces = (InterfaceInfo[]) {
+        { TYPE_USER_CREATABLE },
+        { }
+    }
+};
+
+static void register_types(void)
+{
+    type_register_static(&awd_info);
+}
+
+type_init(register_types);
diff --git a/qemu-options.hx b/qemu-options.hx
index 793d70ff93..a4c1e2e2d1 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -4520,6 +4520,12 @@  Dump the network traffic on netdev @var{dev} to the file specified by
 The file format is libpcap, so it can be analyzed with tools such as tcpdump
 or Wireshark.
 
+@item -object advanced-watchdog,id=@var{id},awd_node=@var{chardevid},notification_node=@var{chardevid},server=@var{server},iothread=@var{id}[,pulse_interval=@var{time_ms},timeout=@var{time_ms}]
+
+Advanced Watch Dog is an universal monitoring module on VMM side, it can be used to detect network down(VMM to guest, VMM to VMM, VMM to another remote server) and do previously set operation.
+for example: send message to admin, notify another VMM, send qmp command to qemu do some operation like restart the VM, build VMM heartbeat system, etc.
+It make user have basic VM/Host network monitoring tools and basic false tolerance and recovery solution.
+
 @item -object colo-compare,id=@var{id},primary_in=@var{chardevid},secondary_in=@var{chardevid},outdev=@var{chardevid},iothread=@var{id}[,vnet_hdr_support][,notify_dev=@var{id}]
 
 Colo-compare gets packet from primary_in@var{chardevid} and secondary_in@var{chardevid}, than compare primary packet with