Hi Mikhail,

Many thanks for your contribution. I have slightly reviewed your patch
to test libpcap for pcap_setdirection() in configure.ac (as doing it the
way you did would fail compiling for older libpcap versions). See the
commit log here (of course with kudos to you):

https://github.com/pmacct/pmacct/commit/0780a48136f0f8bf9ad1e796253cfa100f64a90f

I will review soon your other patch.

Paolo

On Fri, Jan 17, 2020 at 01:01:52PM +0100, Mikhail Sennikovsky wrote:
> The pcap direction configuration was explicitly disabled
> in 81fe649917036b9ef1ed4b3ea521befcaf36496b,
> however even before that commit it apparently did not work,
> because the pcap_setdirection must be called after pcap_activate,
> not before it.
> 
> Introduce a new config variable, pcap_set_direction
> to allow pmacctd do pcap_setdirection.
> 
> Signed-off-by: Mikhail Sennikovsky <mikhail.sennikovs...@cloud.ionos.com>
> ---
>  src/cfg.c          |  1 +
>  src/cfg.h          |  1 +
>  src/cfg_handlers.c | 14 ++++++++++++++
>  src/cfg_handlers.h |  1 +
>  src/pmacctd.c      | 15 +++++++--------
>  5 files changed, 24 insertions(+), 8 deletions(-)
> 
> diff --git a/src/cfg.c b/src/cfg.c
> index 0dcf061..ddad54c 100644
> --- a/src/cfg.c
> +++ b/src/cfg.c
> @@ -47,6 +47,7 @@ static const struct _dictionary_line dictionary[] = {
>    {"pcap_interface_wait", cfg_key_pcap_interface_wait},
>    {"pcap_direction", cfg_key_pcap_direction},
>    {"pcap_ifindex", cfg_key_pcap_ifindex},
> +  {"pcap_set_direction", cfg_key_pcap_set_direction},
>    {"pcap_interfaces_map", cfg_key_pcap_interfaces_map},
>    {"core_proc_name", cfg_key_proc_name},
>    {"proc_priority", cfg_key_proc_priority},
> diff --git a/src/cfg.h b/src/cfg.h
> index 3641935..631b19b 100644
> --- a/src/cfg.h
> +++ b/src/cfg.h
> @@ -474,6 +474,7 @@ struct configuration {
>    char *pcap_savefile;
>    int pcap_direction;
>    int pcap_ifindex;
> +  int pcap_set_direction;
>    char *pcap_interfaces_map;
>    char *pcap_if;
>    int pcap_if_wait;
> diff --git a/src/cfg_handlers.c b/src/cfg_handlers.c
> index 0818b12..eac176c 100644
> --- a/src/cfg_handlers.c
> +++ b/src/cfg_handlers.c
> @@ -547,6 +547,20 @@ int cfg_key_pcap_ifindex(char *filename, char *name, 
> char *value_ptr)
>    return changes;
>  }
>  
> +int cfg_key_pcap_set_direction(char *filename, char *name, char *value_ptr)
> +{
> +  struct plugins_list_entry *list = plugins_list;
> +  int value, changes = 0;
> +
> +  value = parse_truefalse(value_ptr);
> +  if (value < 0) return ERR;
> +
> +  for (; list; list = list->next, changes++) list->cfg.pcap_set_direction = 
> value;
> +  if (name) Log(LOG_WARNING, "WARN: [%s] plugin name not supported for key 
> 'pcap_set_direction'. Globalized.\n", filename);
> +
> +  return changes;
> +}
> +
>  int cfg_key_pcap_interfaces_map(char *filename, char *name, char *value_ptr)
>  {
>    struct plugins_list_entry *list = plugins_list;
> diff --git a/src/cfg_handlers.h b/src/cfg_handlers.h
> index 3fdd103..5ab0585 100644
> --- a/src/cfg_handlers.h
> +++ b/src/cfg_handlers.h
> @@ -48,6 +48,7 @@ extern int cfg_key_pcap_savefile_delay(char *, char *, char 
> *);
>  extern int cfg_key_pcap_savefile_replay(char *, char *, char *);
>  extern int cfg_key_pcap_direction(char *, char *, char *);
>  extern int cfg_key_pcap_ifindex(char *, char *, char *);
> +extern int cfg_key_pcap_set_direction(char *, char *, char *);
>  extern int cfg_key_pcap_interfaces_map(char *, char *, char *);
>  extern int cfg_key_use_ip_next_hop(char *, char *, char *);
>  extern int cfg_key_decode_arista_trailer(char *, char *, char *);
> diff --git a/src/pmacctd.c b/src/pmacctd.c
> index 88fc367..1376a13 100644
> --- a/src/pmacctd.c
> +++ b/src/pmacctd.c
> @@ -152,18 +152,17 @@ pcap_t *pm_pcap_open(const char *dev_ptr, int snaplen, 
> int promisc,
>    if (protocol)
>      Log(LOG_WARNING, "WARN ( %s/core ): pcap_protocol specified but linked 
> against a version of libpcap that does not support pcap_set_protocol().\n", 
> config.name);
>  #endif
> -
> -  /* XXX: rely on external filtering for now */
> -/* 
> -  ret = pcap_setdirection(p, direction);
> -  if (ret < 0 && direction != PCAP_D_INOUT)
> -    Log(LOG_WARNING, "INFO ( %s/core ): direction specified but linked 
> against a version of libpcap that does not support pcap_setdirection().\n", 
> config.name);
> -*/
> -
> + 
>    ret = pcap_activate(p);
>    if (ret < 0)
>      goto err;
>  
> +  if (config.pcap_set_direction) {
> +    ret = pcap_setdirection(p, direction);
> +    if (ret < 0 && direction != PCAP_D_INOUT)
> +      Log(LOG_WARNING, "INFO ( %s/core ): direction specified but linked 
> against a version of libpcap that does not support pcap_setdirection()\n", 
> config.name);
> +  }
> +
>    return p;
>  
>  err:
> -- 
> 2.7.4
> 
> 
> _______________________________________________
> pmacct-discussion mailing list
> http://www.pmacct.net/#mailinglists

_______________________________________________
pmacct-discussion mailing list
http://www.pmacct.net/#mailinglists

Reply via email to