1914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend/* 2914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend * q_mqprio.c MQ prio qdisc 3914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend * 4914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend * This program is free software; you can redistribute it and/or 5914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend * modify it under the terms of the GNU General Public License 6914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend * as published by the Free Software Foundation; either version 7914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend * 2 of the License, or (at your option) any later version. 8914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend * 9914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend * Author: John Fastabend, <john.r.fastabend@intel.com> 10914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend */ 11914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend 12914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend#include <stdio.h> 13914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend#include <stdlib.h> 14914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend#include <unistd.h> 15914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend#include <syslog.h> 16914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend#include <fcntl.h> 17914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend#include <sys/socket.h> 18914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend#include <netinet/in.h> 19914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend#include <arpa/inet.h> 20914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend#include <string.h> 21914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend 22914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend#include "utils.h" 23914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend#include "tc_util.h" 24914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend 25914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabendstatic void explain(void) 26914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend{ 27914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend fprintf(stderr, "Usage: ... mqprio [num_tc NUMBER] [map P0 P1 ...]\n"); 28892eba309fab1bad2a15868163c0d10b6ed88592John Fastabend fprintf(stderr, " [queues count1@offset1 count2@offset2 ...] "); 29892eba309fab1bad2a15868163c0d10b6ed88592John Fastabend fprintf(stderr, "[hw 1|0]\n"); 30914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend} 31914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend 32914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabendstatic int mqprio_parse_opt(struct qdisc_util *qu, int argc, 33914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend char **argv, struct nlmsghdr *n) 34914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend{ 35914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend int idx; 36914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend struct tc_mqprio_qopt opt = { 37c4fc474b889aa17ada813018aae6b20030e9c58eStephen Hemminger .num_tc = 8, 38c4fc474b889aa17ada813018aae6b20030e9c58eStephen Hemminger .prio_tc_map = { 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 1, 1, 3, 3, 3, 3 }, 39c4fc474b889aa17ada813018aae6b20030e9c58eStephen Hemminger .hw = 1, 40c4fc474b889aa17ada813018aae6b20030e9c58eStephen Hemminger .count = { }, 41c4fc474b889aa17ada813018aae6b20030e9c58eStephen Hemminger .offset = { }, 42c4fc474b889aa17ada813018aae6b20030e9c58eStephen Hemminger }; 43914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend 44914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend while (argc > 0) { 45914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend idx = 0; 46914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend if (strcmp(*argv, "num_tc") == 0) { 47914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend NEXT_ARG(); 48914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend if (get_u8(&opt.num_tc, *argv, 10)) { 49914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend fprintf(stderr, "Illegal \"num_tc\"\n"); 50914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend return -1; 51914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend } 52914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend } else if (strcmp(*argv, "map") == 0) { 53914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend while (idx < TC_QOPT_MAX_QUEUE && NEXT_ARG_OK()) { 54914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend NEXT_ARG(); 55914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend if (get_u8(&opt.prio_tc_map[idx], *argv, 10)) { 56914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend PREV_ARG(); 57914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend break; 58914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend } 59914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend idx++; 60914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend } 61914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend for ( ; idx < TC_QOPT_MAX_QUEUE; idx++) 62914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend opt.prio_tc_map[idx] = 0; 63892eba309fab1bad2a15868163c0d10b6ed88592John Fastabend } else if (strcmp(*argv, "queues") == 0) { 64892eba309fab1bad2a15868163c0d10b6ed88592John Fastabend char *tmp, *tok; 65892eba309fab1bad2a15868163c0d10b6ed88592John Fastabend 66914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend while (idx < TC_QOPT_MAX_QUEUE && NEXT_ARG_OK()) { 67914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend NEXT_ARG(); 68892eba309fab1bad2a15868163c0d10b6ed88592John Fastabend 69892eba309fab1bad2a15868163c0d10b6ed88592John Fastabend tmp = strdup(*argv); 70892eba309fab1bad2a15868163c0d10b6ed88592John Fastabend if (!tmp) 71892eba309fab1bad2a15868163c0d10b6ed88592John Fastabend break; 72892eba309fab1bad2a15868163c0d10b6ed88592John Fastabend 73892eba309fab1bad2a15868163c0d10b6ed88592John Fastabend tok = strtok(tmp, "@"); 74892eba309fab1bad2a15868163c0d10b6ed88592John Fastabend if (get_u16(&opt.count[idx], tok, 10)) { 75892eba309fab1bad2a15868163c0d10b6ed88592John Fastabend free(tmp); 76914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend PREV_ARG(); 77914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend break; 78914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend } 79892eba309fab1bad2a15868163c0d10b6ed88592John Fastabend tok = strtok(NULL, "@"); 80892eba309fab1bad2a15868163c0d10b6ed88592John Fastabend if (get_u16(&opt.offset[idx], tok, 10)) { 81892eba309fab1bad2a15868163c0d10b6ed88592John Fastabend free(tmp); 82914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend PREV_ARG(); 83914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend break; 84914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend } 85892eba309fab1bad2a15868163c0d10b6ed88592John Fastabend free(tmp); 86914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend idx++; 87914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend } 88914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend } else if (strcmp(*argv, "hw") == 0) { 89914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend NEXT_ARG(); 90914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend if (get_u8(&opt.hw, *argv, 10)) { 91914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend fprintf(stderr, "Illegal \"hw\"\n"); 92914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend return -1; 93914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend } 94914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend idx++; 95914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend } else if (strcmp(*argv, "help") == 0) { 96914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend explain(); 97914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend return -1; 98914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend } else { 99914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend fprintf(stderr, "Unknown argument\n"); 100914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend return -1; 101914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend } 102914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend argc--; argv++; 103914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend } 104914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend 105914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend addattr_l(n, 1024, TCA_OPTIONS, &opt, sizeof(opt)); 106914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend return 0; 107914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend} 108914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend 109d1f28cf181a6f77f230d90267eef0ecfbcb25f30Stephen Hemmingerstatic int mqprio_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) 110914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend{ 111914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend int i; 112914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend struct tc_mqprio_qopt *qopt; 113914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend 114914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend if (opt == NULL) 115914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend return 0; 116914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend 117914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend qopt = RTA_DATA(opt); 118914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend 119914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend fprintf(f, " tc %u map ", qopt->num_tc); 120914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend for (i = 0; i <= TC_PRIO_MAX; i++) 121e2a4536a4315ba1db6afccd4ccc41499bbde4c14Petr Sabata fprintf(f, "%u ", qopt->prio_tc_map[i]); 122914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend fprintf(f, "\n queues:"); 123914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend for (i = 0; i < qopt->num_tc; i++) 124e2a4536a4315ba1db6afccd4ccc41499bbde4c14Petr Sabata fprintf(f, "(%u:%u) ", qopt->offset[i], 125914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend qopt->offset[i] + qopt->count[i] - 1); 126914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend return 0; 127914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend} 128914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend 129914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabendstruct qdisc_util mqprio_qdisc_util = { 130914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend .id = "mqprio", 131914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend .parse_qopt = mqprio_parse_opt, 132914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend .print_qopt = mqprio_print_opt, 133914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend}; 134