summaryrefslogtreecommitdiffstats
path: root/src/vnet/ip/icmp4.c
AgeCommit message (Collapse)AuthorFilesLines
2019-10-28ping: move the echo responder into the ping pluginNeale Ranns1-200/+1
Type: feature Change-Id: I246346b82858e73b16d727e2106350bc0fc3c6f2 Signed-off-by: Neale Ranns <nranns@cisco.com>
2019-10-14ping: Move to pluginMohsin Kazmi1-9/+0
Type: refactor Change-Id: I51d5bf54dfd408aa0c406cbdf0f4be10ef19d10d Signed-off-by: Mohsin Kazmi <sykazmi@cisco.com>
2019-05-24Remove historical ip4 icmp OAM codeDave Barach1-0/+7
Add a registration overwritten warning to ip4_icmp_register_type(...) Change-Id: I6c2aabdb979b54ec49e827225acc74559ac4caab Signed-off-by: Dave Barach <dave@barachs.net>
2019-05-23Optimize codejackiechen19851-9/+4
Replace enqueue code with marcro vlib_validate_buffer_enqueue_x1 Change-Id: I4b454b1d73fa5adbaf5f40cf45dc8975878ac93b Signed-off-by: jackiechen1985 <xiaobo.chen@tieto.com>
2019-03-21icmp: bug fix of buffer->errorKingwel Xie1-1/+9
Recent changes in icmp4/6 choose to free the original buffer, and make a copy for sending icmp reply back. However, buffer->error will be ignored when the buffer is freed unconditionally. A quick fix can be moving the counter increment code to icmp, but I prefert to enqueue all buffers to 'error-drop' so that they can be handled in a batch rebase, using vlib_buffer_enqueue_to_single_next Change-Id: I9f3028b55f1d5f634763e2410cd91e17f368195e Signed-off-by: Kingwel Xie <kingwel.xie@ericsson.com>
2019-03-12ICMP46 error: Clone first buffer instead of "truncating" original bufferOle Troan1-22/+17
Previous code was walked buffer chain, effectively trying to "truncate" the chain, reset the length of first buffer and reused that as the ICMP error message. That could have issues in cases there were other users of the buffer chain. Update to clone the first buffer in chain, and use that for the ICMP error message instead. Change-Id: Ibc1a0bf2d854dae41874808c8297028ed93dd69d Signed-off-by: Ole Troan <ot@cisco.com>
2018-10-27pg: icmp4 & tcp4 ip length issueKingwel Xie1-1/+7
length in ip4 header could be 0, when the length edit is fixed this happens if length is not specified or size is specified as, f.g., 100-100 As a result, tcp and icmp would get a negative value for checksum calculation Change-Id: I55fa1f5e95717ea4149cb3b8c9b73caf88ae7f98 Signed-off-by: Kingwel Xie <kingwel.xie@ericsson.com>
2018-10-23c11 safe string handling supportDave Barach1-2/+3
Change-Id: Ied34720ca5a6e6e717eea4e86003e854031b6eab Signed-off-by: Dave Barach <dave@barachs.net>
2018-05-23VPP-1283: IPv4 PMTU missing MTU value in ICMP4 message.Ole Troan1-2/+4
Change-Id: I7a4133c59ff45b0744b48e246a049d9f015026fc Signed-off-by: Ole Troan <ot@cisco.com>
2018-04-13Revert "MTU: Setting of MTU on software interface (instead of hardware ↵Damjan Marion1-4/+2
interface)" This reverts commit 70083ee74c3141bbefb185525315f1b34497dcaa. Reverting as this patch is causing following crash: 0: /home/damarion/cisco/vpp3/build-data/../src/vnet/devices/devices.h:131 (vnet_get_device_input_thread_index) assertion `queue_id < vec_len (hw->input_node_thread_index_by_queue)' fails Aborted Change-Id: Ie2a365032110b1f67be7a9d832885b9899813d39 Signed-off-by: Damjan Marion <damarion@cisco.com>
2018-04-13MTU: Setting of MTU on software interface (instead of hardware interface)Ole Troan1-2/+4
Change-Id: I98bd454a761a1032738a21edeb0fe847e801f901 Signed-off-by: Ole Troan <ot@cisco.com>
2017-12-15Fix icmp/udp/tcp punt/drop pathsVijayabhaskar Katamreddy1-2/+2
Send packets to ip4/6_punt/drop nodes instead of error-drop/punt nodes dbarach: clean up an annoying checkstyle issue: indent 2.2.10 (OpenSUSE version) and indent 2.2.11 (Ubuntu / CentOS versions) had an artistic disagreement about ip_frag.c. Change-Id: I660bee28a064af9c6c70371363081e941d1c3a94 Signed-off-by: Vijayabhaskar Katamreddy <vkatamre@cisco.com> Signed-off-by: Dave Barach <dave@barachs.net>
2017-07-14vnet_buffer_t flags cleanupDamjan Marion1-3/+3
Change-Id: I123eccea98abafeb31f25d2a162501e2eded60d4 Signed-off-by: Damjan Marion <damarion@cisco.com>
2016-12-28Reorganize source tree to use single autotools instanceDamjan Marion1-0/+784
Change-Id: I7b51f88292e057c6443b12224486f2d0c9f8ae23 Signed-off-by: Damjan Marion <damarion@cisco.com>
t: 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) 2015 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.
 */
