Deleted Added
full compact
cxgbtool.c (204267) cxgbtool.c (207643)
1/**************************************************************************
2
1/**************************************************************************
2
3Copyright (c) 2007-2009, Chelsio Inc.
3Copyright (c) 2007-2010, Chelsio Inc.
4All rights reserved.
5
6Redistribution and use in source and binary forms, with or without
7modification, are permitted provided that the following conditions are met:
8
9 1. Redistributions of source code must retain the above copyright notice,
10 this list of conditions and the following disclaimer.
11

--- 15 unchanged lines hidden (view full) ---

27INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30POSSIBILITY OF SUCH DAMAGE.
31
32
33***************************************************************************/
34#include <sys/cdefs.h>
4All rights reserved.
5
6Redistribution and use in source and binary forms, with or without
7modification, are permitted provided that the following conditions are met:
8
9 1. Redistributions of source code must retain the above copyright notice,
10 this list of conditions and the following disclaimer.
11

--- 15 unchanged lines hidden (view full) ---

27INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30POSSIBILITY OF SUCH DAMAGE.
31
32
33***************************************************************************/
34#include <sys/cdefs.h>
35__FBSDID("$FreeBSD: head/usr.sbin/cxgbtool/cxgbtool.c 204267 2010-02-23 23:01:41Z np $");
35__FBSDID("$FreeBSD: head/usr.sbin/cxgbtool/cxgbtool.c 207643 2010-05-05 00:41:40Z np $");
36
37#include <stdlib.h>
38#include <stdio.h>
39#include <stdint.h>
40#include <string.h>
41#include <unistd.h>
42#include <fcntl.h>
43#include <err.h>

--- 44 unchanged lines hidden (view full) ---

