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 */
nip_add_addr(int ifindex,const unsigned char * addr,unsigned char addr_len)27 int 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 */
main(int argc,char ** argv)55 int 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