blob: b78817f48cc60f5fbcdceb3067035737c83bb836 [file] [log] [blame]
osdl.org!shemmingeraba5acd2004-04-15 20:56:59 +00001#ifndef __UTILS_H__
2#define __UTILS_H__ 1
3
Strake5bd9dd42012-12-23 08:46:04 -05004#include <sys/types.h>
osdl.org!shemmingeraba5acd2004-04-15 20:56:59 +00005#include <asm/types.h>
6#include <resolv.h>
jamal56b94062007-02-25 12:02:23 -05007#include <stdlib.h>
Vadim Kochane998e112015-01-18 16:10:17 +02008#include <stdbool.h>
osdl.org!shemmingeraba5acd2004-04-15 20:56:59 +00009
10#include "libnetlink.h"
11#include "ll_map.h"
12#include "rtm_map.h"
13
14extern int preferred_family;
Christian Hesseb68d9832014-10-31 22:33:13 +010015extern int human_readable;
Stephen Hemminger1e264ab2014-11-02 12:49:19 -080016extern int use_iec;
osdl.org!shemmingeraba5acd2004-04-15 20:56:59 +000017extern int show_stats;
18extern int show_details;
19extern int show_raw;
20extern int resolve_hosts;
21extern int oneline;
shemminger90f93022005-06-07 21:55:55 +000022extern int timestamp;
Vadim Kochan79aa79d2014-12-23 00:13:58 +020023extern int timestamp_short;
Stephen Hemmingerec7aff52015-07-26 21:46:44 -070024extern const char * _SL_;
Ben Greear64c79562010-12-01 11:13:51 -080025extern int max_flush_loops;
Stephen Hemmingera3aa47a2013-07-16 10:04:05 -070026extern int batch_mode;
Vadim Kochanb13ba032015-01-18 16:10:18 +020027extern bool do_all;
osdl.org!shemmingeraba5acd2004-04-15 20:56:59 +000028
29#ifndef IPPROTO_ESP
30#define IPPROTO_ESP 50
31#endif
32#ifndef IPPROTO_AH
33#define IPPROTO_AH 51
34#endif
net[shemminger]!shemmingerc7699872004-07-07 17:05:56 +000035#ifndef IPPROTO_COMP
36#define IPPROTO_COMP 108
37#endif
org[shemminger]!nakambd641cd2004-09-28 18:38:35 +000038#ifndef IPSEC_PROTO_ANY
39#define IPSEC_PROTO_ANY 255
40#endif
osdl.org!shemmingeraba5acd2004-04-15 20:56:59 +000041
42#define SPRINT_BSIZE 64
43#define SPRINT_BUF(x) char x[SPRINT_BSIZE]
44
45extern void incomplete_command(void) __attribute__((noreturn));
46
47#define NEXT_ARG() do { argv++; if (--argc <= 0) incomplete_command(); } while(0)
net[shemminger]!shemmingerc7699872004-07-07 17:05:56 +000048#define NEXT_ARG_OK() (argc - 1 > 0)
49#define PREV_ARG() do { argv--; argc++; } while(0)
osdl.org!shemmingeraba5acd2004-04-15 20:56:59 +000050
51typedef struct
52{
Eric W. Biederman93ae2832015-03-15 14:52:06 -050053 __u16 flags;
54 __u16 bytelen;
osdl.org!shemmingeraba5acd2004-04-15 20:56:59 +000055 __s16 bitlen;
Eric W. Biederman93ae2832015-03-15 14:52:06 -050056 /* These next two fields match rtvia */
57 __u16 family;
Olivier Fourdan7f71c0c2008-11-25 12:36:22 +000058 __u32 data[8];
osdl.org!shemmingeraba5acd2004-04-15 20:56:59 +000059} inet_prefix;
60
net[shemminger]!shemmingerf082b642005-03-30 18:16:10 +000061#define PREFIXLEN_SPECIFIED 1
62
osdl.org!shemmingeraba5acd2004-04-15 20:56:59 +000063#define DN_MAXADDL 20
64#ifndef AF_DECnet
65#define AF_DECnet 12
66#endif
67
Stephen Hemmingerae665a52006-12-05 10:10:22 -080068struct dn_naddr
osdl.org!shemmingeraba5acd2004-04-15 20:56:59 +000069{
70 unsigned short a_len;
71 unsigned char a_addr[DN_MAXADDL];
72};
73
74#define IPX_NODE_LEN 6
75
76struct ipx_addr {
77 u_int32_t ipx_net;
78 u_int8_t ipx_node[IPX_NODE_LEN];
79};
80
Eric W. Biedermandacc5d42015-03-15 14:53:45 -050081#ifndef AF_MPLS
82# define AF_MPLS 28
83#endif
84
85/* Maximum number of labels the mpls helpers support */
86#define MPLS_MAX_LABELS 8
87
net[shemminger]!shemmingerc7699872004-07-07 17:05:56 +000088extern __u32 get_addr32(const char *name);
osdl.org!shemminger04457b32004-06-02 20:22:08 +000089extern int get_addr_1(inet_prefix *dst, const char *arg, int family);
osdl.net!shemmingerfb9b1d02005-02-07 18:15:04 +000090extern int get_prefix_1(inet_prefix *dst, char *arg, int family);
net[shemminger]!shemmingerc7699872004-07-07 17:05:56 +000091extern int get_addr(inet_prefix *dst, const char *arg, int family);
osdl.net!shemmingerfb9b1d02005-02-07 18:15:04 +000092extern int get_prefix(inet_prefix *dst, char *arg, int family);
Stephen Hemminger6b1ac652007-12-31 10:29:52 -080093extern int mask2bits(__u32 netmask);
osdl.org!shemmingeraba5acd2004-04-15 20:56:59 +000094
osdl.org!shemminger04457b32004-06-02 20:22:08 +000095extern int get_integer(int *val, const char *arg, int base);
96extern int get_unsigned(unsigned *val, const char *arg, int base);
Gerrit Renker81d03dc2011-02-25 12:54:37 -080097extern int get_time_rtt(unsigned *val, const char *arg, int *raw);
osdl.org!shemmingeraba5acd2004-04-15 20:56:59 +000098#define get_byte get_u8
99#define get_ushort get_u16
100#define get_short get_s16
net[shemminger]!shemmingerc7699872004-07-07 17:05:56 +0000101extern int get_u64(__u64 *val, const char *arg, int base);
osdl.org!shemminger04457b32004-06-02 20:22:08 +0000102extern int get_u32(__u32 *val, const char *arg, int base);
Hagen Paul Pfeifer30d10db2011-12-20 11:28:46 +0000103extern int get_s32(__s32 *val, const char *arg, int base);
osdl.org!shemminger04457b32004-06-02 20:22:08 +0000104extern int get_u16(__u16 *val, const char *arg, int base);
105extern int get_s16(__s16 *val, const char *arg, int base);
106extern int get_u8(__u8 *val, const char *arg, int base);
107extern int get_s8(__s8 *val, const char *arg, int base);
osdl.org!shemmingeraba5acd2004-04-15 20:56:59 +0000108
shemmingerf332d162005-07-05 22:37:15 +0000109extern char* hexstring_n2a(const __u8 *str, int len, char *buf, int blen);
110extern __u8* hexstring_a2n(const char *str, __u8 *buf, int blen);
osdl.org!shemmingeraba5acd2004-04-15 20:56:59 +0000111
Vadim Kochanf3a2ddc2015-02-28 02:50:24 +0200112extern int af_bit_len(int af);
113extern int af_byte_len(int af);
114
Stephen Hemmingerae665a52006-12-05 10:10:22 -0800115extern const char *format_host(int af, int len, const void *addr,
osdl.org!shemminger04457b32004-06-02 20:22:08 +0000116 char *buf, int buflen);
Eric W. Biederman26dcdf32015-03-15 14:48:32 -0500117extern const char *rt_addr_n2a(int af, int len, const void *addr,
osdl.org!shemminger04457b32004-06-02 20:22:08 +0000118 char *buf, int buflen);
osdl.org!shemmingeraba5acd2004-04-15 20:56:59 +0000119
Eric W. Biederman45c90d12015-03-15 14:50:03 -0500120extern int read_family(const char *name);
121extern const char *family_name(int family);
122
net[shemminger]!shemmingerc7699872004-07-07 17:05:56 +0000123void missarg(const char *) __attribute__((noreturn));
osdl.org!shemminger04457b32004-06-02 20:22:08 +0000124void invarg(const char *, const char *) __attribute__((noreturn));
125void duparg(const char *, const char *) __attribute__((noreturn));
126void duparg2(const char *, const char *) __attribute__((noreturn));
127int matches(const char *arg, const char *pattern);
128extern int inet_addr_match(const inet_prefix *a, const inet_prefix *b, int bits);
osdl.org!shemmingeraba5acd2004-04-15 20:56:59 +0000129
130const char *dnet_ntop(int af, const void *addr, char *str, size_t len);
131int dnet_pton(int af, const char *src, void *addr);
132
133const char *ipx_ntop(int af, const void *addr, char *str, size_t len);
134int ipx_pton(int af, const char *src, void *addr);
135
Eric W. Biedermandacc5d42015-03-15 14:53:45 -0500136const char *mpls_ntop(int af, const void *addr, char *str, size_t len);
137int mpls_pton(int af, const char *src, void *addr);
138
osdl.org!shemmingeraba5acd2004-04-15 20:56:59 +0000139extern int __iproute2_hz_internal;
140extern int __get_hz(void);
141
142static __inline__ int get_hz(void)
143{
144 if (__iproute2_hz_internal == 0)
145 __iproute2_hz_internal = __get_hz();
146 return __iproute2_hz_internal;
147}
148
net[shemminger]!shemminger5e8bc632005-03-14 18:44:54 +0000149extern int __iproute2_user_hz_internal;
150extern int __get_user_hz(void);
151
152static __inline__ int get_user_hz(void)
153{
154 if (__iproute2_user_hz_internal == 0)
155 __iproute2_user_hz_internal = __get_user_hz();
156 return __iproute2_user_hz_internal;
157}
158
jamal8cd09e62006-12-07 20:47:03 -0500159static inline __u32 nl_mgrp(__u32 group)
160{
jamal56b94062007-02-25 12:02:23 -0500161 if (group > 31 ) {
162 fprintf(stderr, "Use setsockopt for this group %d\n", group);
163 exit(-1);
164 }
165 return group ? (1 << (group - 1)) : 0;
jamal8cd09e62006-12-07 20:47:03 -0500166}
167
168
shemminger90f93022005-06-07 21:55:55 +0000169int print_timestamp(FILE *fp);
Vadim Kochanddb11292015-01-13 20:14:24 +0200170void print_nlmsg_timestamp(FILE *fp, const struct nlmsghdr *n);
shemminger90f93022005-06-07 21:55:55 +0000171
shemminger02d2ae52005-06-23 17:31:27 +0000172#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
173
Daniel Borkmann6256f8c2015-04-01 17:57:44 +0200174#define BUILD_BUG_ON(cond) ((void)sizeof(char[1 - 2 * !!(cond)]))
175
176#ifndef offsetof
177# define offsetof(type, member) ((size_t) &((type *)0)->member)
178#endif
179
180#ifndef min
181# define min(x, y) ({ \
182 typeof(x) _min1 = (x); \
183 typeof(y) _min2 = (y); \
184 (void) (&_min1 == &_min2); \
185 _min1 < _min2 ? _min1 : _min2; })
186#endif
187
Daniel Borkmann11c39b52015-03-16 19:37:41 +0100188#ifndef __check_format_string
189# define __check_format_string(pos_str, pos_args) \
190 __attribute__ ((format (printf, (pos_str), (pos_args))))
191#endif
192
shemminger351efcd2005-09-01 19:21:50 +0000193extern int cmdlineno;
Andreas Henrikssond21e8832007-10-12 10:56:42 +0200194extern ssize_t getcmdline(char **line, size_t *len, FILE *in);
shemminger351efcd2005-09-01 19:21:50 +0000195extern int makeargs(char *line, char *argv[], int maxargs);
WANG Congaa574cd2013-10-16 22:03:48 -0700196extern int inet_get_addr(const char *src, __u32 *dst, struct in6_addr *dst6);
shemminger351efcd2005-09-01 19:21:50 +0000197
Pavel Emelyanov909dfe22007-07-19 13:32:31 +0400198struct iplink_req;
199int iplink_parse(int argc, char **argv, struct iplink_req *req,
Vlad Dogarudb026082011-02-02 20:23:41 +0200200 char **name, char **type, char **link, char **dev,
Pavel Emelyanov5e25cf72013-12-26 23:15:20 +0400201 int *group, int *index);
Vadim Kochanddb11292015-01-13 20:14:24 +0200202
Vadim Kochane998e112015-01-18 16:10:17 +0200203extern int do_each_netns(int (*func)(char *nsname, void *arg), void *arg,
204 bool show_label);
205
Vadim Kochanb217df12015-02-13 22:14:03 +0200206char *int_to_str(int val, char *buf);
207
osdl.org!shemmingeraba5acd2004-04-15 20:56:59 +0000208#endif /* __UTILS_H__ */