1dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat/* 2dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * m_pedit.c packet editor: IPV4/6 header 3dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * 4dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * This program is free software; you can distribute it and/or 5dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * modify it under the terms of the GNU General Public License 6dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * as published by the Free Software Foundation; either version 7dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * 2 of the License, or (at your option) any later version. 8dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * 9dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * Authors: J Hadi Salim (hadi@cyberus.ca) 10dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * 11dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat */ 12dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 13dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <stdio.h> 14dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <stdlib.h> 15dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <unistd.h> 16dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <syslog.h> 17dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <fcntl.h> 18dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <sys/socket.h> 19dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <netinet/in.h> 20dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <arpa/inet.h> 21dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <string.h> 22dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include "utils.h" 23dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include "tc_util.h" 24dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include "m_pedit.h" 25dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 26dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstatic int 27dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatparse_ip(int *argc_p, char ***argv_p,struct tc_pedit_sel *sel,struct tc_pedit_key *tkey) 28dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{ 29dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat int res = -1; 30dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat int argc = *argc_p; 31dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat char **argv = *argv_p; 32dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 33dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (argc < 2) 34dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 35dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 36dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (strcmp(*argv, "src") == 0) { 37dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 38dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat tkey->off = 12; 39dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat res = parse_cmd(&argc, &argv, 4, TIPV4,RU32,sel,tkey); 40dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat goto done; 41dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 42dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (strcmp(*argv, "dst") == 0) { 43dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 44dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat tkey->off = 16; 45dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat res = parse_cmd(&argc, &argv, 4, TIPV4,RU32,sel,tkey); 46dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat goto done; 47dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 48dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat /* jamal - look at these and make them either old or new 49dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat ** scheme given diffserv 50dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat ** dont forget the CE bit 51dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat */ 52dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (strcmp(*argv, "tos") == 0 || matches(*argv, "dsfield") == 0) { 53dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 54dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat tkey->off = 1; 55dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat res = parse_cmd(&argc, &argv, 1, TU32,RU8,sel,tkey); 56dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat goto done; 57dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 58dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (strcmp(*argv, "ihl") == 0) { 59dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 60dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat tkey->off = 0; 61dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat res = parse_cmd(&argc, &argv, 1, TU32,RU8,sel,tkey); 62dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat goto done; 63dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 64dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (strcmp(*argv, "protocol") == 0) { 65dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 66dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat tkey->off = 9; 67dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat res = parse_cmd(&argc, &argv, 1, TU32,RU8,sel,tkey); 68dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat goto done; 69dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 70dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat /* jamal - fix this */ 71dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (matches(*argv, "precedence") == 0) { 72dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 73dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat tkey->off = 1; 74dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat res = parse_cmd(&argc, &argv, 1, TU32,RU8,sel,tkey); 75dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat goto done; 76dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 77dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat /* jamal - validate this at some point */ 78dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (strcmp(*argv, "nofrag") == 0) { 79dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 80dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat tkey->off = 6; 81dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat res = parse_cmd(&argc, &argv, 1, TU32,0x3F,sel,tkey); 82dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat goto done; 83dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 84dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat /* jamal - validate this at some point */ 85dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (strcmp(*argv, "firstfrag") == 0) { 86dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 87dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat tkey->off = 6; 88dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat res = parse_cmd(&argc, &argv, 1, TU32,0x1F,sel,tkey); 89dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat goto done; 90dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 91dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (strcmp(*argv, "ce") == 0) { 92dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 93dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat tkey->off = 6; 94dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat res = parse_cmd(&argc, &argv, 1, TU32,0x80,sel,tkey); 95dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat goto done; 96dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 97dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (strcmp(*argv, "df") == 0) { 98dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 99dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat tkey->off = 6; 100dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat res = parse_cmd(&argc, &argv, 1, TU32,0x40,sel,tkey); 101dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat goto done; 102dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 103dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (strcmp(*argv, "mf") == 0) { 104dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 105dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat tkey->off = 6; 106dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat res = parse_cmd(&argc, &argv, 1, TU32,0x20,sel,tkey); 107dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat goto done; 108dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 109dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (strcmp(*argv, "dport") == 0) { 110dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 111dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat tkey->off = 22; 112dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat res = parse_cmd(&argc, &argv, 2, TU32,RU16,sel,tkey); 113dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat goto done; 114dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 115dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (strcmp(*argv, "sport") == 0) { 116dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 117dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat tkey->off = 20; 118dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat res = parse_cmd(&argc, &argv, 2, TU32,RU16,sel,tkey); 119dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat goto done; 120dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 121dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (strcmp(*argv, "icmp_type") == 0) { 122dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 123dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat tkey->off = 20; 124dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat res = parse_cmd(&argc, &argv, 1, TU32,RU8,sel,tkey); 125dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat goto done; 126dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 127dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (strcmp(*argv, "icmp_code") == 0) { 128dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 129dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat tkey->off = 20; 130dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat res = parse_cmd(&argc, &argv, 1, TU32,RU8,sel,tkey); 131dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat goto done; 132dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 133dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 134dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 135dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat done: 136dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat *argc_p = argc; 137dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat *argv_p = argv; 138dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return res; 139dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat} 140dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 141dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstatic int 142dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatparse_ip6(int *argc_p, char ***argv_p,struct tc_pedit_sel *sel,struct tc_pedit_key *tkey) 143dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{ 144dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat int res = -1; 145dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return res; 146dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat} 147dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 148dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstruct m_pedit_util p_pedit_ip = { 149dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NULL, 150dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat "ip", 151dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat parse_ip, 152dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat}; 153dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 154dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 155dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstruct m_pedit_util p_pedit_ip6 = { 156dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NULL, 157dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat "ip6", 158dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat parse_ip6, 159dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat}; 160