• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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