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