1aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger/* 2aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger * q_u32.c U32 filter. 3aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger * 4aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger * This program is free software; you can u32istribute it and/or 5aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger * modify it under the terms of the GNU General Public License 6aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger * as published by the Free Software Foundation; either version 7aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger * 2 of the License, or (at your option) any later version. 8aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger * 9aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru> 106f0ba88be018dee5feb08e7b125b10b633bb000cnet[shemminger]!shemminger * Match mark added by Catalin(ux aka Dino) BOIE <catab at umbrella.ro> [5 nov 2004] 11aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger * 12aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger */ 13aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 14aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <stdio.h> 15aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <stdlib.h> 16aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <unistd.h> 17aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <syslog.h> 18aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <fcntl.h> 19aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <sys/socket.h> 20aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <netinet/in.h> 21aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <arpa/inet.h> 22aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <string.h> 232373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger#include <linux/if.h> 241750abe2ba8b695aa39a67cff8ac44b2fb6a2a3djamal#include <linux/if_ether.h> 25aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 26aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "utils.h" 27aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "tc_util.h" 28aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 2944dcfe820185590f04c9f5f18579d08532fc1a4bStephen Hemmingerextern int show_pretty; 3044dcfe820185590f04c9f5f18579d08532fc1a4bStephen Hemminger 31aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic void explain(void) 32aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 33e62077d0b663fdbb8a34bedbe396c976e1db1177Stephen Hemminger fprintf(stderr, "Usage: ... u32 [ match SELECTOR ... ] [ link HTID ]" 34e62077d0b663fdbb8a34bedbe396c976e1db1177Stephen Hemminger " [ classid CLASSID ]\n"); 35e62077d0b663fdbb8a34bedbe396c976e1db1177Stephen Hemminger fprintf(stderr, " [ police POLICE_SPEC ]" 36e62077d0b663fdbb8a34bedbe396c976e1db1177Stephen Hemminger " [ offset OFFSET_SPEC ]\n"); 37aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, " [ ht HTID ] [ hashkey HASHKEY_SPEC ]\n"); 38aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, " [ sample SAMPLE ]\n"); 39aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "or u32 divisor DIVISOR\n"); 40aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "\n"); 41aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "Where: SELECTOR := SAMPLE SAMPLE ...\n"); 42e62077d0b663fdbb8a34bedbe396c976e1db1177Stephen Hemminger fprintf(stderr, " SAMPLE := { ip | ip6 | udp | tcp | icmp |" 43e62077d0b663fdbb8a34bedbe396c976e1db1177Stephen Hemminger " u{32|16|8} | mark } SAMPLE_ARGS [divisor DIVISOR]\n"); 44aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, " FILTERID := X:Y:Z\n"); 45e9acc2420c561a6f875d188de1028facbd09c5a8PJ Waskiewicz fprintf(stderr, "\nNOTE: CLASSID is parsed at hexadecimal input.\n"); 46aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 47aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 489fce67dd467e9148f440b701105e1e75f3ae4153Stephen Hemmingerint get_u32_handle(__u32 *handle, const char *str) 49aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 50aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger __u32 htid=0, hash=0, nodeid=0; 51aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char *tmp = strchr(str, ':'); 52aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 53aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (tmp == NULL) { 54aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (memcmp("0x", str, 2) == 0) 55aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return get_u32(handle, str, 16); 56aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 57aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 58aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger htid = strtoul(str, &tmp, 16); 59aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (tmp == str && *str != ':' && *str != 0) 60aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 61aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (htid>=0x1000) 62aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 63aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (*tmp) { 64aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger str = tmp+1; 65aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger hash = strtoul(str, &tmp, 16); 66aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (tmp == str && *str != ':' && *str != 0) 67aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 68aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (hash>=0x100) 69aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 70aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (*tmp) { 71aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger str = tmp+1; 72aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger nodeid = strtoul(str, &tmp, 16); 73aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (tmp == str && *str != 0) 74aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 75aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (nodeid>=0x1000) 76aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 77aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 78aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 79aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *handle = (htid<<20)|(hash<<12)|nodeid; 80aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 81aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 82aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 83aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerchar * sprint_u32_handle(__u32 handle, char *buf) 84aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 85aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int bsize = SPRINT_BSIZE-1; 86aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger __u32 htid = TC_U32_HTID(handle); 87aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger __u32 hash = TC_U32_HASH(handle); 88aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger __u32 nodeid = TC_U32_NODE(handle); 89aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char *b = buf; 90aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 91aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (handle == 0) { 92aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger snprintf(b, bsize, "none"); 93aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return b; 94aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 95aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (htid) { 96aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int l = snprintf(b, bsize, "%x:", htid>>20); 97aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger bsize -= l; 98aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger b += l; 99aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 100aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (nodeid|hash) { 101aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (hash) { 102aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int l = snprintf(b, bsize, "%x", hash); 103aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger bsize -= l; 104aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger b += l; 105aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 106aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (nodeid) { 107aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int l = snprintf(b, bsize, ":%x", nodeid); 108aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger bsize -= l; 109aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger b += l; 110aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 111aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 112aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (show_raw) 113aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger snprintf(b, bsize, "[%08x] ", handle); 114aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return buf; 115aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 116aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 117e62077d0b663fdbb8a34bedbe396c976e1db1177Stephen Hemmingerstatic int pack_key(struct tc_u32_sel *sel, __u32 key, __u32 mask, 118e62077d0b663fdbb8a34bedbe396c976e1db1177Stephen Hemminger int off, int offmask) 119aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 120aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int i; 121aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int hwm = sel->nkeys; 122aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 123aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger key &= mask; 124aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 125aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger for (i=0; i<hwm; i++) { 126aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (sel->keys[i].off == off && sel->keys[i].offmask == offmask) { 127aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger __u32 intersect = mask&sel->keys[i].mask; 128aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 129aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if ((key^sel->keys[i].val) & intersect) 130aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 131aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger sel->keys[i].val |= key; 132aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger sel->keys[i].mask |= mask; 133aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 134aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 135aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 136aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 137aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (hwm >= 128) 138aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 139aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (off % 4) 140aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 141aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger sel->keys[hwm].val = key; 142aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger sel->keys[hwm].mask = mask; 143aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger sel->keys[hwm].off = off; 144aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger sel->keys[hwm].offmask = offmask; 145aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger sel->nkeys++; 146aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 147aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 148aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 149e62077d0b663fdbb8a34bedbe396c976e1db1177Stephen Hemmingerstatic int pack_key32(struct tc_u32_sel *sel, __u32 key, __u32 mask, 150e62077d0b663fdbb8a34bedbe396c976e1db1177Stephen Hemminger int off, int offmask) 151aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 152aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger key = htonl(key); 153aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger mask = htonl(mask); 154aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return pack_key(sel, key, mask, off, offmask); 155aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 156aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 157e62077d0b663fdbb8a34bedbe396c976e1db1177Stephen Hemmingerstatic int pack_key16(struct tc_u32_sel *sel, __u32 key, __u32 mask, 158e62077d0b663fdbb8a34bedbe396c976e1db1177Stephen Hemminger int off, int offmask) 159aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 160aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (key > 0xFFFF || mask > 0xFFFF) 161aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 162aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 163aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if ((off & 3) == 0) { 164aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger key <<= 16; 165aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger mask <<= 16; 166aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 167aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger off &= ~3; 168aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger key = htonl(key); 169aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger mask = htonl(mask); 170aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 171aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return pack_key(sel, key, mask, off, offmask); 172aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 173aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 174aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic int pack_key8(struct tc_u32_sel *sel, __u32 key, __u32 mask, int off, int offmask) 175aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 176aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (key > 0xFF || mask > 0xFF) 177aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 178aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 179aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if ((off & 3) == 0) { 180aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger key <<= 24; 181aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger mask <<= 24; 182aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if ((off & 3) == 1) { 183aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger key <<= 16; 184aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger mask <<= 16; 185aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if ((off & 3) == 2) { 186aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger key <<= 8; 187aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger mask <<= 8; 188aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 189aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger off &= ~3; 190aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger key = htonl(key); 191aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger mask = htonl(mask); 192aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 193aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return pack_key(sel, key, mask, off, offmask); 194aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 195aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 196aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 197aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint parse_at(int *argc_p, char ***argv_p, int *off, int *offmask) 198aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 199aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int argc = *argc_p; 200aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char **argv = *argv_p; 201aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char *p = *argv; 202aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 203aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (argc <= 0) 204aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 205aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 206aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (strlen(p) > strlen("nexthdr+") && 207aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger memcmp(p, "nexthdr+", strlen("nexthdr+")) == 0) { 208aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *offmask = -1; 209aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger p += strlen("nexthdr+"); 210aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (matches(*argv, "nexthdr+") == 0) { 211aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 212aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *offmask = -1; 213aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger p = *argv; 214aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 215aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 216aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (get_integer(off, p, 0)) 217aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 218aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger argc--; argv++; 219aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 220aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *argc_p = argc; 221aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *argv_p = argv; 222aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 223aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 224aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 225aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 226e62077d0b663fdbb8a34bedbe396c976e1db1177Stephen Hemmingerstatic int parse_u32(int *argc_p, char ***argv_p, struct tc_u32_sel *sel, 227e62077d0b663fdbb8a34bedbe396c976e1db1177Stephen Hemminger int off, int offmask) 228aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 229aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int res = -1; 230aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int argc = *argc_p; 231aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char **argv = *argv_p; 232aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger __u32 key; 233aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger __u32 mask; 234aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 235aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (argc < 2) 236aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 237aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 238aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (get_u32(&key, *argv, 0)) 239aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 240aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger argc--; argv++; 241aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 242aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (get_u32(&mask, *argv, 16)) 243aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 244aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger argc--; argv++; 245aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 246aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (argc > 0 && strcmp(argv[0], "at") == 0) { 247aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 248aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (parse_at(&argc, &argv, &off, &offmask)) 249aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 250aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 251aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 252aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger res = pack_key32(sel, key, mask, off, offmask); 253aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *argc_p = argc; 254aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *argv_p = argv; 255aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return res; 256aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 257aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 258e62077d0b663fdbb8a34bedbe396c976e1db1177Stephen Hemmingerstatic int parse_u16(int *argc_p, char ***argv_p, struct tc_u32_sel *sel, 259e62077d0b663fdbb8a34bedbe396c976e1db1177Stephen Hemminger int off, int offmask) 260aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 261aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int res = -1; 262aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int argc = *argc_p; 263aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char **argv = *argv_p; 264aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger __u32 key; 265aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger __u32 mask; 266aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 267aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (argc < 2) 268aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 269aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 270aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (get_u32(&key, *argv, 0)) 271aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 272aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger argc--; argv++; 273aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 274aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (get_u32(&mask, *argv, 16)) 275aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 276aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger argc--; argv++; 277aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 278aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (argc > 0 && strcmp(argv[0], "at") == 0) { 279aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 280aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (parse_at(&argc, &argv, &off, &offmask)) 281aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 282aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 283aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger res = pack_key16(sel, key, mask, off, offmask); 284aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *argc_p = argc; 285aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *argv_p = argv; 286aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return res; 287aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 288aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 289e62077d0b663fdbb8a34bedbe396c976e1db1177Stephen Hemmingerstatic int parse_u8(int *argc_p, char ***argv_p, struct tc_u32_sel *sel, 290e62077d0b663fdbb8a34bedbe396c976e1db1177Stephen Hemminger int off, int offmask) 291aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 292aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int res = -1; 293aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int argc = *argc_p; 294aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char **argv = *argv_p; 295aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger __u32 key; 296aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger __u32 mask; 297aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 298aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (argc < 2) 299aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 300aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 301aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (get_u32(&key, *argv, 0)) 302aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 303aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger argc--; argv++; 304aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 305aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (get_u32(&mask, *argv, 16)) 306aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 307aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger argc--; argv++; 308aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 309aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (key > 0xFF || mask > 0xFF) 310aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 311aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 312aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (argc > 0 && strcmp(argv[0], "at") == 0) { 313aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 314aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (parse_at(&argc, &argv, &off, &offmask)) 315aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 316aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 317aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 318aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger res = pack_key8(sel, key, mask, off, offmask); 319aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *argc_p = argc; 320aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *argv_p = argv; 321aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return res; 322aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 323aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 324e62077d0b663fdbb8a34bedbe396c976e1db1177Stephen Hemmingerstatic int parse_ip_addr(int *argc_p, char ***argv_p, struct tc_u32_sel *sel, 325e62077d0b663fdbb8a34bedbe396c976e1db1177Stephen Hemminger int off) 326aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 327aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int res = -1; 328aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int argc = *argc_p; 329aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char **argv = *argv_p; 330aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger inet_prefix addr; 331aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger __u32 mask; 332aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int offmask = 0; 333aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 334aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (argc < 1) 335aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 336aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 337aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (get_prefix_1(&addr, *argv, AF_INET)) 338aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 339aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger argc--; argv++; 340aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 341aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (argc > 0 && strcmp(argv[0], "at") == 0) { 342aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 343aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (parse_at(&argc, &argv, &off, &offmask)) 344aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 345aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 346aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 347aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger mask = 0; 348aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (addr.bitlen) 349aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger mask = htonl(0xFFFFFFFF<<(32-addr.bitlen)); 350aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (pack_key(sel, addr.data[0], mask, off, offmask) < 0) 351aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 352aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger res = 0; 353aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 354aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *argc_p = argc; 355aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *argv_p = argv; 356aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return res; 357aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 358aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 359e62077d0b663fdbb8a34bedbe396c976e1db1177Stephen Hemmingerstatic int parse_ip6_addr(int *argc_p, char ***argv_p, 360e62077d0b663fdbb8a34bedbe396c976e1db1177Stephen Hemminger struct tc_u32_sel *sel, int off) 361aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 362aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int res = -1; 363aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int argc = *argc_p; 364aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char **argv = *argv_p; 365aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int plen = 128; 366aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int i; 367aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger inet_prefix addr; 368aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int offmask = 0; 369aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 370aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (argc < 1) 371aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 372aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 373aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (get_prefix_1(&addr, *argv, AF_INET6)) 374aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 375aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger argc--; argv++; 376aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 377aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (argc > 0 && strcmp(argv[0], "at") == 0) { 378aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 379aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (parse_at(&argc, &argv, &off, &offmask)) 380aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 381aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 382aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 383aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger plen = addr.bitlen; 384aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger for (i=0; i<plen; i+=32) { 3852373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger// if (((i+31)&~0x1F)<=plen) { 386e62077d0b663fdbb8a34bedbe396c976e1db1177Stephen Hemminger if (i + 31 <= plen) { 387e62077d0b663fdbb8a34bedbe396c976e1db1177Stephen Hemminger res = pack_key(sel, addr.data[i/32], 388e62077d0b663fdbb8a34bedbe396c976e1db1177Stephen Hemminger 0xFFFFFFFF, off+4*(i/32), offmask); 389e62077d0b663fdbb8a34bedbe396c976e1db1177Stephen Hemminger if (res < 0) 390aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 391e62077d0b663fdbb8a34bedbe396c976e1db1177Stephen Hemminger } else if (i < plen) { 392e62077d0b663fdbb8a34bedbe396c976e1db1177Stephen Hemminger __u32 mask = htonl(0xFFFFFFFF << (32 - (plen -i ))); 393e62077d0b663fdbb8a34bedbe396c976e1db1177Stephen Hemminger res = pack_key(sel, addr.data[i/32], 394e62077d0b663fdbb8a34bedbe396c976e1db1177Stephen Hemminger mask, off+4*(i/32), offmask); 395e62077d0b663fdbb8a34bedbe396c976e1db1177Stephen Hemminger if (res < 0) 396aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 397aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 398aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 399aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger res = 0; 400aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 401aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *argc_p = argc; 402aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *argv_p = argv; 403aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return res; 404aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 405aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 4060156412215abec067ff08d760f454adbccb9a13fPetr Lautrbachstatic int parse_ip6_class(int *argc_p, char ***argv_p, struct tc_u32_sel *sel) 4070156412215abec067ff08d760f454adbccb9a13fPetr Lautrbach{ 4080156412215abec067ff08d760f454adbccb9a13fPetr Lautrbach int res = -1; 4090156412215abec067ff08d760f454adbccb9a13fPetr Lautrbach int argc = *argc_p; 4100156412215abec067ff08d760f454adbccb9a13fPetr Lautrbach char **argv = *argv_p; 4110156412215abec067ff08d760f454adbccb9a13fPetr Lautrbach __u32 key; 4120156412215abec067ff08d760f454adbccb9a13fPetr Lautrbach __u32 mask; 4130156412215abec067ff08d760f454adbccb9a13fPetr Lautrbach int off = 0; 4140156412215abec067ff08d760f454adbccb9a13fPetr Lautrbach int offmask = 0; 4150156412215abec067ff08d760f454adbccb9a13fPetr Lautrbach 4160156412215abec067ff08d760f454adbccb9a13fPetr Lautrbach if (argc < 2) 4170156412215abec067ff08d760f454adbccb9a13fPetr Lautrbach return -1; 4180156412215abec067ff08d760f454adbccb9a13fPetr Lautrbach 4190156412215abec067ff08d760f454adbccb9a13fPetr Lautrbach if (get_u32(&key, *argv, 0)) 4200156412215abec067ff08d760f454adbccb9a13fPetr Lautrbach return -1; 4210156412215abec067ff08d760f454adbccb9a13fPetr Lautrbach argc--; argv++; 4220156412215abec067ff08d760f454adbccb9a13fPetr Lautrbach 4230156412215abec067ff08d760f454adbccb9a13fPetr Lautrbach if (get_u32(&mask, *argv, 16)) 4240156412215abec067ff08d760f454adbccb9a13fPetr Lautrbach return -1; 4250156412215abec067ff08d760f454adbccb9a13fPetr Lautrbach argc--; argv++; 4260156412215abec067ff08d760f454adbccb9a13fPetr Lautrbach 4270156412215abec067ff08d760f454adbccb9a13fPetr Lautrbach if (key > 0xFF || mask > 0xFF) 4280156412215abec067ff08d760f454adbccb9a13fPetr Lautrbach return -1; 4290156412215abec067ff08d760f454adbccb9a13fPetr Lautrbach 4300156412215abec067ff08d760f454adbccb9a13fPetr Lautrbach key <<= 20; 4310156412215abec067ff08d760f454adbccb9a13fPetr Lautrbach mask <<= 20; 4320156412215abec067ff08d760f454adbccb9a13fPetr Lautrbach key = htonl(key); 4330156412215abec067ff08d760f454adbccb9a13fPetr Lautrbach mask = htonl(mask); 4340156412215abec067ff08d760f454adbccb9a13fPetr Lautrbach 435d7ac9ad4f480d6e162165ec3f2c8e1bf50003ec3Stephen Hemminger res = pack_key(sel, key, mask, off, offmask); 436d7ac9ad4f480d6e162165ec3f2c8e1bf50003ec3Stephen Hemminger if (res < 0) 4370156412215abec067ff08d760f454adbccb9a13fPetr Lautrbach return -1; 4380156412215abec067ff08d760f454adbccb9a13fPetr Lautrbach 4390156412215abec067ff08d760f454adbccb9a13fPetr Lautrbach *argc_p = argc; 4400156412215abec067ff08d760f454adbccb9a13fPetr Lautrbach *argv_p = argv; 4410156412215abec067ff08d760f454adbccb9a13fPetr Lautrbach return 0; 4420156412215abec067ff08d760f454adbccb9a13fPetr Lautrbach} 4430156412215abec067ff08d760f454adbccb9a13fPetr Lautrbach 444b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemmingerstatic int parse_ether_addr(int *argc_p, char ***argv_p, 445b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger struct tc_u32_sel *sel, int off) 446b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger{ 447b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger int res = -1; 448b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger int argc = *argc_p; 449b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger char **argv = *argv_p; 450b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger __u8 addr[6]; 451b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger int offmask = 0; 452b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger int i; 453b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger 454b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger if (argc < 1) 455b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger return -1; 456b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger 457b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger if (sscanf(*argv, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", 458b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger addr + 0, addr + 1, addr + 2, 459b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger addr + 3, addr + 4, addr + 5) != 6) { 460b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger fprintf(stderr, "parse_ether_addr: improperly formed address '%s'\n", 461b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger *argv); 462b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger return -1; 463b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger } 464b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger 465b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger argc--; argv++; 466b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger if (argc > 0 && strcmp(argv[0], "at") == 0) { 467b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger NEXT_ARG(); 468b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger if (parse_at(&argc, &argv, &off, &offmask)) 469b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger return -1; 470b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger } 471b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger 472e3d153c1fb35ec5d5f4ce197afb4cb13093ce534Stephen Hemminger for (i = 0; i < 6; i++) { 473e3d153c1fb35ec5d5f4ce197afb4cb13093ce534Stephen Hemminger res = pack_key8(sel, addr[i], 0xFF, off + i, offmask); 474b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger if (res < 0) 475b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger return -1; 476b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger } 477b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger 478b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger *argc_p = argc; 479b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger *argv_p = argv; 480b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger return res; 481b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger} 482b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger 483aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic int parse_ip(int *argc_p, char ***argv_p, struct tc_u32_sel *sel) 484aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 485aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int res = -1; 486aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int argc = *argc_p; 487aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char **argv = *argv_p; 488aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 489aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (argc < 2) 490aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 491aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 492aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (strcmp(*argv, "src") == 0) { 493aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 494aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger res = parse_ip_addr(&argc, &argv, sel, 12); 4959fce67dd467e9148f440b701105e1e75f3ae4153Stephen Hemminger } else if (strcmp(*argv, "dst") == 0) { 496aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 497aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger res = parse_ip_addr(&argc, &argv, sel, 16); 4989fce67dd467e9148f440b701105e1e75f3ae4153Stephen Hemminger } else if (strcmp(*argv, "tos") == 0 || 499aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger matches(*argv, "dsfield") == 0) { 500aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 501aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger res = parse_u8(&argc, &argv, sel, 1, 0); 5029fce67dd467e9148f440b701105e1e75f3ae4153Stephen Hemminger } else if (strcmp(*argv, "ihl") == 0) { 503aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 504aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger res = parse_u8(&argc, &argv, sel, 0, 0); 5059fce67dd467e9148f440b701105e1e75f3ae4153Stephen Hemminger } else if (strcmp(*argv, "protocol") == 0) { 506aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 507aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger res = parse_u8(&argc, &argv, sel, 9, 0); 5089fce67dd467e9148f440b701105e1e75f3ae4153Stephen Hemminger } else if (matches(*argv, "precedence") == 0) { 509aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 510aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger res = parse_u8(&argc, &argv, sel, 1, 0); 5119fce67dd467e9148f440b701105e1e75f3ae4153Stephen Hemminger } else if (strcmp(*argv, "nofrag") == 0) { 512aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger argc--; argv++; 513aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger res = pack_key16(sel, 0, 0x3FFF, 6, 0); 5149fce67dd467e9148f440b701105e1e75f3ae4153Stephen Hemminger } else if (strcmp(*argv, "firstfrag") == 0) { 515aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger argc--; argv++; 516aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger res = pack_key16(sel, 0, 0x1FFF, 6, 0); 5179fce67dd467e9148f440b701105e1e75f3ae4153Stephen Hemminger } else if (strcmp(*argv, "df") == 0) { 518aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger argc--; argv++; 519aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger res = pack_key16(sel, 0x4000, 0x4000, 6, 0); 5209fce67dd467e9148f440b701105e1e75f3ae4153Stephen Hemminger } else if (strcmp(*argv, "mf") == 0) { 521aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger argc--; argv++; 522aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger res = pack_key16(sel, 0x2000, 0x2000, 6, 0); 5239fce67dd467e9148f440b701105e1e75f3ae4153Stephen Hemminger } else if (strcmp(*argv, "dport") == 0) { 524aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 525aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger res = parse_u16(&argc, &argv, sel, 22, 0); 5269fce67dd467e9148f440b701105e1e75f3ae4153Stephen Hemminger } else if (strcmp(*argv, "sport") == 0) { 527aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 528aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger res = parse_u16(&argc, &argv, sel, 20, 0); 5299fce67dd467e9148f440b701105e1e75f3ae4153Stephen Hemminger } else if (strcmp(*argv, "icmp_type") == 0) { 530aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 531aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger res = parse_u8(&argc, &argv, sel, 20, 0); 5329fce67dd467e9148f440b701105e1e75f3ae4153Stephen Hemminger } else if (strcmp(*argv, "icmp_code") == 0) { 533aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 534aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger res = parse_u8(&argc, &argv, sel, 20, 1); 5359fce67dd467e9148f440b701105e1e75f3ae4153Stephen Hemminger } else 5369fce67dd467e9148f440b701105e1e75f3ae4153Stephen Hemminger return -1; 537aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 538aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *argc_p = argc; 539aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *argv_p = argv; 540aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return res; 541aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 5426b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger 543aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic int parse_ip6(int *argc_p, char ***argv_p, struct tc_u32_sel *sel) 544aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 545aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int res = -1; 546aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int argc = *argc_p; 547aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char **argv = *argv_p; 548aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 549aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (argc < 2) 550aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 551aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 552aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (strcmp(*argv, "src") == 0) { 553aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 554aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger res = parse_ip6_addr(&argc, &argv, sel, 8); 5559fce67dd467e9148f440b701105e1e75f3ae4153Stephen Hemminger } else if (strcmp(*argv, "dst") == 0) { 556aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 557aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger res = parse_ip6_addr(&argc, &argv, sel, 24); 5589fce67dd467e9148f440b701105e1e75f3ae4153Stephen Hemminger } else if (strcmp(*argv, "priority") == 0) { 559aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 5600156412215abec067ff08d760f454adbccb9a13fPetr Lautrbach res = parse_ip6_class(&argc, &argv, sel); 5619fce67dd467e9148f440b701105e1e75f3ae4153Stephen Hemminger } else if (strcmp(*argv, "protocol") == 0) { 562aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 563aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger res = parse_u8(&argc, &argv, sel, 6, 0); 5649fce67dd467e9148f440b701105e1e75f3ae4153Stephen Hemminger } else if (strcmp(*argv, "flowlabel") == 0) { 565aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 566aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger res = parse_u32(&argc, &argv, sel, 0, 0); 5679fce67dd467e9148f440b701105e1e75f3ae4153Stephen Hemminger } else if (strcmp(*argv, "dport") == 0) { 568aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 569aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger res = parse_u16(&argc, &argv, sel, 42, 0); 5709fce67dd467e9148f440b701105e1e75f3ae4153Stephen Hemminger } else if (strcmp(*argv, "sport") == 0) { 571aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 572aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger res = parse_u16(&argc, &argv, sel, 40, 0); 5739fce67dd467e9148f440b701105e1e75f3ae4153Stephen Hemminger } else if (strcmp(*argv, "icmp_type") == 0) { 574aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 575aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger res = parse_u8(&argc, &argv, sel, 40, 0); 5769fce67dd467e9148f440b701105e1e75f3ae4153Stephen Hemminger } else if (strcmp(*argv, "icmp_code") == 0) { 577aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 578aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger res = parse_u8(&argc, &argv, sel, 41, 1); 5799fce67dd467e9148f440b701105e1e75f3ae4153Stephen Hemminger } else 5809fce67dd467e9148f440b701105e1e75f3ae4153Stephen Hemminger return -1; 581aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 582aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *argc_p = argc; 583aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *argv_p = argv; 584aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return res; 585aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 586aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 587b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemmingerstatic int parse_ether(int *argc_p, char ***argv_p, struct tc_u32_sel *sel) 588b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger{ 589b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger int res = -1; 590b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger int argc = *argc_p; 591b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger char **argv = *argv_p; 592b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger 593b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger if (argc < 2) 594b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger return -1; 595b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger 596b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger if (strcmp(*argv, "src") == 0) { 597b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger NEXT_ARG(); 598b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger res = parse_ether_addr(&argc, &argv, sel, -8); 599b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger } else if (strcmp(*argv, "dst") == 0) { 600b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger NEXT_ARG(); 601b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger res = parse_ether_addr(&argc, &argv, sel, -14); 602b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger } else { 603b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger fprintf(stderr, "Unknown match: ether %s\n", *argv); 604b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger return -1; 605b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger } 606b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger 607b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger *argc_p = argc; 608b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger *argv_p = argv; 609b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger return res; 610b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger} 611b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger 612aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#define parse_tcp parse_udp 613aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic int parse_udp(int *argc_p, char ***argv_p, struct tc_u32_sel *sel) 614aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 615aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int res = -1; 616aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int argc = *argc_p; 617aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char **argv = *argv_p; 618aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 619aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (argc < 2) 620aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 621aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 622aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (strcmp(*argv, "src") == 0) { 623aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 624aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger res = parse_u16(&argc, &argv, sel, 0, -1); 6259fce67dd467e9148f440b701105e1e75f3ae4153Stephen Hemminger } else if (strcmp(*argv, "dst") == 0) { 626aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 627aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger res = parse_u16(&argc, &argv, sel, 2, -1); 6289fce67dd467e9148f440b701105e1e75f3ae4153Stephen Hemminger } else 6299fce67dd467e9148f440b701105e1e75f3ae4153Stephen Hemminger return -1; 630aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 631aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *argc_p = argc; 632aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *argv_p = argv; 633aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return res; 634aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 635aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 6366b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger 637aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic int parse_icmp(int *argc_p, char ***argv_p, struct tc_u32_sel *sel) 638aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 639aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int res = -1; 640aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int argc = *argc_p; 641aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char **argv = *argv_p; 642aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 643aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (argc < 2) 644aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 645aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 646aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (strcmp(*argv, "type") == 0) { 647aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 648aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger res = parse_u8(&argc, &argv, sel, 0, -1); 6499fce67dd467e9148f440b701105e1e75f3ae4153Stephen Hemminger } else if (strcmp(*argv, "code") == 0) { 650aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 651aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger res = parse_u8(&argc, &argv, sel, 1, -1); 6529fce67dd467e9148f440b701105e1e75f3ae4153Stephen Hemminger } else 6539fce67dd467e9148f440b701105e1e75f3ae4153Stephen Hemminger return -1; 654aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 655aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *argc_p = argc; 656aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *argv_p = argv; 657aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return res; 658aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 659aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 6606f0ba88be018dee5feb08e7b125b10b633bb000cnet[shemminger]!shemmingerstatic int parse_mark(int *argc_p, char ***argv_p, struct nlmsghdr *n) 6616f0ba88be018dee5feb08e7b125b10b633bb000cnet[shemminger]!shemminger{ 6626f0ba88be018dee5feb08e7b125b10b633bb000cnet[shemminger]!shemminger int res = -1; 6636f0ba88be018dee5feb08e7b125b10b633bb000cnet[shemminger]!shemminger int argc = *argc_p; 6646f0ba88be018dee5feb08e7b125b10b633bb000cnet[shemminger]!shemminger char **argv = *argv_p; 6656f0ba88be018dee5feb08e7b125b10b633bb000cnet[shemminger]!shemminger struct tc_u32_mark mark; 6666f0ba88be018dee5feb08e7b125b10b633bb000cnet[shemminger]!shemminger 6676f0ba88be018dee5feb08e7b125b10b633bb000cnet[shemminger]!shemminger if (argc <= 1) 6686f0ba88be018dee5feb08e7b125b10b633bb000cnet[shemminger]!shemminger return -1; 6696f0ba88be018dee5feb08e7b125b10b633bb000cnet[shemminger]!shemminger 6706f0ba88be018dee5feb08e7b125b10b633bb000cnet[shemminger]!shemminger if (get_u32(&mark.val, *argv, 0)) { 6716f0ba88be018dee5feb08e7b125b10b633bb000cnet[shemminger]!shemminger fprintf(stderr, "Illegal \"mark\" value\n"); 6726f0ba88be018dee5feb08e7b125b10b633bb000cnet[shemminger]!shemminger return -1; 6736f0ba88be018dee5feb08e7b125b10b633bb000cnet[shemminger]!shemminger } 6746f0ba88be018dee5feb08e7b125b10b633bb000cnet[shemminger]!shemminger NEXT_ARG(); 6756f0ba88be018dee5feb08e7b125b10b633bb000cnet[shemminger]!shemminger 6766f0ba88be018dee5feb08e7b125b10b633bb000cnet[shemminger]!shemminger if (get_u32(&mark.mask, *argv, 0)) { 6776f0ba88be018dee5feb08e7b125b10b633bb000cnet[shemminger]!shemminger fprintf(stderr, "Illegal \"mark\" mask\n"); 6786f0ba88be018dee5feb08e7b125b10b633bb000cnet[shemminger]!shemminger return -1; 6796f0ba88be018dee5feb08e7b125b10b633bb000cnet[shemminger]!shemminger } 6806f0ba88be018dee5feb08e7b125b10b633bb000cnet[shemminger]!shemminger NEXT_ARG(); 6816f0ba88be018dee5feb08e7b125b10b633bb000cnet[shemminger]!shemminger 6826f0ba88be018dee5feb08e7b125b10b633bb000cnet[shemminger]!shemminger if ((mark.val & mark.mask) != mark.val) { 6836f0ba88be018dee5feb08e7b125b10b633bb000cnet[shemminger]!shemminger fprintf(stderr, "Illegal \"mark\" (impossible combination)\n"); 6846f0ba88be018dee5feb08e7b125b10b633bb000cnet[shemminger]!shemminger return -1; 6856f0ba88be018dee5feb08e7b125b10b633bb000cnet[shemminger]!shemminger } 686aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 6876f0ba88be018dee5feb08e7b125b10b633bb000cnet[shemminger]!shemminger addattr_l(n, MAX_MSG, TCA_U32_MARK, &mark, sizeof(mark)); 6886f0ba88be018dee5feb08e7b125b10b633bb000cnet[shemminger]!shemminger res = 0; 6896f0ba88be018dee5feb08e7b125b10b633bb000cnet[shemminger]!shemminger 6906f0ba88be018dee5feb08e7b125b10b633bb000cnet[shemminger]!shemminger *argc_p = argc; 6916f0ba88be018dee5feb08e7b125b10b633bb000cnet[shemminger]!shemminger *argv_p = argv; 6926f0ba88be018dee5feb08e7b125b10b633bb000cnet[shemminger]!shemminger return res; 6936f0ba88be018dee5feb08e7b125b10b633bb000cnet[shemminger]!shemminger} 694aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 695e62077d0b663fdbb8a34bedbe396c976e1db1177Stephen Hemmingerstatic int parse_selector(int *argc_p, char ***argv_p, 696e62077d0b663fdbb8a34bedbe396c976e1db1177Stephen Hemminger struct tc_u32_sel *sel, struct nlmsghdr *n) 697aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 698aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int argc = *argc_p; 699aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char **argv = *argv_p; 700aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int res = -1; 701aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 702aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (argc <= 0) 703aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 704aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 705aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (matches(*argv, "u32") == 0) { 706aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 707aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger res = parse_u32(&argc, &argv, sel, 0, 0); 7089fce67dd467e9148f440b701105e1e75f3ae4153Stephen Hemminger } else if (matches(*argv, "u16") == 0) { 709aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 710aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger res = parse_u16(&argc, &argv, sel, 0, 0); 7119fce67dd467e9148f440b701105e1e75f3ae4153Stephen Hemminger } else if (matches(*argv, "u8") == 0) { 712aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 713aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger res = parse_u8(&argc, &argv, sel, 0, 0); 7149fce67dd467e9148f440b701105e1e75f3ae4153Stephen Hemminger } else if (matches(*argv, "ip") == 0) { 715aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 716aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger res = parse_ip(&argc, &argv, sel); 7179fce67dd467e9148f440b701105e1e75f3ae4153Stephen Hemminger } else if (matches(*argv, "ip6") == 0) { 718aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 719aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger res = parse_ip6(&argc, &argv, sel); 7209fce67dd467e9148f440b701105e1e75f3ae4153Stephen Hemminger } else if (matches(*argv, "udp") == 0) { 721aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 722aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger res = parse_udp(&argc, &argv, sel); 7239fce67dd467e9148f440b701105e1e75f3ae4153Stephen Hemminger } else if (matches(*argv, "tcp") == 0) { 724aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 725aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger res = parse_tcp(&argc, &argv, sel); 7269fce67dd467e9148f440b701105e1e75f3ae4153Stephen Hemminger } else if (matches(*argv, "icmp") == 0) { 727aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 728aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger res = parse_icmp(&argc, &argv, sel); 7299fce67dd467e9148f440b701105e1e75f3ae4153Stephen Hemminger } else if (matches(*argv, "mark") == 0) { 7306f0ba88be018dee5feb08e7b125b10b633bb000cnet[shemminger]!shemminger NEXT_ARG(); 7316f0ba88be018dee5feb08e7b125b10b633bb000cnet[shemminger]!shemminger res = parse_mark(&argc, &argv, n); 732b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger } else if (matches(*argv, "ether") == 0) { 733b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger NEXT_ARG(); 734b4d41f41b6d601f876f442ae19ccdb4f0c3552c5Stephen Hemminger res = parse_ether(&argc, &argv, sel); 7359fce67dd467e9148f440b701105e1e75f3ae4153Stephen Hemminger } else 7369fce67dd467e9148f440b701105e1e75f3ae4153Stephen Hemminger return -1; 737aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 738aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *argc_p = argc; 739aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *argv_p = argv; 740aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return res; 741aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 742aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 743aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic int parse_offset(int *argc_p, char ***argv_p, struct tc_u32_sel *sel) 744aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 745aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int argc = *argc_p; 746aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char **argv = *argv_p; 747aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 748aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger while (argc > 0) { 749aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (matches(*argv, "plus") == 0) { 750aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int off; 751aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 752aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (get_integer(&off, *argv, 0)) 753aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 754aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger sel->off = off; 755aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger sel->flags |= TC_U32_OFFSET; 756aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (matches(*argv, "at") == 0) { 757aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int off; 758aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 759aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (get_integer(&off, *argv, 0)) 760aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 761aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger sel->offoff = off; 762aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (off%2) { 763aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "offset \"at\" must be even\n"); 764aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 765aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 766aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger sel->flags |= TC_U32_VAROFFSET; 767aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (matches(*argv, "mask") == 0) { 768aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger __u16 mask; 769aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 770aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (get_u16(&mask, *argv, 16)) 771aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 772aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger sel->offmask = htons(mask); 773aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger sel->flags |= TC_U32_VAROFFSET; 774aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (matches(*argv, "shift") == 0) { 775aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int shift; 776aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 777aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (get_integer(&shift, *argv, 0)) 778aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 779aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger sel->offshift = shift; 780aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger sel->flags |= TC_U32_VAROFFSET; 781aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (matches(*argv, "eat") == 0) { 782aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger sel->flags |= TC_U32_EAT; 783aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else { 784aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger break; 785aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 786aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger argc--; argv++; 787aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 788aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 789aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *argc_p = argc; 790aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *argv_p = argv; 791aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 792aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 793aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 794aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic int parse_hashkey(int *argc_p, char ***argv_p, struct tc_u32_sel *sel) 795aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 796aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int argc = *argc_p; 797aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char **argv = *argv_p; 798aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 799aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger while (argc > 0) { 800aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (matches(*argv, "mask") == 0) { 801aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger __u32 mask; 802aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 803aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (get_u32(&mask, *argv, 16)) 804aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 805aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger sel->hmask = htonl(mask); 806aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (matches(*argv, "at") == 0) { 807aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int num; 808aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 809aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (get_integer(&num, *argv, 0)) 810aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 811aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (num%4) 812aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 813aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger sel->hoff = num; 814aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else { 815aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger break; 816aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 817aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger argc--; argv++; 818aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 819aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 820aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *argc_p = argc; 821aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *argv_p = argv; 822aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 823aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 824aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 8251750abe2ba8b695aa39a67cff8ac44b2fb6a2a3djamalstatic void print_ipv4(FILE *f, const struct tc_u32_key *key) 8266b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger{ 8276b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger char abuf[256]; 8286b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger 8296b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger switch (key->off) { 8304c9ffc2f8cc9e4c4851b8b74ce656eb23fa17b72Stephen Hemminger case 0: 8314c9ffc2f8cc9e4c4851b8b74ce656eb23fa17b72Stephen Hemminger switch (ntohl(key->mask)) { 8324c9ffc2f8cc9e4c4851b8b74ce656eb23fa17b72Stephen Hemminger case 0x0f000000: 8331750abe2ba8b695aa39a67cff8ac44b2fb6a2a3djamal fprintf(f, "\n match IP ihl %u", ntohl(key->val) >> 24); 8344c9ffc2f8cc9e4c4851b8b74ce656eb23fa17b72Stephen Hemminger return; 8354c9ffc2f8cc9e4c4851b8b74ce656eb23fa17b72Stephen Hemminger case 0x00ff0000: 8361750abe2ba8b695aa39a67cff8ac44b2fb6a2a3djamal fprintf(f, "\n match IP dsfield %#x", ntohl(key->val) >> 16); 8374c9ffc2f8cc9e4c4851b8b74ce656eb23fa17b72Stephen Hemminger return; 8384c9ffc2f8cc9e4c4851b8b74ce656eb23fa17b72Stephen Hemminger } 8394c9ffc2f8cc9e4c4851b8b74ce656eb23fa17b72Stephen Hemminger break; 8404c9ffc2f8cc9e4c4851b8b74ce656eb23fa17b72Stephen Hemminger case 8: 8414c9ffc2f8cc9e4c4851b8b74ce656eb23fa17b72Stephen Hemminger if (ntohl(key->mask) == 0x00ff0000) { 8421750abe2ba8b695aa39a67cff8ac44b2fb6a2a3djamal fprintf(f, "\n match IP protocol %d", ntohl(key->val) >> 16); 8434c9ffc2f8cc9e4c4851b8b74ce656eb23fa17b72Stephen Hemminger return; 8444c9ffc2f8cc9e4c4851b8b74ce656eb23fa17b72Stephen Hemminger } 8454c9ffc2f8cc9e4c4851b8b74ce656eb23fa17b72Stephen Hemminger break; 8466b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger case 12: 8476b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger case 16: { 8486b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger int bits = mask2bits(key->mask); 8496b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger if (bits >= 0) { 8504c9ffc2f8cc9e4c4851b8b74ce656eb23fa17b72Stephen Hemminger fprintf(f, "\n %s %s/%d", 8511750abe2ba8b695aa39a67cff8ac44b2fb6a2a3djamal key->off == 12 ? "match IP src" : "match IP dst", 852e62077d0b663fdbb8a34bedbe396c976e1db1177Stephen Hemminger inet_ntop(AF_INET, &key->val, 853e62077d0b663fdbb8a34bedbe396c976e1db1177Stephen Hemminger abuf, sizeof(abuf)), 8546b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger bits); 8556b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger return; 8566b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger } 8576b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger } 8586b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger break; 8596b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger 8606b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger case 20: 8614c9ffc2f8cc9e4c4851b8b74ce656eb23fa17b72Stephen Hemminger switch (ntohl(key->mask)) { 8624c9ffc2f8cc9e4c4851b8b74ce656eb23fa17b72Stephen Hemminger case 0x0000ffff: 863bcd7abddd4962f01f35eb644702c9abdf4c81d0eStephen Hemminger fprintf(f, "\n match dport %u", 8644c9ffc2f8cc9e4c4851b8b74ce656eb23fa17b72Stephen Hemminger ntohl(key->val) & 0xffff); 8654c9ffc2f8cc9e4c4851b8b74ce656eb23fa17b72Stephen Hemminger return; 8664c9ffc2f8cc9e4c4851b8b74ce656eb23fa17b72Stephen Hemminger case 0xffff0000: 867bcd7abddd4962f01f35eb644702c9abdf4c81d0eStephen Hemminger fprintf(f, "\n match sport %u", 8684c9ffc2f8cc9e4c4851b8b74ce656eb23fa17b72Stephen Hemminger ntohl(key->val) >> 16); 8694c9ffc2f8cc9e4c4851b8b74ce656eb23fa17b72Stephen Hemminger return; 8704c9ffc2f8cc9e4c4851b8b74ce656eb23fa17b72Stephen Hemminger case 0xffffffff: 871bcd7abddd4962f01f35eb644702c9abdf4c81d0eStephen Hemminger fprintf(f, "\n match dport %u, match sport %u", 8724c9ffc2f8cc9e4c4851b8b74ce656eb23fa17b72Stephen Hemminger ntohl(key->val) & 0xffff, 8734c9ffc2f8cc9e4c4851b8b74ce656eb23fa17b72Stephen Hemminger ntohl(key->val) >> 16); 8744c9ffc2f8cc9e4c4851b8b74ce656eb23fa17b72Stephen Hemminger 8756b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger return; 8766b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger } 8771750abe2ba8b695aa39a67cff8ac44b2fb6a2a3djamal /* XXX: Default print_raw */ 8786b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger } 8791750abe2ba8b695aa39a67cff8ac44b2fb6a2a3djamal} 8806b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger 881d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemmingerstatic void print_ipv6(FILE *f, const struct tc_u32_key *key) 882d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger{ 883d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger char abuf[256]; 884d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger 885d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger switch (key->off) { 886d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger case 0: 887d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger switch (ntohl(key->mask)) { 888d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger case 0x0f000000: 889d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger fprintf(f, "\n match IP ihl %u", ntohl(key->val) >> 24); 890d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger return; 891d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger case 0x00ff0000: 892d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger fprintf(f, "\n match IP dsfield %#x", ntohl(key->val) >> 16); 893d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger return; 894d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger } 895d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger break; 896d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger case 8: 897d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger if (ntohl(key->mask) == 0x00ff0000) { 898d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger fprintf(f, "\n match IP protocol %d", ntohl(key->val) >> 16); 899d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger return; 900d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger } 901d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger break; 902d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger case 12: 903d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger case 16: { 904d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger int bits = mask2bits(key->mask); 905d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger if (bits >= 0) { 906d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger fprintf(f, "\n %s %s/%d", 907d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger key->off == 12 ? "match IP src" : "match IP dst", 908d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger inet_ntop(AF_INET, &key->val, 909d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger abuf, sizeof(abuf)), 910d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger bits); 911d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger return; 912d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger } 913d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger } 914d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger break; 915d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger 916d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger case 20: 917d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger switch (ntohl(key->mask)) { 918d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger case 0x0000ffff: 919d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger fprintf(f, "\n match sport %u", 920d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger ntohl(key->val) & 0xffff); 921d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger return; 922d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger case 0xffff0000: 923d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger fprintf(f, "\n match dport %u", 924d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger ntohl(key->val) >> 16); 925d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger return; 926d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger case 0xffffffff: 927d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger fprintf(f, "\n match sport %u, match dport %u", 928d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger ntohl(key->val) & 0xffff, 929d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger ntohl(key->val) >> 16); 930d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger 931d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger return; 932d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger } 933d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger /* XXX: Default print_raw */ 934d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger } 935d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger} 936d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger 9371750abe2ba8b695aa39a67cff8ac44b2fb6a2a3djamalstatic void print_raw(FILE *f, const struct tc_u32_key *key) 9381750abe2ba8b695aa39a67cff8ac44b2fb6a2a3djamal{ 9391750abe2ba8b695aa39a67cff8ac44b2fb6a2a3djamal fprintf(f, "\n match %08x/%08x at %s%d", 9406b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger (unsigned int)ntohl(key->val), 9416b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger (unsigned int)ntohl(key->mask), 9426b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger key->offmask ? "nexthdr+" : "", 9436b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger key->off); 9446b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger} 9456b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger 9461750abe2ba8b695aa39a67cff8ac44b2fb6a2a3djamalstatic const struct { 9471750abe2ba8b695aa39a67cff8ac44b2fb6a2a3djamal __u16 proto; 9481750abe2ba8b695aa39a67cff8ac44b2fb6a2a3djamal __u16 pad; 9491750abe2ba8b695aa39a67cff8ac44b2fb6a2a3djamal void (*pprinter)(FILE *f, const struct tc_u32_key *key); 9501750abe2ba8b695aa39a67cff8ac44b2fb6a2a3djamal} u32_pprinters[] = { 9511750abe2ba8b695aa39a67cff8ac44b2fb6a2a3djamal {0, 0, print_raw}, 9521750abe2ba8b695aa39a67cff8ac44b2fb6a2a3djamal {ETH_P_IP, 0, print_ipv4}, 953d13cee6d598d8b078eefb3209bea069803c70021Stephen Hemminger {ETH_P_IPV6, 0, print_ipv6}, 9541750abe2ba8b695aa39a67cff8ac44b2fb6a2a3djamal}; 9551750abe2ba8b695aa39a67cff8ac44b2fb6a2a3djamal 9561750abe2ba8b695aa39a67cff8ac44b2fb6a2a3djamalstatic void show_keys(FILE *f, const struct tc_u32_key *key) 9571750abe2ba8b695aa39a67cff8ac44b2fb6a2a3djamal{ 9581750abe2ba8b695aa39a67cff8ac44b2fb6a2a3djamal int i = 0; 9591750abe2ba8b695aa39a67cff8ac44b2fb6a2a3djamal 9601750abe2ba8b695aa39a67cff8ac44b2fb6a2a3djamal if (!show_pretty) 9611750abe2ba8b695aa39a67cff8ac44b2fb6a2a3djamal goto show_k; 9621750abe2ba8b695aa39a67cff8ac44b2fb6a2a3djamal 9631750abe2ba8b695aa39a67cff8ac44b2fb6a2a3djamal for (i = 0; i < sizeof(u32_pprinters) / sizeof(u32_pprinters[0]); i++) { 9641750abe2ba8b695aa39a67cff8ac44b2fb6a2a3djamal if (u32_pprinters[i].proto == ntohs(f_proto)) { 9651750abe2ba8b695aa39a67cff8ac44b2fb6a2a3djamalshow_k: 9661750abe2ba8b695aa39a67cff8ac44b2fb6a2a3djamal u32_pprinters[i].pprinter(f, key); 9671750abe2ba8b695aa39a67cff8ac44b2fb6a2a3djamal return; 9681750abe2ba8b695aa39a67cff8ac44b2fb6a2a3djamal } 9691750abe2ba8b695aa39a67cff8ac44b2fb6a2a3djamal } 9701750abe2ba8b695aa39a67cff8ac44b2fb6a2a3djamal 9711750abe2ba8b695aa39a67cff8ac44b2fb6a2a3djamal i = 0; 9721750abe2ba8b695aa39a67cff8ac44b2fb6a2a3djamal goto show_k; 9731750abe2ba8b695aa39a67cff8ac44b2fb6a2a3djamal} 9741750abe2ba8b695aa39a67cff8ac44b2fb6a2a3djamal 9751750abe2ba8b695aa39a67cff8ac44b2fb6a2a3djamalstatic int u32_parse_opt(struct filter_util *qu, char *handle, 9766b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger int argc, char **argv, struct nlmsghdr *n) 977aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 978aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger struct { 979aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger struct tc_u32_sel sel; 980aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger struct tc_u32_key keys[128]; 981aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } sel; 982aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger struct tcmsg *t = NLMSG_DATA(n); 983aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger struct rtattr *tail; 984dcf13497228742af3290ce6039e821d9c5ed5945jamal int sel_ok = 0, terminal_ok = 0; 985aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int sample_ok = 0; 986aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger __u32 htid = 0; 987aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger __u32 order = 0; 988aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 989aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger memset(&sel, 0, sizeof(sel)); 990aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 991aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (handle && get_u32_handle(&t->tcm_handle, handle)) { 992aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "Illegal filter ID\n"); 993aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 994aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 995aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 996aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (argc == 0) 997aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 998aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 9994a86fe19bc7f125d3eb40366277f87da4cda78ddn); tail = NLMSG_TAIL(n); 10002373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger addattr_l(n, MAX_MSG, TCA_OPTIONS, NULL, 0); 1001aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 1002aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger while (argc > 0) { 1003aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (matches(*argv, "match") == 0) { 1004aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 10056f0ba88be018dee5feb08e7b125b10b633bb000cnet[shemminger]!shemminger if (parse_selector(&argc, &argv, &sel.sel, n)) { 1006aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "Illegal \"match\"\n"); 1007aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 1008aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 1009aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger sel_ok++; 1010aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger continue; 1011aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (matches(*argv, "offset") == 0) { 1012aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 1013aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (parse_offset(&argc, &argv, &sel.sel)) { 1014aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "Illegal \"offset\"\n"); 1015aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 1016aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 1017aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger continue; 1018aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (matches(*argv, "hashkey") == 0) { 1019aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 1020aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (parse_hashkey(&argc, &argv, &sel.sel)) { 1021aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "Illegal \"hashkey\"\n"); 1022aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 1023aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 1024aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger continue; 1025aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (matches(*argv, "classid") == 0 || 1026aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger strcmp(*argv, "flowid") == 0) { 1027aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger unsigned handle; 1028aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 1029aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (get_tc_classid(&handle, *argv)) { 1030aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "Illegal \"classid\"\n"); 1031aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 1032aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 10332373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger addattr_l(n, MAX_MSG, TCA_U32_CLASSID, &handle, 4); 1034aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger sel.sel.flags |= TC_U32_TERMINAL; 1035aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (matches(*argv, "divisor") == 0) { 1036aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger unsigned divisor; 1037aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 1038ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger if (get_unsigned(&divisor, *argv, 0) || 103946b67dab264f424b0e9c59f7b5b7283623c679cdshemminger divisor == 0 || 104046b67dab264f424b0e9c59f7b5b7283623c679cdshemminger divisor > 0x100 || ((divisor - 1) & divisor)) { 1041aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "Illegal \"divisor\"\n"); 1042aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 1043aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 10442373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger addattr_l(n, MAX_MSG, TCA_U32_DIVISOR, &divisor, 4); 1045aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (matches(*argv, "order") == 0) { 1046aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 1047aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (get_u32(&order, *argv, 0)) { 1048aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "Illegal \"order\"\n"); 1049aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 1050aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 1051aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (strcmp(*argv, "link") == 0) { 1052aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger unsigned handle; 1053aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 1054aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (get_u32_handle(&handle, *argv)) { 1055aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "Illegal \"link\"\n"); 1056aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 1057aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 1058aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (handle && TC_U32_NODE(handle)) { 1059aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "\"link\" must be a hash table.\n"); 1060aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 1061aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 10622373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger addattr_l(n, MAX_MSG, TCA_U32_LINK, &handle, 4); 1063aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (strcmp(*argv, "ht") == 0) { 1064aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger unsigned handle; 1065aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 1066aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (get_u32_handle(&handle, *argv)) { 1067aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "Illegal \"ht\"\n"); 1068aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 1069aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 1070aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (handle && TC_U32_NODE(handle)) { 1071aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "\"ht\" must be a hash table.\n"); 1072aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 1073aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 1074aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (sample_ok) 1075aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger htid = (htid&0xFF000)|(handle&0xFFF00000); 1076aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else 1077aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger htid = (handle&0xFFFFF000); 1078aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (strcmp(*argv, "sample") == 0) { 1079aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger __u32 hash; 10803925ad811940c391dee973dd2f842c7b322556efshemminger unsigned divisor = 0x100; 1081267480f55383cb9f7ddf82412814d3147510df01shemminger 1082aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger struct { 1083aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger struct tc_u32_sel sel; 1084aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger struct tc_u32_key keys[4]; 1085aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } sel2; 108646b67dab264f424b0e9c59f7b5b7283623c679cdshemminger memset(&sel2, 0, sizeof(sel2)); 1087aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 10886f0ba88be018dee5feb08e7b125b10b633bb000cnet[shemminger]!shemminger if (parse_selector(&argc, &argv, &sel2.sel, n)) { 1089aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "Illegal \"sample\"\n"); 1090aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 1091aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 1092aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (sel2.sel.nkeys != 1) { 1093e62077d0b663fdbb8a34bedbe396c976e1db1177Stephen Hemminger fprintf(stderr, "\"sample\" must contain" 1094e62077d0b663fdbb8a34bedbe396c976e1db1177Stephen Hemminger " exactly ONE key.\n"); 1095aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 1096aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 10973925ad811940c391dee973dd2f842c7b322556efshemminger if (*argv != 0 && strcmp(*argv, "divisor") == 0) { 10983925ad811940c391dee973dd2f842c7b322556efshemminger NEXT_ARG(); 10993925ad811940c391dee973dd2f842c7b322556efshemminger if (get_unsigned(&divisor, *argv, 0) || divisor == 0 || 110046b67dab264f424b0e9c59f7b5b7283623c679cdshemminger divisor > 0x100 || ((divisor - 1) & divisor)) { 11013925ad811940c391dee973dd2f842c7b322556efshemminger fprintf(stderr, "Illegal sample \"divisor\"\n"); 11023925ad811940c391dee973dd2f842c7b322556efshemminger return -1; 11033925ad811940c391dee973dd2f842c7b322556efshemminger } 11043925ad811940c391dee973dd2f842c7b322556efshemminger NEXT_ARG(); 11053925ad811940c391dee973dd2f842c7b322556efshemminger } 1106aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger hash = sel2.sel.keys[0].val&sel2.sel.keys[0].mask; 1107267480f55383cb9f7ddf82412814d3147510df01shemminger hash ^= hash>>16; 1108267480f55383cb9f7ddf82412814d3147510df01shemminger hash ^= hash>>8; 11093925ad811940c391dee973dd2f842c7b322556efshemminger htid = ((hash%divisor)<<12)|(htid&0xFFF00000); 1110aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger sample_ok = 1; 1111aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger continue; 11122373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger } else if (strcmp(*argv, "indev") == 0) { 11132373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger char ind[IFNAMSIZ + 1]; 11142373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger memset(ind, 0, sizeof (ind)); 11152373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger argc--; 11162373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger argv++; 11172373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger if (argc < 1) { 11182373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger fprintf(stderr, "Illegal indev\n"); 11192373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger return -1; 11202373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger } 11212373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger strncpy(ind, *argv, sizeof (ind) - 1); 11222373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger addattr_l(n, MAX_MSG, TCA_U32_INDEV, ind, strlen(ind) + 1); 1123d81b135b6f659900c0a51ca1a733c165e49aaaecnet[shemminger]!shemminger 11242373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger } else if (matches(*argv, "action") == 0) { 11252373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger NEXT_ARG(); 11262373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger if (parse_action(&argc, &argv, TCA_U32_ACT, n)) { 11272373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger fprintf(stderr, "Illegal \"action\"\n"); 11282373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger return -1; 11292373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger } 1130dcf13497228742af3290ce6039e821d9c5ed5945jamal terminal_ok++; 11312373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger continue; 1132d81b135b6f659900c0a51ca1a733c165e49aaaecnet[shemminger]!shemminger 1133aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (matches(*argv, "police") == 0) { 1134aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 1135aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (parse_police(&argc, &argv, TCA_U32_POLICE, n)) { 1136aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "Illegal \"police\"\n"); 1137aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 1138aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 1139dcf13497228742af3290ce6039e821d9c5ed5945jamal terminal_ok++; 1140aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger continue; 1141aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (strcmp(*argv, "help") == 0) { 1142aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger explain(); 1143aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 1144aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else { 1145aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "What is \"%s\"?\n", *argv); 1146aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger explain(); 1147aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 1148aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 1149aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger argc--; argv++; 1150aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 1151aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 1152dcf13497228742af3290ce6039e821d9c5ed5945jamal /* We dont necessarily need class/flowids */ 115381c61790d5927dc6ca168b2183000a3efc7bc493Stephen Hemminger if (terminal_ok) 1154dcf13497228742af3290ce6039e821d9c5ed5945jamal sel.sel.flags |= TC_U32_TERMINAL; 1155dcf13497228742af3290ce6039e821d9c5ed5945jamal 1156aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (order) { 1157aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (TC_U32_NODE(t->tcm_handle) && order != TC_U32_NODE(t->tcm_handle)) { 1158aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "\"order\" contradicts \"handle\"\n"); 1159aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 1160aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 1161aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger t->tcm_handle |= order; 1162aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 1163aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 1164aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (htid) 11652373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger addattr_l(n, MAX_MSG, TCA_U32_HASH, &htid, 4); 1166aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (sel_ok) 1167e62077d0b663fdbb8a34bedbe396c976e1db1177Stephen Hemminger addattr_l(n, MAX_MSG, TCA_U32_SEL, &sel, 1168e62077d0b663fdbb8a34bedbe396c976e1db1177Stephen Hemminger sizeof(sel.sel)+sel.sel.nkeys*sizeof(struct tc_u32_key)); 11694a86fe19bc7f125d3eb40366277f87da4cda78ddvoid *) NLMSG_TAIL(n) - (void *) tail; tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail; 1170aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 1171aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 1172aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 11736b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemmingerstatic int u32_print_opt(struct filter_util *qu, FILE *f, struct rtattr *opt, 11746b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger __u32 handle) 1175aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 1176aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger struct rtattr *tb[TCA_U32_MAX+1]; 1177aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger struct tc_u32_sel *sel = NULL; 1178d81b135b6f659900c0a51ca1a733c165e49aaaecnet[shemminger]!shemminger struct tc_u32_pcnt *pf = NULL; 1179aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 1180aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (opt == NULL) 1181aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 1182aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 1183ac2fc2df5e117f6bf20d823f4bf1d9390ffbedf4tb, TCA_U parse_rtattr_nested(tb, TCA_U32_MAX, opt); 1184aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 1185aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (handle) { 1186aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger SPRINT_BUF(b1); 1187aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(f, "fh %s ", sprint_u32_handle(handle, b1)); 1188aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 1189aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (TC_U32_NODE(handle)) { 1190aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(f, "order %d ", TC_U32_NODE(handle)); 1191aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 1192aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 1193aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (tb[TCA_U32_SEL]) { 1194aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (RTA_PAYLOAD(tb[TCA_U32_SEL]) < sizeof(*sel)) 1195aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 1196aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 1197aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger sel = RTA_DATA(tb[TCA_U32_SEL]); 1198aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 1199aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 1200aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (tb[TCA_U32_DIVISOR]) { 1201ff24746cca1ef0c92d46614158e6672acd6b63d3Stephen Hemminger fprintf(f, "ht divisor %d ", rta_getattr_u32(tb[TCA_U32_DIVISOR])); 1202aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (tb[TCA_U32_HASH]) { 1203ff24746cca1ef0c92d46614158e6672acd6b63d3Stephen Hemminger __u32 htid = rta_getattr_u32(tb[TCA_U32_HASH]); 1204e62077d0b663fdbb8a34bedbe396c976e1db1177Stephen Hemminger fprintf(f, "key ht %x bkt %x ", TC_U32_USERHTID(htid), 1205e62077d0b663fdbb8a34bedbe396c976e1db1177Stephen Hemminger TC_U32_HASH(htid)); 1206aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else { 1207aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(f, "??? "); 1208aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 1209aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (tb[TCA_U32_CLASSID]) { 1210aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger SPRINT_BUF(b1); 1211aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(f, "%sflowid %s ", 1212aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger !sel || !(sel->flags&TC_U32_TERMINAL) ? "*" : "", 1213ff24746cca1ef0c92d46614158e6672acd6b63d3Stephen Hemminger sprint_tc_classid(rta_getattr_u32(tb[TCA_U32_CLASSID]), b1)); 1214aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (sel && sel->flags&TC_U32_TERMINAL) { 1215aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(f, "terminal flowid ??? "); 1216aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 1217aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (tb[TCA_U32_LINK]) { 1218aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger SPRINT_BUF(b1); 1219e62077d0b663fdbb8a34bedbe396c976e1db1177Stephen Hemminger fprintf(f, "link %s ", 1220ff24746cca1ef0c92d46614158e6672acd6b63d3Stephen Hemminger sprint_u32_handle(rta_getattr_u32(tb[TCA_U32_LINK]), b1)); 1221aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 12222373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger 1223d81b135b6f659900c0a51ca1a733c165e49aaaecnet[shemminger]!shemminger if (tb[TCA_U32_PCNT]) { 1224d81b135b6f659900c0a51ca1a733c165e49aaaecnet[shemminger]!shemminger if (RTA_PAYLOAD(tb[TCA_U32_PCNT]) < sizeof(*pf)) { 1225d81b135b6f659900c0a51ca1a733c165e49aaaecnet[shemminger]!shemminger fprintf(f, "Broken perf counters \n"); 1226d81b135b6f659900c0a51ca1a733c165e49aaaecnet[shemminger]!shemminger return -1; 1227d81b135b6f659900c0a51ca1a733c165e49aaaecnet[shemminger]!shemminger } 1228d81b135b6f659900c0a51ca1a733c165e49aaaecnet[shemminger]!shemminger pf = RTA_DATA(tb[TCA_U32_PCNT]); 1229d81b135b6f659900c0a51ca1a733c165e49aaaecnet[shemminger]!shemminger } 1230aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 12316f0ba88be018dee5feb08e7b125b10b633bb000cnet[shemminger]!shemminger if (sel && show_stats && NULL != pf) 1232b906243b62c832f24473de3ead7d7feef0e75e4bnet[shemminger]!shemminger fprintf(f, " (rule hit %llu success %llu)", 1233b906243b62c832f24473de3ead7d7feef0e75e4bnet[shemminger]!shemminger (unsigned long long) pf->rcnt, 1234b906243b62c832f24473de3ead7d7feef0e75e4bnet[shemminger]!shemminger (unsigned long long) pf->rhit); 12356f0ba88be018dee5feb08e7b125b10b633bb000cnet[shemminger]!shemminger 12366f0ba88be018dee5feb08e7b125b10b633bb000cnet[shemminger]!shemminger if (tb[TCA_U32_MARK]) { 12376f0ba88be018dee5feb08e7b125b10b633bb000cnet[shemminger]!shemminger struct tc_u32_mark *mark = RTA_DATA(tb[TCA_U32_MARK]); 12386f0ba88be018dee5feb08e7b125b10b633bb000cnet[shemminger]!shemminger if (RTA_PAYLOAD(tb[TCA_U32_MARK]) < sizeof(*mark)) { 12396f0ba88be018dee5feb08e7b125b10b633bb000cnet[shemminger]!shemminger fprintf(f, "\n Invalid mark (kernel&iproute2 mismatch)\n"); 12406f0ba88be018dee5feb08e7b125b10b633bb000cnet[shemminger]!shemminger } else { 12416f0ba88be018dee5feb08e7b125b10b633bb000cnet[shemminger]!shemminger fprintf(f, "\n mark 0x%04x 0x%04x (success %d)", 12426f0ba88be018dee5feb08e7b125b10b633bb000cnet[shemminger]!shemminger mark->val, mark->mask, mark->success); 12436f0ba88be018dee5feb08e7b125b10b633bb000cnet[shemminger]!shemminger } 12446f0ba88be018dee5feb08e7b125b10b633bb000cnet[shemminger]!shemminger } 12456f0ba88be018dee5feb08e7b125b10b633bb000cnet[shemminger]!shemminger 1246aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (sel) { 1247aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (sel->nkeys) { 12486b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger int i; 12496b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger for (i=0; i<sel->nkeys; i++) { 12501750abe2ba8b695aa39a67cff8ac44b2fb6a2a3djamal show_keys(f, sel->keys + i); 1251d81b135b6f659900c0a51ca1a733c165e49aaaecnet[shemminger]!shemminger if (show_stats && NULL != pf) 12526b1ac654e9364ad279d3c82d8a3ef93efa9f3dfaStephen Hemminger fprintf(f, " (success %llu ) ", 1253b906243b62c832f24473de3ead7d7feef0e75e4bnet[shemminger]!shemminger (unsigned long long) pf->kcnts[i]); 12542373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger } 1255aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 1256aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 1257aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (sel->flags&(TC_U32_VAROFFSET|TC_U32_OFFSET)) { 1258aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(f, "\n offset "); 1259aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (sel->flags&TC_U32_VAROFFSET) 1260e62077d0b663fdbb8a34bedbe396c976e1db1177Stephen Hemminger fprintf(f, "%04x>>%d at %d ", 1261e62077d0b663fdbb8a34bedbe396c976e1db1177Stephen Hemminger ntohs(sel->offmask), 1262e62077d0b663fdbb8a34bedbe396c976e1db1177Stephen Hemminger sel->offshift, sel->offoff); 1263aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (sel->off) 1264aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(f, "plus %d ", sel->off); 1265aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 1266aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (sel->flags&TC_U32_EAT) 1267aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(f, " eat "); 1268aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 1269aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (sel->hmask) { 1270aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(f, "\n hash mask %08x at %d ", 1271aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger (unsigned int)htonl(sel->hmask), sel->hoff); 1272aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 1273aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 1274aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 12752373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger if (tb[TCA_U32_POLICE]) { 12762373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger fprintf(f, "\n"); 12772373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger tc_print_police(f, tb[TCA_U32_POLICE]); 12782373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger } 12792373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger if (tb[TCA_U32_INDEV]) { 12802373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger struct rtattr *idev = tb[TCA_U32_INDEV]; 1281ff24746cca1ef0c92d46614158e6672acd6b63d3Stephen Hemminger fprintf(f, "\n input dev %s\n", rta_getattr_str(idev)); 12822373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger } 12832373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger if (tb[TCA_U32_ACT]) { 12842373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger tc_print_action(f, tb[TCA_U32_ACT]); 12852373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger } 12862373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger 1287aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 1288aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 1289aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 12906b7dff17f6f97ce80cd260920267aee68f15582bosdl.net!shemmingerstruct filter_util u32_filter_util = { 12916b7dff17f6f97ce80cd260920267aee68f15582bosdl.net!shemminger .id = "u32", 12926b7dff17f6f97ce80cd260920267aee68f15582bosdl.net!shemminger .parse_fopt = u32_parse_opt, 12936b7dff17f6f97ce80cd260920267aee68f15582bosdl.net!shemminger .print_fopt = u32_print_opt, 1294aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}; 1295