1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * Copyright (c) 2022 Huawei Device Co., Ltd. 4 * 5 * Description: Demo example of configuring NewIP route. 6 * 7 * Author: Yang Yanjun <yangyanjun@huawei.com> 8 * 9 * Data: 2022-09-06 10 */ 11#include <sys/socket.h> 12#include <sys/ioctl.h> 13#include <errno.h> 14#include <string.h> 15#include <stdio.h> 16#include <unistd.h> 17#include <stdint.h> 18#include <linux/route.h> 19 20#include "nip_uapi.h" 21#include "nip_lib.h" 22#include "newip_route.h" 23 24/* get ifindex based on the device name 25 * struct ifreq ifr; 26 * struct nip_ifreq ifrn; 27 * ioctl(fd, SIOGIFINDEX, &ifr); 28 * ifr.ifr_ifindex; ===> ifindex 29 */ 30int nip_route_add(int ifindex, const unsigned char *dst_addr, uint8_t dst_addr_len, 31 const unsigned char *gateway_addr, uint8_t gateway_addr_len) 32{ 33 int fd, ret; 34 struct nip_rtmsg rt; 35 36 fd = socket(AF_NINET, SOCK_DGRAM, 0); 37 if (fd < 0) 38 return -1; 39 40 memset(&rt, 0, sizeof(rt)); 41 rt.rtmsg_ifindex = ifindex; 42 rt.rtmsg_flags = RTF_UP; 43 rt.rtmsg_dst.bitlen = dst_addr_len * BITS_PER_BYTE; 44 memcpy(rt.rtmsg_dst.NIP_ADDR_FIELD8, dst_addr, dst_addr_len); 45 46 if (gateway_addr) { 47 rt.rtmsg_gateway.bitlen = gateway_addr_len * BITS_PER_BYTE; 48 memcpy(rt.rtmsg_gateway.NIP_ADDR_FIELD8, gateway_addr, gateway_addr_len); 49 rt.rtmsg_flags |= RTF_GATEWAY; 50 } 51 52 ret = ioctl(fd, SIOCADDRT, &rt); 53 if (ret < 0 && errno != EEXIST) { // ignore File Exists error 54 close(fd); 55 return -1; 56 } 57 58 close(fd); 59 return 0; 60} 61 62int main(int argc, char **argv) 63{ 64 int ret; 65 int ifindex = 0; 66 uint8_t client_addr[INDEX_1] = {0x50}; // 1-byte address of the client: 0x50 67 uint8_t server_addr[INDEX_2] = {0xDE, 0x00}; // 2-byte address of the server: 0xDE00 68 uint8_t *dst_addr; 69 uint8_t dst_addr_len; 70 71 if (argc == DEMO_INPUT_1) { 72 if (!strcmp(*(argv + 1), "server")) { 73 printf("server cfg route, dst-addr=0x%02x\n", client_addr[INDEX_0]); 74 dst_addr = client_addr; 75 dst_addr_len = 1; 76 } else if (!strcmp(*(argv + 1), "client")) { 77 printf("client cfg route, dst-addr=0x%02x%02x\n", 78 server_addr[INDEX_0], server_addr[INDEX_1]); 79 dst_addr = server_addr; 80 dst_addr_len = INDEX_2; 81 } else { 82 printf("invalid route cfg input\n"); 83 return -1; 84 } 85 } else { 86 printf("unsupport route cfg input\n"); 87 return -1; 88 } 89 90 ret = nip_get_ifindex(NIC_NAME, &ifindex); 91 if (ret != 0) { 92 printf("get %s ifindex fail, ret=%d\n", NIC_NAME, ret); 93 return -1; 94 } 95 96 ret = nip_route_add(ifindex, dst_addr, dst_addr_len, NULL, 0); 97 if (ret != 0) { 98 printf("get %s ifindex fail, ret=%d\n", NIC_NAME, ret); 99 return -1; 100 } 101 102 printf("%s %s(ifindex=%d) cfg route success\n", *argv, NIC_NAME, ifindex); 103 return 0; 104} 105 106