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 address. 6 * 7 * Author: Yang Yanjun <yangyanjun@huawei.com> 8 * 9 * Data: 2022-07-18 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 18#include "nip_uapi.h" 19#include "nip_lib.h" 20 21/* get ifindex based on the device name 22 * struct ifreq ifr; 23 * struct nip_ifreq ifrn; 24 * ioctl(fd, SIOGIFINDEX, &ifr); 25 * ifr.ifr_ifindex; ===> ifindex 26 */ 27int nip_add_addr(int ifindex, const unsigned char *addr, unsigned char addr_len) 28{ 29 int fd, ret; 30 struct nip_ifreq ifrn; 31 32 fd = socket(AF_NINET, SOCK_DGRAM, 0); 33 if (fd < 0) 34 return -1; 35 36 memset(&ifrn, 0, sizeof(ifrn)); 37 ifrn.ifrn_addr.bitlen = addr_len * BITS_PER_BYTE; // Byte length is converted to bit length 38 memcpy(ifrn.ifrn_addr.NIP_ADDR_FIELD8, addr, addr_len); 39 ifrn.ifrn_ifindex = ifindex; 40 41 ret = ioctl(fd, SIOCSIFADDR, &ifrn); 42 if (ret < 0 && errno != EEXIST) { // ignore File Exists error 43 printf("cfg newip addr fail, ifindex=%d, ret=%d\n", ifindex, ret); 44 close(fd); 45 return -1; 46 } 47 48 close(fd); 49 return 0; 50} 51 52/* Before executing the use case, run ifconfig XXX up. 53 * XXX indicates the NIC name, for example, eth0 and wlan0 54 */ 55int main(int argc, char **argv) 56{ 57 int ifindex = 0; 58 int ret; 59 unsigned char client_addr[INDEX_1] = {0x50}; // 1-byte address of the client: 0x50 60 unsigned char server_addr[INDEX_2] = {0xDE, 0x00}; // 2-byte address of the server: 0xDE00 61 unsigned char *addr; 62 unsigned char addr_len; 63 64 if (argc == DEMO_INPUT_1) { 65 if (!strcmp(*(argv + 1), "server")) { 66 printf("server cfg addr=0x%02x%02x\n", 67 server_addr[INDEX_0], server_addr[INDEX_1]); 68 addr = server_addr; 69 addr_len = sizeof(server_addr); 70 } else if (!strcmp(*(argv + 1), "client")) { 71 printf("client cfg addr=0x%02x\n", client_addr[INDEX_0]); 72 addr = client_addr; 73 addr_len = sizeof(client_addr); 74 } else { 75 printf("invalid addr cfg input\n"); 76 return -1; 77 } 78 } else { 79 printf("unsupport addr cfg input\n"); 80 return -1; 81 } 82 83 ret = nip_get_ifindex(NIC_NAME, &ifindex); 84 if (ret != 0) 85 return -1; 86 87 ret = nip_add_addr(ifindex, addr, addr_len); 88 if (ret != 0) 89 return -1; 90 91 printf("%s %s(ifindex=%d) cfg addr success\n", *argv, NIC_NAME, ifindex); 92 return 0; 93} 94 95