88static void
89usage(FILE *fp)
90{
91 fprintf(fp, "Usage: %s <interface> [operation]\n", progname);
92 fprintf(fp,
93 "\tclearstats clear MAC statistics\n"
94 "\tcontext <type> <id> show an SGE context\n"
95 "\tdesc <qset> <queue> <idx> [<cnt>] dump SGE descriptors\n"
36
37#include <stdlib.h>
38#include <stdio.h>
39#include <stdint.h>
40#include <string.h>
41#include <unistd.h>
42#include <fcntl.h>
43#include <err.h>

--- 44 unchanged lines hidden (view full) ---

88static void
89usage(FILE *fp)
90{
91 fprintf(fp, "Usage: %s <interface> [operation]\n", progname);
92 fprintf(fp,
93 "\tclearstats clear MAC statistics\n"
94 "\tcontext <type> <id> show an SGE context\n"
95 "\tdesc <qset> <queue> <idx> [<cnt>] dump SGE descriptors\n"
96 "\tfilter <idx> [<param> <val>] ... set a filter\n"
97 "\tfilter <idx> delete|clear delete a filter\n"
98 "\tfilter list list all filters\n"
96 "\tioqs dump uP IOQs\n"
97 "\tla dump uP logic analyzer info\n"
98 "\tloadboot <boot image> download boot image\n"
99 "\tloadfw <FW image> download firmware\n"
100 "\tmdio <phy_addr> <mmd_addr>\n"
101 "\t <reg_addr> [<val>] read/write MDIO register\n"
102 "\tmemdump cm|tx|rx <addr> <len> dump a mem range\n"
103 "\tmeminfo show memory info\n"

--- 1068 unchanged lines hidden (view full) ---

1172 }
1173 return 0;
1174}
1175
1176/*
1177 * Parse a string containing a value and an optional colon separated mask.
1178 */
1179static int
99 "\tioqs dump uP IOQs\n"
100 "\tla dump uP logic analyzer info\n"
101 "\tloadboot <boot image> download boot image\n"
102 "\tloadfw <FW image> download firmware\n"
103 "\tmdio <phy_addr> <mmd_addr>\n"
104 "\t <reg_addr> [<val>] read/write MDIO register\n"
105 "\tmemdump cm|tx|rx <addr> <len> dump a mem range\n"
106 "\tmeminfo show memory info\n"

--- 1068 unchanged lines hidden (view full) ---

1175 }
1176 return 0;
1177}
1178
1179/*
1180 * Parse a string containing a value and an optional colon separated mask.
1181 */
1182static int
1180parse_val_mask_param(const char *s, uint32_t *val, uint32_t *mask)
1183parse_val_mask_param(const char *s, uint32_t *val, uint32_t *mask,
1184 uint32_t default_mask)
1181{
1182 char *p;
1183
1185{
1186 char *p;
1187
1184 *mask = 0xffffffffU;
1188 *mask = default_mask;
1185 *val = strtoul(s, &p, 0);
1189 *val = strtoul(s, &p, 0);
1186 if (p == s)
1190 if (p == s || *val > default_mask)
1187 return -1;
1188 if (*p == ':' && p[1])
1189 *mask = strtoul(p + 1, &p, 0);
1191 return -1;
1192 if (*p == ':' && p[1])
1193 *mask = strtoul(p + 1, &p, 0);
1190 return *p ? -1 : 0;
1194 return *p || *mask > default_mask ? -1 : 0;
1191}
1192
1193static int
1194parse_trace_param(const char *s, uint32_t *val, uint32_t *mask)
1195{
1196 return strchr(s, '.') ? parse_ipaddr(s, val, mask) :
1195}
1196
1197static int
1198parse_trace_param(const char *s, uint32_t *val, uint32_t *mask)
1199{
1200 return strchr(s, '.') ? parse_ipaddr(s, val, mask) :
1197 parse_val_mask_param(s, val, mask);
1201 parse_val_mask_param(s, val, mask, 0xffffffffU);
1198}
1199
1200static int
1201trace_config(int argc, char *argv[], int start_arg, const char *iff_name)
1202{
1203 uint32_t val, mask;
1204 struct ch_trace trace;
1205

--- 62 unchanged lines hidden (view full) ---

1268 if (start_arg != argc)
1269 errx(1, "unknown parameter \"%s\"", argv[start_arg]);
1270
1271 if (doit(iff_name, CHELSIO_SET_TRACE_FILTER, &trace) < 0)
1272 err(1, "trace");
1273 return 0;
1274}
1275
1202}
1203
1204static int
1205trace_config(int argc, char *argv[], int start_arg, const char *iff_name)
1206{
1207 uint32_t val, mask;
1208 struct ch_trace trace;
1209

--- 62 unchanged lines hidden (view full) ---

1272 if (start_arg != argc)
1273 errx(1, "unknown parameter \"%s\"", argv[start_arg]);
1274
1275 if (doit(iff_name, CHELSIO_SET_TRACE_FILTER, &trace) < 0)
1276 err(1, "trace");
1277 return 0;
1278}
1279
1280static void
1281show_filters(const char *iff_name)
1282{
1283 static const char *pkt_type[] = { "*", "tcp", "udp", "frag" };
1284 struct ch_filter op;
1285 union {
1286 uint32_t nip;
1287 uint8_t octet[4];
1288 } nsip, ndip;
1289 char sip[20], dip[20];
1290 int header = 0;
1291
1292 bzero(&op, sizeof(op));
1293 op.filter_id = 0xffffffff;
1294
1295 do {
1296 if (doit(iff_name, CHELSIO_GET_FILTER, &op) < 0)
1297 err(1, "list filters");
1298
1299 if (op.filter_id == 0xffffffff)
1300 break;
1301
1302 if (!header) {
1303 printf("index SIP DIP sport "
1304 "dport VLAN PRI P/MAC type Q\n");
1305 header = 1;
1306 }
1307
1308 nsip.nip = htonl(op.val.sip);
1309 ndip.nip = htonl(op.val.dip);
1310
1311 sprintf(sip, "%u.%u.%u.%u/%-2u", nsip.octet[0], nsip.octet[1],
1312 nsip.octet[2], nsip.octet[3],
1313 op.mask.sip ? 33 - ffs(op.mask.sip) : 0);
1314 sprintf(dip, "%u.%u.%u.%u", ndip.octet[0], ndip.octet[1],
1315 ndip.octet[2], ndip.octet[3]);
1316 printf("%5zu %18s %15s ", (size_t)op.filter_id, sip, dip);
1317 printf(op.val.sport ? "%5u " : " * ", op.val.sport);
1318 printf(op.val.dport ? "%5u " : " * ", op.val.dport);
1319 printf(op.val.vlan != 0xfff ? "%4u " : " * ", op.val.vlan);
1320 printf(op.val.vlan_prio == 7 ? " * " :
1321 "%1u/%1u ", op.val.vlan_prio, op.val.vlan_prio | 1);
1322 if (op.mac_addr_idx == 0xffff)
1323 printf("*/* ");
1324 else if (op.mac_hit)
1325 printf("%1u/%3u ", (op.mac_addr_idx >> 3) & 0x1,
1326 (op.mac_addr_idx) & 0x7);
1327 else
1328 printf("%1u/ * ", (op.mac_addr_idx >> 3) & 0x1);
1329 printf("%4s ", pkt_type[op.proto]);
1330 if (!op.pass)
1331 printf("-\n");
1332 else if (op.rss)
1333 printf("*\n");
1334 else
1335 printf("%1u\n", op.qset);
1336 } while (1);
1337}
1338
1276static int
1339static int
1340filter_config(int argc, char *argv[], int start_arg, const char *iff_name)
1341{
1342 int ret = 0;
1343 uint32_t val, mask;
1344 struct ch_filter op;
1345
1346 if (argc < start_arg + 1)
1347 return -1;
1348
1349 memset(&op, 0, sizeof(op));
1350 op.mac_addr_idx = 0xffff;
1351 op.rss = 1;
1352
1353 if (argc == start_arg + 1 && !strcmp(argv[start_arg], "list")) {
1354 show_filters(iff_name);
1355 return 0;
1356 }
1357
1358 if (get_int_arg(argv[start_arg++], &op.filter_id))
1359 return -1;
1360 if (argc == start_arg + 1 && (!strcmp(argv[start_arg], "delete") ||
1361 !strcmp(argv[start_arg], "clear"))) {
1362 if (doit(iff_name, CHELSIO_DEL_FILTER, &op) < 0) {
1363 if (errno == EBUSY)
1364 err(1, "no filter support when offload in use");
1365 err(1, "delete filter");
1366 }
1367 return 0;
1368 }
1369
1370 while (start_arg + 2 <= argc) {
1371 if (!strcmp(argv[start_arg], "sip")) {
1372 ret = parse_ipaddr(argv[start_arg + 1], &op.val.sip,
1373 &op.mask.sip);
1374 } else if (!strcmp(argv[start_arg], "dip")) {
1375 ret = parse_ipaddr(argv[start_arg + 1], &op.val.dip,
1376 &op.mask.dip);
1377 } else if (!strcmp(argv[start_arg], "sport")) {
1378 ret = parse_val_mask_param(argv[start_arg + 1],
1379 &val, &mask, 0xffff);
1380 op.val.sport = val;
1381 op.mask.sport = mask;
1382 } else if (!strcmp(argv[start_arg], "dport")) {
1383 ret = parse_val_mask_param(argv[start_arg + 1],
1384 &val, &mask, 0xffff);
1385 op.val.dport = val;
1386 op.mask.dport = mask;
1387 } else if (!strcmp(argv[start_arg], "vlan")) {
1388 ret = parse_val_mask_param(argv[start_arg + 1],
1389 &val, &mask, 0xfff);
1390 op.val.vlan = val;
1391 op.mask.vlan = mask;
1392 } else if (!strcmp(argv[start_arg], "prio")) {
1393 ret = parse_val_mask_param(argv[start_arg + 1],
1394 &val, &mask, 7);
1395 op.val.vlan_prio = val;
1396 op.mask.vlan_prio = mask;
1397 } else if (!strcmp(argv[start_arg], "mac")) {
1398 if (!strcmp(argv[start_arg + 1], "none"))
1399 val = -1;
1400 else
1401 ret = get_int_arg(argv[start_arg + 1], &val);
1402 op.mac_hit = val != (uint32_t)-1;
1403 op.mac_addr_idx = op.mac_hit ? val : 0;
1404 } else if (!strcmp(argv[start_arg], "type")) {
1405 if (!strcmp(argv[start_arg + 1], "tcp"))
1406 op.proto = 1;
1407 else if (!strcmp(argv[start_arg + 1], "udp"))
1408 op.proto = 2;
1409 else if (!strcmp(argv[start_arg + 1], "frag"))
1410 op.proto = 3;
1411 else
1412 errx(1, "unknown type \"%s\"; must be one of "
1413 "\"tcp\", \"udp\", or \"frag\"",
1414 argv[start_arg + 1]);
1415 } else if (!strcmp(argv[start_arg], "queue")) {
1416 ret = get_int_arg(argv[start_arg + 1], &val);
1417 op.qset = val;
1418 op.rss = 0;
1419 } else if (!strcmp(argv[start_arg], "action")) {
1420 if (!strcmp(argv[start_arg + 1], "pass"))
1421 op.pass = 1;
1422 else if (strcmp(argv[start_arg + 1], "drop"))
1423 errx(1, "unknown action \"%s\"; must be one of "
1424 "\"pass\" or \"drop\"",
1425 argv[start_arg + 1]);
1426 } else
1427 errx(1, "unknown filter parameter \"%s\"\n"
1428 "known parameters are \"mac\", \"sip\", "
1429 "\"dip\", \"sport\", \"dport\", \"vlan\", "
1430 "\"prio\", \"type\", \"queue\", and \"action\"",
1431 argv[start_arg]);
1432 if (ret < 0)
1433 errx(1, "bad value \"%s\" for parameter \"%s\"",
1434 argv[start_arg + 1], argv[start_arg]);
1435 start_arg += 2;
1436 }
1437 if (start_arg != argc)
1438 errx(1, "no value for \"%s\"", argv[start_arg]);
1439
1440 if (doit(iff_name, CHELSIO_SET_FILTER, &op) < 0) {
1441 if (errno == EBUSY)
1442 err(1, "no filter support when offload in use");
1443 err(1, "set filter");
1444 }
1445
1446 return 0;
1447}
1448static int
1277get_sched_param(int argc, char *argv[], int pos, unsigned int *valp)
1278{
1279 if (pos + 1 >= argc)
1280 errx(1, "missing value for %s", argv[pos]);
1281 if (get_int_arg(argv[pos + 1], valp))
1282 exit(1);
1283 return 0;
1284}

