aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/acl/manual_fns.h
blob: f2585a9985d8733d21ccb499fc5134c8603dd60f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
/*
 *------------------------------------------------------------------
 * svmdb.h - shared VM database
 *
 * Copyright (c) 2009 Cisco and/or its affiliates.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at:
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *------------------------------------------------------------------
 */

#ifndef __included_svmdb_h__
#define __included_svmdb_h__

#include "svm.h"

typedef enum
{
  SVMDB_ACTION_ILLEGAL = 0,
  SVMDB_ACTION_GET,		/* not clear why anyone would care */
  SVMDB_ACTION_SET,
  SVMDB_ACTION_UNSET,
} svmdb_action_t;

typedef struct
{
  int pid;
  int signum;
  u32 action:4;
  u32 opaque:28;
} svmdb_notify_t;

typedef struct
{
  u8 *value;
  svmdb_notify_t *notifications;
  u32 elsize;
} svmdb_value_t;

typedef enum
{
  SVMDB_NAMESPACE_STRING = 0,
  SVMDB_NAMESPACE_VEC,
  SVMDB_N_NAMESPACES,
} svmdb_namespace_t;

typedef struct
{
  uword version;
  /* pool of values */
  svmdb_value_t *values;
  uword *namespaces[SVMDB_N_NAMESPACES];
} svmdb_shm_hdr_t;

#define SVMDB_SHM_VERSION 2

typedef struct
{
  int flags;
  int pid;
  svm_region_t *db_rp;
  svmdb_shm_hdr_t *shm;
} svmdb_client_t;

