1dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#ifndef __UTILS_H__
2dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#define __UTILS_H__ 1
3dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
4dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <asm/types.h>
5dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <resolv.h>
6dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <stdlib.h>
7dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
8dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include "libnetlink.h"
9dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include "ll_map.h"
10dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include "rtm_map.h"
11dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
12dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatextern int preferred_family;
13dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatextern int show_stats;
14dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatextern int show_details;
15dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatextern int show_raw;
16dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatextern int resolve_hosts;
17dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatextern int oneline;
18dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatextern int timestamp;
19dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatextern char * _SL_;
20dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
21dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#ifndef IPPROTO_ESP
22dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#define IPPROTO_ESP	50
23dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#endif
24dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#ifndef IPPROTO_AH
25dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#define IPPROTO_AH	51
26dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#endif
27dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#ifndef IPPROTO_COMP
28dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#define IPPROTO_COMP	108
29dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#endif
30dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#ifndef IPSEC_PROTO_ANY
31dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#define IPSEC_PROTO_ANY	255
32dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#endif
33dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
34dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#define SPRINT_BSIZE 64
35dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#define SPRINT_BUF(x)	char x[SPRINT_BSIZE]
36dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
37dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatextern void incomplete_command(void) __attribute__((noreturn));
38dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
39dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#define NEXT_ARG() do { argv++; if (--argc <= 0) incomplete_command(); } while(0)
40dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#define NEXT_ARG_OK() (argc - 1 > 0)
41dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#define PREV_ARG() do { argv--; argc++; } while(0)
42dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
43dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehattypedef struct
44dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{
45dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	__u8 family;
46dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	__u8 bytelen;
47dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	__s16 bitlen;
48dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	__u32 flags;
49dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	__u32 data[8];
50dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat} inet_prefix;
51dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
52dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#define PREFIXLEN_SPECIFIED 1
53dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
54dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#define DN_MAXADDL 20
55dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#ifndef AF_DECnet
56dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#define AF_DECnet 12
57dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#endif
58dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
59dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstruct dn_naddr
60dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{
61dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat        unsigned short          a_len;
62dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat        unsigned char a_addr[DN_MAXADDL];
63dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat};
64dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
65dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#define IPX_NODE_LEN 6
66dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
67dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstruct ipx_addr {
68dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	u_int32_t ipx_net;
69dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	u_int8_t  ipx_node[IPX_NODE_LEN];
70dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat};
71dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
72dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatextern __u32 get_addr32(const char *name);
73dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatextern int get_addr_1(inet_prefix *dst, const char *arg, int family);
74dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatextern int get_prefix_1(inet_prefix *dst, char *arg, int family);
75dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatextern int get_addr(inet_prefix *dst, const char *arg, int family);
76dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatextern int get_prefix(inet_prefix *dst, char *arg, int family);
77dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatextern int mask2bits(__u32 netmask);
78dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
79dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatextern int get_integer(int *val, const char *arg, int base);
80dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatextern int get_unsigned(unsigned *val, const char *arg, int base);
81dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatextern int get_jiffies(unsigned *val, const char *arg, int base, int *raw);
82dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#define get_byte get_u8
83dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#define get_ushort get_u16
84dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#define get_short get_s16
85dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatextern int get_u64(__u64 *val, const char *arg, int base);
86dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatextern int get_u32(__u32 *val, const char *arg, int base);
87dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatextern int get_u16(__u16 *val, const char *arg, int base);
88dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatextern int get_s16(__s16 *val, const char *arg, int base);
89dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatextern int get_u8(__u8 *val, const char *arg, int base);
90dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatextern int get_s8(__s8 *val, const char *arg, int base);
91dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
92dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatextern char* hexstring_n2a(const __u8 *str, int len, char *buf, int blen);
93dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatextern __u8* hexstring_a2n(const char *str, __u8 *buf, int blen);
94dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
95dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatextern const char *format_host(int af, int len, const void *addr,
96dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat			       char *buf, int buflen);
97dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatextern const char *rt_addr_n2a(int af, int len, const void *addr,
98dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat			       char *buf, int buflen);
99dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
100dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatvoid missarg(const char *) __attribute__((noreturn));
101dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatvoid invarg(const char *, const char *) __attribute__((noreturn));
102dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatvoid duparg(const char *, const char *) __attribute__((noreturn));
103dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatvoid duparg2(const char *, const char *) __attribute__((noreturn));
104dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatint matches(const char *arg, const char *pattern);
105dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatextern int inet_addr_match(const inet_prefix *a, const inet_prefix *b, int bits);
106dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
107dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatconst char *dnet_ntop(int af, const void *addr, char *str, size_t len);
108dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatint dnet_pton(int af, const char *src, void *addr);
109dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
110dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatconst char *ipx_ntop(int af, const void *addr, char *str, size_t len);
111dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatint ipx_pton(int af, const char *src, void *addr);
112dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
113dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatextern int __iproute2_hz_internal;
114dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatextern int __get_hz(void);
115dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
116dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstatic __inline__ int get_hz(void)
117dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{
118dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	if (__iproute2_hz_internal == 0)
119dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		__iproute2_hz_internal = __get_hz();
120dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	return __iproute2_hz_internal;
121dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat}
122dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
123dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatextern int __iproute2_user_hz_internal;
124dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatextern int __get_user_hz(void);
125dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
126dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstatic __inline__ int get_user_hz(void)
127dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{
128dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	if (__iproute2_user_hz_internal == 0)
129dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		__iproute2_user_hz_internal = __get_user_hz();
130dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	return __iproute2_user_hz_internal;
131dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat}
132dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
133dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstatic inline __u32 nl_mgrp(__u32 group)
134dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{
135dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	if (group > 31 ) {
136dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		fprintf(stderr, "Use setsockopt for this group %d\n", group);
137dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		exit(-1);
138dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	}
139dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	return group ? (1 << (group - 1)) : 0;
140dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat}
141dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
142dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
143dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatint print_timestamp(FILE *fp);
144dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
145dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
146dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
147dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatextern int cmdlineno;
148dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatextern ssize_t getcmdline(char **line, size_t *len, FILE *in);
149dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatextern int makeargs(char *line, char *argv[], int maxargs);
150dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
151dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstruct iplink_req;
152dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatint iplink_parse(int argc, char **argv, struct iplink_req *req,
153dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		char **name, char **type, char **link, char **dev);
154dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#endif /* __UTILS_H__ */
155