--- 211 unchanged lines hidden (view full) ---

1496 else if (!strcmp(argv[2], "qsets"))
1497 r = qset_num_config(argc, argv, 3, iff_name);
1498 else if (!strcmp(argv[2], "trace"))
1499 r = trace_config(argc, argv, 3, iff_name);
1500 else if (!strcmp(argv[2], "pktsched"))
1501 r = pktsched(argc, argv, 3, iff_name);
1502 else if (!strcmp(argv[2], "tcb"))
1503 r = get_tcb2(argc, argv, 3, iff_name);
1449get_sched_param(int argc, char *argv[], int pos, unsigned int *valp)
1450{
1451 if (pos + 1 >= argc)
1452 errx(1, "missing value for %s", argv[pos]);
1453 if (get_int_arg(argv[pos + 1], valp))
1454 exit(1);
1455 return 0;
1456}

--- 211 unchanged lines hidden (view full) ---

1668 else if (!strcmp(argv[2], "qsets"))
1669 r = qset_num_config(argc, argv, 3, iff_name);
1670 else if (!strcmp(argv[2], "trace"))
1671 r = trace_config(argc, argv, 3, iff_name);
1672 else if (!strcmp(argv[2], "pktsched"))
1673 r = pktsched(argc, argv, 3, iff_name);
1674 else if (!strcmp(argv[2], "tcb"))
1675 r = get_tcb2(argc, argv, 3, iff_name);
1676 else if (!strcmp(argv[2], "filter"))
1677 r = filter_config(argc, argv, 3, iff_name);
1504 else if (!strcmp(argv[2], "clearstats"))
1505 r = clear_stats(argc, argv, 3, iff_name);
1506 else if (!strcmp(argv[2], "la"))
1507 r = get_up_la(argc, argv, 3, iff_name);
1508 else if (!strcmp(argv[2], "ioqs"))
1509 r = get_up_ioqs(argc, argv, 3, iff_name);
1510
1511 if (r == -1)

--- 83 unchanged lines hidden ---
1678 else if (!strcmp(argv[2], "clearstats"))
1679 r = clear_stats(argc, argv, 3, iff_name);
1680 else if (!strcmp(argv[2], "la"))
1681 r = get_up_la(argc, argv, 3, iff_name);
1682 else if (!strcmp(argv[2], "ioqs"))
1683 r = get_up_ioqs(argc, argv, 3, iff_name);
1684
1685 if (r == -1)

--- 83 unchanged lines hidden ---