typedef struct
{
  int add_del;
  svmdb_namespace_t nspace;
  char *var;
  u32 elsize;
  int signum;
  u32 action:4;
  u32 opaque:28;
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
/*
 * Copyright (c) 2016 Cisco and/or its affiliates.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at:
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef included_manual_fns_h
#define included_manual_fns_h

#include <vnet/ip/format.h>
#include <vnet/ethernet/ethernet.h>
#include <vnet/ip/ip_types_api.h>

#define vl_endianfun            /* define message structures */
#include <acl/acl_types.api.h>
#undef vl_endianfun

/* Macro to finish up custom dump fns */
#define PRINT_S \
    vec_add1 (s, 0);                            \
    vl_print (handle, (char *)s);               \
    vec_free (s);

static inline void
vl_api_acl_rule_t_array_endian(vl_api_acl_rule_t *rules, u32 count)
{
  u32 i;
  for(i=0; i<count; i++) {
    vl_api_acl_rule_t_endian (&rules[i]);
  }
}

static inline void
vl_api_macip_acl_rule_t_array_endian(vl_api_macip_acl_rule_t *rules, u32 count)
{
  u32 i;
  for(i=0; i<count; i++) {
    vl_api_macip_acl_rule_t_endian (&rules[i]);
  }
}

static inline void
vl_api_acl_details_t_endian (vl_api_acl_details_t * a)
{
  a->_vl_msg_id = clib_net_to_host_u16 (a->_vl_msg_id);
  a->context = clib_net_to_host_u32 (a->context);
  a->acl_index = clib_net_to_host_u32 (a->acl_index);
  /* a->tag[0..63] = a->tag[0..63] (no-op) */
  a->count = clib_net_to_host_u32 (a->count);
  vl_api_acl_rule_t_array_endian (a->r, a->count);
}

static inline void
vl_api_macip_acl_details_t_endian (vl_api_macip_acl_details_t * a)
{
  a->_vl_msg_id = clib_net_to_host_u16 (a->_vl_msg_id);
  a->context = clib_net_to_host_u32 (a->context);
  a->acl_index = clib_net_to_host_u32 (a->acl_index);
  /* a->tag[0..63] = a->tag[0..63] (no-op) */
  a->count = clib_net_to_host_u32 (a->count);
  vl_api_macip_acl_rule_t_array_endian (a->r, a->count);
}


static inline void
vl_api_acl_add_replace_t_endian (vl_api_acl_add_replace_t * a)
{
  a->_vl_msg_id = clib_net_to_host_u16 (a->_vl_msg_id);
  a->client_index = clib_net_to_host_u32 (a->client_index);
  a->context = clib_net_to_host_u32 (a->context);
  a->acl_index = clib_net_to_host_u32 (a->acl_index);
  /* a->tag[0..63] = a->tag[0..63] (no-op) */
  a->count = clib_net_to_host_u32 (a->count);
  vl_api_acl_rule_t_array_endian (a->r, a->count);
}

static inline void
vl_api_macip_acl_add_t_endian (vl_api_macip_acl_add_t * a)
{
  a->_vl_msg_id = clib_net_to_host_u16 (a->_vl_msg_id);
  a->client_index = clib_net_to_host_u32 (a->client_index);
  a->context = clib_net_to_host_u32 (a->context);
  /* a->tag[0..63] = a->tag[0..63] (no-op) */
  a->count = clib_net_to_host_u32 (a->count);
  vl_api_macip_acl_rule_t_array_endian (a->r, a->count);
}

static inline void
vl_api_macip_acl_add_replace_t_endian (vl_api_macip_acl_add_replace_t * a)
{
  a->_vl_msg_id = clib_net_to_host_u16 (a->_vl_msg_id);
  a->client_index = clib_net_to_host_u32 (a->client_index);
  a->context = clib_net_to_host_u32 (a->context);
  a->acl_index = clib_net_to_host_u32 (a->acl_index);
  /* a->tag[0..63] = a->tag[0..63] (no-op) */
  a->count = clib_net_to_host_u32 (a->count);
  vl_api_macip_acl_rule_t_array_endian (a->r, a->count);
}

static inline u8 *
format_acl_action(u8 *s, u8 action)
{
  switch(action) {
    case 0:
      s = format (s, "deny");
      break;
    case 1:
      s = format (s, "permit");
      break;
    case 2:
      s = format (s, "permit+reflect");
      break;
    default:
      s = format (s, "action %d", action);
  }
  return(s);
}

static inline void *
vl_api_acl_rule_t_print (vl_api_acl_rule_t * a, void *handle)
{
  u8 *s;
  ip_prefix_t src, dst;

  ip_prefix_decode2 (&a->src_prefix, &src);
  ip_prefix_decode2 (&a->dst_prefix, &dst);

  s = format (0, "  %s ", a->src_prefix.address.af ? "ipv6" : "ipv4");
  s = format_acl_action (s, a->is_permit);
  s = format (s, " \\\n");

  s = format (s, "    src %U dst %U \\\n",
              format_ip_prefix, &src,
              format_ip_prefix, &dst);
  s = format (s, "    proto %d \\\n", a->proto);
  s = format (s, "    sport %d-%d dport %d-%d \\\n",
	      clib_net_to_host_u16 (a->srcport_or_icmptype_first),
	      clib_net_to_host_u16 (a->srcport_or_icmptype_last),
	      clib_net_to_host_u16 (a->dstport_or_icmpcode_first),
	      clib_net_to_host_u16 (a->dstport_or_icmpcode_last));

  s = format (s, "    tcpflags %u mask %u, \\",
	      a->tcp_flags_value, a->tcp_flags_mask);
  PRINT_S;
  return handle;
}

static inline void *
vl_api_macip_acl_rule_t_print (vl_api_macip_acl_rule_t * a, void *handle)
{
  u8 *s;
  ip_prefix_t src;

  ip_prefix_decode2 (&a->src_prefix, &src);

  s = format (0, "  %s %s \\\n", a->src_prefix.address.af ? "ipv6" : "ipv4",
              a->is_permit ? "permit" : "deny");

  s = format (s, "    src mac %U mask %U \\\n",
	      format_ethernet_address, a->src_mac,
	      format_ethernet_address, a->src_mac_mask);

  s = format (s, "    src ip %U, \\",
		format_ip_prefix, &src);

  PRINT_S;
  return handle;
}

static inline void *
vl_api_acl_add_replace_t_print (vl_api_acl_add_replace_t * a, void *handle)
{
  u8 *s = 0;
  int i;
  u32 acl_index = clib_net_to_host_u32 (a->acl_index);
  u32 count = clib_net_to_host_u32 (a->count);
  if (count > 0x100000)
    {
      s = format (s, "WARN: acl_add_replace count endianness wrong? Fixup to avoid long loop.\n");
      count = a->count;
    }

  s = format (s, "SCRIPT: acl_add_replace %d count %d ",
	      acl_index, count);

  if (a->tag[0])
    s = format (s, "tag %s ", a->tag);

  s = format(s, "\\\n");
  PRINT_S;

  for (i = 0; i < count; i++)
    vl_api_acl_rule_t_print (&a->r[i], handle);

  s = format(s, "\n");
  PRINT_S;
  return handle;
}

static inline void *
vl_api_acl_del_t_print (vl_api_macip_acl_del_t * a, void *handle)
{
  u8 *s;

  s = format (0, "SCRIPT: acl_del %d ",
              clib_host_to_net_u32 (a->acl_index));

  PRINT_S;
  return handle;
}


static inline void *
vl_api_acl_details_t_print (vl_api_acl_details_t * a, void *handle)
{
  u8 *s = 0;
  int i;
  u32 acl_index = clib_net_to_host_u32 (a->acl_index);
  u32 count = clib_net_to_host_u32 (a->count);
  if (count > 0x100000)
    {
      s = format (s, "WARN: acl_details count endianness wrong? Fixup to avoid long loop.\n");
      count = a->count;
    }

  s = format (s, "acl_details index %d count %d ",
	      acl_index, count);

  if (a->tag[0])
    s = format (s, "tag %s ", a->tag);

  s = format(s, "\n");
  PRINT_S;

  for (i = 0; i < count; i++)
    vl_api_acl_rule_t_print (&a->r[i], handle);

  return handle;
}

static inline void *
vl_api_macip_acl_details_t_print (vl_api_macip_acl_details_t * a,
				  void *handle)
{
  u8 *s = 0;
  int i;
  u32 acl_index = clib_net_to_host_u32 (a->acl_index);
  u32 count = clib_net_to_host_u32 (a->count);
  if (count > 0x100000)
    {
      s = format (s, "WARN: macip_acl_details count endianness wrong? Fixup to avoid long loop.\n");
      count = a->count;
    }

  s = format (s, "macip_acl_details index %d count %d ",
	      acl_index, count);

  if (a->tag[0])
    s = format (s, "tag %s ", a->tag);

  s = format(s, "\n");
  PRINT_S;

  for (i = 0; i < count; i++)
    vl_api_macip_acl_rule_t_print (&a->r[i], handle);

  return handle;
}

static inline void *
vl_api_macip_acl_add_t_print (vl_api_macip_acl_add_t * a, void *handle)
{
  u8 *s = 0;
  int i;
  u32 count = clib_net_to_host_u32 (a->count);
  if (count > 0x100000)
    {
      s = format (s, "WARN: macip_acl_add count endianness wrong? Fixup to avoid long loop.\n");
      count = a->count;
    }

  s = format (s, "SCRIPT: macip_acl_add ");
  if (a->tag[0])
    s = format (s, "tag %s ", a->tag);

  s = format (s, "count %d \\\n", count);

  PRINT_S;

  for (i = 0; i < count; i++)
    vl_api_macip_acl_rule_t_print (&a->r[i], handle);

  s = format (0, "\n");
  PRINT_S;

  return handle;
}

static inline void *
vl_api_macip_acl_add_replace_t_print (vl_api_macip_acl_add_replace_t * a, void *handle)
{
  u8 *s = 0;
  int i;
  u32 acl_index = clib_net_to_host_u32 (a->acl_index);
  u32 count = clib_net_to_host_u32 (a->count);
  if (count > 0x100000)
    {
      s = format (s, "WARN: macip_acl_add_replace count endianness wrong? Fixup to avoid long loop.\n");
      count = a->count;
    }

  s = format (s, "SCRIPT: macip_acl_add_replace %d count %d ",
        acl_index, count);
  if (a->tag[0])
    s = format (s, "tag %s ", a->tag);

  s = format (s, "count %d \\\n", count);

  PRINT_S;

  for (i = 0; i < count; i++)
    vl_api_macip_acl_rule_t_print (&a->r[i], handle);

  s = format (0, "\n");
  PRINT_S;

  return handle;
}

static inline void *
vl_api_acl_interface_set_acl_list_t_print (vl_api_acl_interface_set_acl_list_t
					   * a, void *handle)
{
  u8 *s;
  int i;

  s = format
    (0, "SCRIPT: acl_interface_set_acl_list sw_if_index %d count %d\n",
     clib_net_to_host_u32 (a->sw_if_index), (u32) a->count);

  s = format (s, "    input ");

  for (i = 0; i < a->count; i++)
    {
      if (i == a->n_input)
        s = format (s, "output ");
      s = format (s, "%d ", clib_net_to_host_u32 (a->acls[i]));
    }

  PRINT_S;
  return handle;
}

static inline void *
vl_api_acl_interface_set_etype_whitelist_t_print (vl_api_acl_interface_set_etype_whitelist_t
					   * a, void *handle)
{
  u8 *s;
  int i;

  s = format
    (0, "SCRIPT: acl_interface_set_etype_whitelist sw_if_index %d count %d\n",
     clib_net_to_host_u32 (a->sw_if_index), (u32) a->count);

  s = format (s, "    input ");

  for (i = 0; i < a->count; i++)
    {
      if (i == a->n_input)
        s = format (s, "output ");
      s = format (s, "%x ", clib_net_to_host_u16 (a->whitelist[i]));
    }

  PRINT_S;
  return handle;
}

static inline void *
vl_api_acl_interface_add_del_t_print (vl_api_acl_interface_add_del_t * a,
				      void *handle)
{
  u8 *s;

  s = format (0, "SCRIPT: acl_interface_add_del sw_if_index %d acl %d ",
	      clib_net_to_host_u32 (a->sw_if_index),
	      clib_net_to_host_u32 (a->acl_index));
  s = format (s, "%s %s",
	      a->is_input ? "input" : "output", a->is_add ? "add" : "del");

  PRINT_S;
  return handle;
}

static inline void *vl_api_macip_acl_interface_add_del_t_print
  (vl_api_macip_acl_interface_add_del_t * a, void *handle)
{
  u8 *s;

  s = format
    (0,
     "SCRIPT: macip_acl_interface_add_del sw_if_index %d acl_index %d ",
     clib_net_to_host_u32 (a->sw_if_index),
     clib_net_to_host_u32 (a->acl_index));
  s = format (s, "%s", a->is_add ? "add" : "del");

  PRINT_S;
  return handle;
}


static inline void *
vl_api_macip_acl_del_t_print (vl_api_macip_acl_del_t * a, void *handle)
{
  u8 *s;

  s = format (0, "SCRIPT: macip_acl_del %d ",
	      clib_host_to_net_u32 (a->acl_index));

  PRINT_S;
  return handle;
}


#endif /* included_manual_fns_h */