12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- // SPDX-License-Identifier: GPL-2.0-only
- /* Copyright (c) 2016 Facebook
- */
- #include <linux/unistd.h>
- #include <linux/bpf.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include <unistd.h>
- #include <string.h>
- #include <errno.h>
- #include <bpf/bpf.h>
- static void usage(void)
- {
- printf("Usage: tc_l2_ipip_redirect [...]\n");
- printf(" -U <file> Update an already pinned BPF array\n");
- printf(" -i <ifindex> Interface index\n");
- printf(" -h Display this help\n");
- }
- int main(int argc, char **argv)
- {
- const char *pinned_file = NULL;
- int ifindex = -1;
- int array_key = 0;
- int array_fd = -1;
- int ret = -1;
- int opt;
- while ((opt = getopt(argc, argv, "F:U:i:")) != -1) {
- switch (opt) {
- /* General args */
- case 'U':
- pinned_file = optarg;
- break;
- case 'i':
- ifindex = atoi(optarg);
- break;
- default:
- usage();
- goto out;
- }
- }
- if (ifindex < 0 || !pinned_file) {
- usage();
- goto out;
- }
- array_fd = bpf_obj_get(pinned_file);
- if (array_fd < 0) {
- fprintf(stderr, "bpf_obj_get(%s): %s(%d)\n",
- pinned_file, strerror(errno), errno);
- goto out;
- }
- /* bpf_tunnel_key.remote_ipv4 expects host byte orders */
- ret = bpf_map_update_elem(array_fd, &array_key, &ifindex, 0);
- if (ret) {
- perror("bpf_map_update_elem");
- goto out;
- }
- out:
- if (array_fd != -1)
- close(array_fd);
- return ret;
- }
|