/*
 * format.c: generic network formatting/unformating
 *
 * Copyright (c) 2008 Eliot Dresselhaus
 *
 * Permission is hereby granted, free of charge, to any person obtaining
 * a copy of this software and associated documentation files (the
 * "Software"), to deal in the Software without restriction, including
 * without limitation the rights to use, copy, modify, merge, publish,
 * distribute, sublicense, and/or sell copies of the Software, and to
 * permit persons to whom the Software is furnished to do so, subject to
 * the following conditions:
 *
 * The above copyright notice and this permission notice shall be
 * included in all copies or substantial portions of the Software.
 *
 *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 *  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 *  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
 *  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 *  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 *  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

#include <vlib/vlib.h>

u8 *
format_vlib_rx_tx (u8 * s, va_list * args)
{
  vlib_rx_or_tx_t r = va_arg (*args, vlib_rx_or_tx_t);
  char *t;

  switch (r)
    {
    case VLIB_RX:
      t = "rx";
      break;
    case VLIB_TX:
      t = "tx";
      break;
    default:
      t = "INVALID";
      break;
    }

  vec_add (s, t, strlen (t));
  return s;
}

u8 *
format_vlib_read_write (u8 * s, va_list * args)
{
  vlib_rx_or_tx_t r = va_arg (*args, vlib_rx_or_tx_t);
  char *t;

  switch (r)
    {
    case VLIB_READ:
      t = "read";
      break;
    case VLIB_WRITE:
      t = "write";
      break;
    default:
      t = "INVALID";
      break;
    }

  vec_add (s, t, strlen (t));
  return s;
}

/* Formats buffer data as printable ascii or as hex. */
u8 *
format_vlib_buffer_data (u8 * s, va_list * args)
{
  u8 *data = va_arg (*args, u8 *);
  u32 n_data_bytes = va_arg (*args, u32);
  u32 i, is_printable;

  is_printable = 1;
  for (i = 0; i < n_data_bytes && is_printable; i++)
    {
      u8 c = data[i];
      if (c < 0x20)
	is_printable = 0;
      else if (c >= 0x7f)
	is_printable = 0;
    }

  if (is_printable)
    vec_add (s, data, n_data_bytes);
  else
    s = format (s, "%U", format_hex_bytes, data, n_data_bytes);

  return s;
}

/* Enable/on => 1; disable/off => 0. */
uword
unformat_vlib_enable_disable (unformat_input_t * input, va_list * args)
{
  int *result = va_arg (*args, int *);
  int enable;

  if (unformat (input, "enable") || unformat (input, "on"))
    enable = 1;
  else if (unformat (input, "disable") || unformat (input, "off"))
    enable = 0;
  else
    return 0;

  *result = enable;
  return 1;
}

/* rx/tx => VLIB_RX/VLIB_TX. */
uword
unformat_vlib_rx_tx (unformat_input_t * input, va_list * args)
{
  int *result = va_arg (*args, int *);
  if (unformat (input, "rx"))
    *result = VLIB_RX;
  else if (unformat (input, "tx"))
    *result = VLIB_TX;
  else
    return 0;
  return 1;
}

/* Parse an int either %d or 0x%x. */
uword
unformat_vlib_number (unformat_input_t * input, va_list * args)
{
  int *result = va_arg (*args, int *);

  return (unformat (input, "0x%x", result) || unformat (input, "%d", result));
}

/* Parse a-zA-Z0-9_ token and hash to value. */
uword
unformat_vlib_number_by_name (unformat_input_t * input, va_list * args)
{
  uword *hash = va_arg (*args, uword *);
  int *result = va_arg (*args, int *);
  uword *p;
  u8 *token;
  int i;

  if (!unformat_user (input, unformat_token, "a-zA-Z0-9_", &token))
    return 0;

  /* Null terminate. */
  if (vec_len (token) > 0 && token[vec_len (token) - 1] != 0)
    vec_add1 (token, 0);

  /* Check for exact match. */
  p = hash_get_mem (hash, token);
  if (p)
    goto done;

  /* Convert to upper case & try match. */
  for (i = 0; i < vec_len (token); i++)
    if (token[i] >= 'a' && token[i] <= 'z')
      token[i] = 'A' + token[i] - 'a';
  p = hash_get_mem (hash, token);

done:
  vec_free (token);
  if (p)
    *result = p[0];
  return p != 0;
}

/* Parse a filename to dump debug info */
uword
unformat_vlib_tmpfile (unformat_input_t * input, va_list * args)
{
  u8 **chroot_filename = va_arg (*args, u8 **);
  u8 *filename;

  if (!unformat (input, "%s", &filename))
    return 0;

  /* Brain-police user path input */
  if (strstr ((char *) filename, "..") || index ((char *) filename, '/'))
    {
      vec_free (filename);
      return 0;
    }

  *chroot_filename = format (0, "/tmp/%s%c", filename, 0);
  vec_free (filename);

  return 1;
}

u8 *
format_vlib_thread_name (u8 * s, va_list * args)
{
  u32 thread_index = va_arg (*args, u32);

  if (thread_index == 0)
    return format (s, "main");

  if (thread_index < vec_len (vlib_worker_threads))
    return format (s, "%s", vlib_worker_threads[thread_index].name);
  return s;
}

u8 *
format_vlib_thread_name_and_index (u8 * s, va_list * args)
{
  u32 thread_index = va_arg (*args, u32);

  return format (s, "%U (%u)", format_vlib_thread_name, thread_index,
		 thread_index);
}

/*
 * fd.io coding-style-patch-verification: ON
 *
 * Local Variables:
 * eval: (c-set-style "gnu")
 * End:
 */