1aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#ifndef __UTILS_H__
2aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#define __UTILS_H__ 1
3aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
4aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <asm/types.h>
5aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <resolv.h>
656b9406191a15a51320e039df1004967898f304djamal#include <stdlib.h>
7aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
8aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "libnetlink.h"
9aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "ll_map.h"
10aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "rtm_map.h"
11aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
12aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerextern int preferred_family;
13aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerextern int show_stats;
14aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerextern int show_details;
15aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerextern int show_raw;
16aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerextern int resolve_hosts;
17aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerextern int oneline;
1890f93024a0818dc691138d8401721e797004b042shemmingerextern int timestamp;
19aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerextern char * _SL_;
2064c7956061500611061910067d76512afcd2ddb4Ben Greearextern int max_flush_loops;
21aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
22aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#ifndef IPPROTO_ESP
23aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#define IPPROTO_ESP	50
24aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#endif
25aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#ifndef IPPROTO_AH
26aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#define IPPROTO_AH	51
27aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#endif
28c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger#ifndef IPPROTO_COMP
29c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger#define IPPROTO_COMP	108
30c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger#endif
31bd641cd661527469a9d15c0fa09f19d017c2299forg[shemminger]!nakam#ifndef IPSEC_PROTO_ANY
32bd641cd661527469a9d15c0fa09f19d017c2299forg[shemminger]!nakam#define IPSEC_PROTO_ANY	255
33bd641cd661527469a9d15c0fa09f19d017c2299forg[shemminger]!nakam#endif
34aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
35aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#define SPRINT_BSIZE 64
36aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#define SPRINT_BUF(x)	char x[SPRINT_BSIZE]
37aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
38aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerextern void incomplete_command(void) __attribute__((noreturn));
39aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
40aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#define NEXT_ARG() do { argv++; if (--argc <= 0) incomplete_command(); } while(0)
41c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger#define NEXT_ARG_OK() (argc - 1 > 0)
42c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemminger#define PREV_ARG() do { argv--; argc++; } while(0)
43aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
44aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingertypedef struct
45aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
46aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	__u8 family;
47aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	__u8 bytelen;
48aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	__s16 bitlen;
49f082b64fb40b467bc1f9e5d245114aae4e256d5cnet[shemminger]!shemminger	__u32 flags;
507f71c0cae2db61890474e04ba3a26e40219e5561Olivier Fourdan	__u32 data[8];
51aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} inet_prefix;
52aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
53f082b64fb40b467bc1f9e5d245114aae4e256d5cnet[shemminger]!shemminger#define PREFIXLEN_SPECIFIED 1
54f082b64fb40b467bc1f9e5d245114aae4e256d5cnet[shemminger]!shemminger
55aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#define DN_MAXADDL 20
56aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#ifndef AF_DECnet
57aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#define AF_DECnet 12
58aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#endif
59aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
60ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemmingerstruct dn_naddr
61aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
62aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        unsigned short          a_len;
63aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger        unsigned char a_addr[DN_MAXADDL];
64aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger};
65aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
66aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#define IPX_NODE_LEN 6
67aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
68aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstruct ipx_addr {
69aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	u_int32_t ipx_net;
70aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	u_int8_t  ipx_node[IPX_NODE_LEN];
71aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger};
72aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
73c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemmingerextern __u32 get_addr32(const char *name);
7404457b3dcb374ab7cd292ca84e8e73659601ffa1osdl.org!shemmingerextern int get_addr_1(inet_prefix *dst, const char *arg, int family);
75fb9b1d0f6a9f355bceae435ea43f1c8f3635b2dfosdl.net!shemmingerextern int get_prefix_1(inet_prefix *dst, char *arg, int family);
76c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemmingerextern int get_addr(inet_prefix *dst, const char *arg, int family);
77fb9b1d0f6a9f355bceae435ea43f1c8f3635b2dfosdl.net!shemmingerextern int get_prefix(inet_prefix *dst, char *arg, int family);
786b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemmingerextern int mask2bits(__u32 netmask);
79aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
8004457b3dcb374ab7cd292ca84e8e73659601ffa1osdl.org!shemmingerextern int get_integer(int *val, const char *arg, int base);
8104457b3dcb374ab7cd292ca84e8e73659601ffa1osdl.org!shemmingerextern int get_unsigned(unsigned *val, const char *arg, int base);
8281d03dc356df24d55443535eace247b93ff47b4eGerrit Renkerextern int get_time_rtt(unsigned *val, const char *arg, int *raw);
83aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#define get_byte get_u8
84aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#define get_ushort get_u16
85aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#define get_short get_s16
86c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemmingerextern int get_u64(__u64 *val, const char *arg, int base);
8704457b3dcb374ab7cd292ca84e8e73659601ffa1osdl.org!shemmingerextern int get_u32(__u32 *val, const char *arg, int base);
8830d10db5667d3ca86917ca86c1a65cfcc45965f9Hagen Paul Pfeiferextern int get_s32(__s32 *val, const char *arg, int base);
8904457b3dcb374ab7cd292ca84e8e73659601ffa1osdl.org!shemmingerextern int get_u16(__u16 *val, const char *arg, int base);
9004457b3dcb374ab7cd292ca84e8e73659601ffa1osdl.org!shemmingerextern int get_s16(__s16 *val, const char *arg, int base);
9104457b3dcb374ab7cd292ca84e8e73659601ffa1osdl.org!shemmingerextern int get_u8(__u8 *val, const char *arg, int base);
9204457b3dcb374ab7cd292ca84e8e73659601ffa1osdl.org!shemmingerextern int get_s8(__s8 *val, const char *arg, int base);
93aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
94f332d169246447bd5e258ac03d5ee840a70adb1eshemmingerextern char* hexstring_n2a(const __u8 *str, int len, char *buf, int blen);
95f332d169246447bd5e258ac03d5ee840a70adb1eshemmingerextern __u8* hexstring_a2n(const char *str, __u8 *buf, int blen);
96aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
97ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemmingerextern const char *format_host(int af, int len, const void *addr,
9804457b3dcb374ab7cd292ca84e8e73659601ffa1osdl.org!shemminger			       char *buf, int buflen);
99ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemmingerextern const char *rt_addr_n2a(int af, int len, const void *addr,
10004457b3dcb374ab7cd292ca84e8e73659601ffa1osdl.org!shemminger			       char *buf, int buflen);
101aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
102c7699875bee00fbcd057fc62c30d6560b044e007net[shemminger]!shemmingervoid missarg(const char *) __attribute__((noreturn));
10304457b3dcb374ab7cd292ca84e8e73659601ffa1osdl.org!shemmingervoid invarg(const char *, const char *) __attribute__((noreturn));
10404457b3dcb374ab7cd292ca84e8e73659601ffa1osdl.org!shemmingervoid duparg(const char *, const char *) __attribute__((noreturn));
10504457b3dcb374ab7cd292ca84e8e73659601ffa1osdl.org!shemmingervoid duparg2(const char *, const char *) __attribute__((noreturn));
10604457b3dcb374ab7cd292ca84e8e73659601ffa1osdl.org!shemmingerint matches(const char *arg, const char *pattern);
10704457b3dcb374ab7cd292ca84e8e73659601ffa1osdl.org!shemmingerextern int inet_addr_match(const inet_prefix *a, const inet_prefix *b, int bits);
108aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
109aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerconst char *dnet_ntop(int af, const void *addr, char *str, size_t len);
110aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint dnet_pton(int af, const char *src, void *addr);
111aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
112aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerconst char *ipx_ntop(int af, const void *addr, char *str, size_t len);
113aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint ipx_pton(int af, const char *src, void *addr);
114aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
115aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerextern int __iproute2_hz_internal;
116aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerextern int __get_hz(void);
117aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
118aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic __inline__ int get_hz(void)
119aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
120aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (__iproute2_hz_internal == 0)
121aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		__iproute2_hz_internal = __get_hz();
122aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	return __iproute2_hz_internal;
123aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
124aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
1255e8bc6316b1a6c56598cdb29a737d1d670d74e69net[shemminger]!shemmingerextern int __iproute2_user_hz_internal;
1265e8bc6316b1a6c56598cdb29a737d1d670d74e69net[shemminger]!shemmingerextern int __get_user_hz(void);
1275e8bc6316b1a6c56598cdb29a737d1d670d74e69net[shemminger]!shemminger
1285e8bc6316b1a6c56598cdb29a737d1d670d74e69net[shemminger]!shemmingerstatic __inline__ int get_user_hz(void)
1295e8bc6316b1a6c56598cdb29a737d1d670d74e69net[shemminger]!shemminger{
1305e8bc6316b1a6c56598cdb29a737d1d670d74e69net[shemminger]!shemminger	if (__iproute2_user_hz_internal == 0)
1315e8bc6316b1a6c56598cdb29a737d1d670d74e69net[shemminger]!shemminger		__iproute2_user_hz_internal = __get_user_hz();
1325e8bc6316b1a6c56598cdb29a737d1d670d74e69net[shemminger]!shemminger	return __iproute2_user_hz_internal;
1335e8bc6316b1a6c56598cdb29a737d1d670d74e69net[shemminger]!shemminger}
1345e8bc6316b1a6c56598cdb29a737d1d670d74e69net[shemminger]!shemminger
1358cd09e61e349e94c9569d3bc33d5785d1f81961cjamalstatic inline __u32 nl_mgrp(__u32 group)
1368cd09e61e349e94c9569d3bc33d5785d1f81961cjamal{
13756b9406191a15a51320e039df1004967898f304djamal	if (group > 31 ) {
13856b9406191a15a51320e039df1004967898f304djamal		fprintf(stderr, "Use setsockopt for this group %d\n", group);
13956b9406191a15a51320e039df1004967898f304djamal		exit(-1);
14056b9406191a15a51320e039df1004967898f304djamal	}
14156b9406191a15a51320e039df1004967898f304djamal	return group ? (1 << (group - 1)) : 0;
1428cd09e61e349e94c9569d3bc33d5785d1f81961cjamal}
1438cd09e61e349e94c9569d3bc33d5785d1f81961cjamal
1448cd09e61e349e94c9569d3bc33d5785d1f81961cjamal
14590f93024a0818dc691138d8401721e797004b042shemmingerint print_timestamp(FILE *fp);
14690f93024a0818dc691138d8401721e797004b042shemminger
14702d2ae55c68d2319260163b76c550f45e1077a63shemminger#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
14802d2ae55c68d2319260163b76c550f45e1077a63shemminger
149351efcde4e62967362a10b29f3b701cfecd7cdfcshemmingerextern int cmdlineno;
150d21e88354b2a42b026384730a767f2108bcf8efeAndreas Henrikssonextern ssize_t getcmdline(char **line, size_t *len, FILE *in);
151351efcde4e62967362a10b29f3b701cfecd7cdfcshemmingerextern int makeargs(char *line, char *argv[], int maxargs);
152351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger
153909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanovstruct iplink_req;
154909dfe2c7ebcfe853b2fe4f995be1c4681d5a2a5Pavel Emelyanovint iplink_parse(int argc, char **argv, struct iplink_req *req,
155db02608b6f408998ea8c823fb791cead3e574f50Vlad Dogaru		char **name, char **type, char **link, char **dev,
156db02608b6f408998ea8c823fb791cead3e574f50Vlad Dogaru		int *group);
157aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#endif /* __UTILS_H__ */
158