Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quelle  xdp_sample_user.h   Sprache: C

 
// SPDX-License-Identifier: GPL-2.0-only
#ifndef XDP_SAMPLE_USER_H
#define XDP_SAMPLE_USER_H

#include <bpf/libbpf.h>
#include <linux/compiler.h>

#include "xdp_sample_shared.h"

enum stats_mask {
 _SAMPLE_REDIRECT_MAP         = 1U << 0,
 SAMPLE_RX_CNT                = 1U << 1,
 SAMPLE_REDIRECT_ERR_CNT      = 1U << 2,
 SAMPLE_CPUMAP_ENQUEUE_CNT    = 1U << 3,
 SAMPLE_CPUMAP_KTHREAD_CNT    = 1U << 4,
 SAMPLE_EXCEPTION_CNT         = 1U << 5,
 SAMPLE_DEVMAP_XMIT_CNT       = 1U << 6,
 SAMPLE_REDIRECT_CNT          = 1U << 7,
 SAMPLE_REDIRECT_MAP_CNT      = SAMPLE_REDIRECT_CNT | _SAMPLE_REDIRECT_MAP,
 SAMPLE_REDIRECT_ERR_MAP_CNT  = SAMPLE_REDIRECT_ERR_CNT | _SAMPLE_REDIRECT_MAP,
 SAMPLE_DEVMAP_XMIT_CNT_MULTI = 1U << 8,
 SAMPLE_SKIP_HEADING      = 1U << 9,
};

/* Exit return codes */
#define EXIT_OK   0
#define EXIT_FAIL  1
#define EXIT_FAIL_OPTION 2
#define EXIT_FAIL_XDP  3
#define EXIT_FAIL_BPF  4
#define EXIT_FAIL_MEM  5

int sample_setup_maps(struct bpf_map **maps);
int __sample_init(int mask);
void sample_exit(int status);
int sample_run(int interval, void (*post_cb)(void *), void *ctx);

void sample_switch_mode(void);
int sample_install_xdp(struct bpf_program *xdp_prog, int ifindex, bool generic,
         bool force);
void sample_usage(char *argv[], const struct option *long_options,
    const char *doc, int mask, bool error);

const char *get_driver_name(int ifindex);
int get_mac_addr(int ifindex, void *mac_addr);

#pragma GCC diagnostic push
#ifndef __clang__
#pragma GCC diagnostic ignored "-Wstringop-truncation"
#endif
__attribute__((unused))
static inline char *safe_strncpy(char *dst, const char *src, size_t size)
{
 if (!size)
  return dst;
 strncpy(dst, src, size - 1);
 dst[size - 1] = '\0';
 return dst;
}
#pragma GCC diagnostic pop

#define __attach_tp(name)                                                      \
 ({                                                                     \
  if (bpf_program__type(skel->progs.name) != BPF_PROG_TYPE_TRACING)\
   return -EINVAL;                                        \
  skel->links.name = bpf_program__attach(skel->progs.name);      \
  if (!skel->links.name)                                         \
   return -errno;                                         \
 })

#define sample_init_pre_load(skel)                                             \
 ({                                                                     \
  skel->rodata->nr_cpus = libbpf_num_possible_cpus();            \
  sample_setup_maps((struct bpf_map *[]){                        \
   skel->maps.rx_cnt, skel->maps.redir_err_cnt,           \
   skel->maps.cpumap_enqueue_cnt,                         \
   skel->maps.cpumap_kthread_cnt,                         \
   skel->maps.exception_cnt, skel->maps.devmap_xmit_cnt,  \
   skel->maps.devmap_xmit_cnt_multi });                   \
 })

#define DEFINE_SAMPLE_INIT(name)                                               \
 static int sample_init(struct name *skel, int mask)                    \
 {                                                                      \
  int ret;                                                       \
  ret = __sample_init(mask);                                     \
  if (ret < 0)                                                   \
   return ret;                                            \
  if (mask & SAMPLE_REDIRECT_MAP_CNT)                            \
   __attach_tp(tp_xdp_redirect_map);                      \
  if (mask & SAMPLE_REDIRECT_CNT)                                \
   __attach_tp(tp_xdp_redirect);                          \
  if (mask & SAMPLE_REDIRECT_ERR_MAP_CNT)                        \
   __attach_tp(tp_xdp_redirect_map_err);                  \
  if (mask & SAMPLE_REDIRECT_ERR_CNT)                            \
   __attach_tp(tp_xdp_redirect_err);                      \
  if (mask & SAMPLE_CPUMAP_ENQUEUE_CNT)                          \
   __attach_tp(tp_xdp_cpumap_enqueue);                    \
  if (mask & SAMPLE_CPUMAP_KTHREAD_CNT)                          \
   __attach_tp(tp_xdp_cpumap_kthread);                    \
  if (mask & SAMPLE_EXCEPTION_CNT)                               \
   __attach_tp(tp_xdp_exception);                         \
  if (mask & SAMPLE_DEVMAP_XMIT_CNT)                             \
   __attach_tp(tp_xdp_devmap_xmit);                       \
  if (mask & SAMPLE_DEVMAP_XMIT_CNT_MULTI)                       \
   __attach_tp(tp_xdp_devmap_xmit_multi);                 \
  return 0;                                                      \
 }

#endif

Messung V0.5
C=99 H=100 G=99

¤ Dauer der Verarbeitung: 0.20 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge