q_mqprio.c revision 892eba309fab1bad2a15868163c0d10b6ed88592
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 = { 37914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend 8, 38914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend {0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 1, 1, 3, 3, 3, 3}, 39914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend 1, 40914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend }; 41914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend 42914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend while (argc > 0) { 43914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend idx = 0; 44914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend if (strcmp(*argv, "num_tc") == 0) { 45914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend NEXT_ARG(); 46914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend if (get_u8(&opt.num_tc, *argv, 10)) { 47914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend fprintf(stderr, "Illegal \"num_tc\"\n"); 48914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend return -1; 49914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend } 50914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend } else if (strcmp(*argv, "map") == 0) { 51914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend while (idx < TC_QOPT_MAX_QUEUE && NEXT_ARG_OK()) { 52914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend NEXT_ARG(); 53914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend if (get_u8(&opt.prio_tc_map[idx], *argv, 10)) { 54914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend PREV_ARG(); 55914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend break; 56914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend } 57914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend idx++; 58914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend } 59914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend for ( ; idx < TC_QOPT_MAX_QUEUE; idx++) 60914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend opt.prio_tc_map[idx] = 0; 61892eba309fab1bad2a15868163c0d10b6ed88592John Fastabend } else if (strcmp(*argv, "queues") == 0) { 62892eba309fab1bad2a15868163c0d10b6ed88592John Fastabend char *tmp, *tok; 63892eba309fab1bad2a15868163c0d10b6ed88592John Fastabend 64914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend while (idx < TC_QOPT_MAX_QUEUE && NEXT_ARG_OK()) { 65914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend NEXT_ARG(); 66892eba309fab1bad2a15868163c0d10b6ed88592John Fastabend 67892eba309fab1bad2a15868163c0d10b6ed88592John Fastabend tmp = strdup(*argv); 68892eba309fab1bad2a15868163c0d10b6ed88592John Fastabend if (!tmp) 69892eba309fab1bad2a15868163c0d10b6ed88592John Fastabend break; 70892eba309fab1bad2a15868163c0d10b6ed88592John Fastabend 71892eba309fab1bad2a15868163c0d10b6ed88592John Fastabend tok = strtok(tmp, "@"); 72892eba309fab1bad2a15868163c0d10b6ed88592John Fastabend if (get_u16(&opt.count[idx], tok, 10)) { 73892eba309fab1bad2a15868163c0d10b6ed88592John Fastabend free(tmp); 74914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend PREV_ARG(); 75914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend break; 76914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend } 77892eba309fab1bad2a15868163c0d10b6ed88592John Fastabend tok = strtok(NULL, "@"); 78892eba309fab1bad2a15868163c0d10b6ed88592John Fastabend if (get_u16(&opt.offset[idx], tok, 10)) { 79892eba309fab1bad2a15868163c0d10b6ed88592John Fastabend free(tmp); 80914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend PREV_ARG(); 81914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend break; 82914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend } 83892eba309fab1bad2a15868163c0d10b6ed88592John Fastabend free(tmp); 84914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend idx++; 85914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend } 86914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend } else if (strcmp(*argv, "hw") == 0) { 87914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend NEXT_ARG(); 88914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend if (get_u8(&opt.hw, *argv, 10)) { 89914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend fprintf(stderr, "Illegal \"hw\"\n"); 90914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend return -1; 91914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend } 92914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend idx++; 93914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend } else if (strcmp(*argv, "help") == 0) { 94914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend explain(); 95914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend return -1; 96914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend } else { 97914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend fprintf(stderr, "Unknown argument\n"); 98914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend return -1; 99914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend } 100914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend argc--; argv++; 101914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend } 102914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend 103914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend addattr_l(n, 1024, TCA_OPTIONS, &opt, sizeof(opt)); 104914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend return 0; 105914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend} 106914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend 107914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabendint mqprio_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) 108914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend{ 109914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend int i; 110914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend struct tc_mqprio_qopt *qopt; 111914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend 112914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend if (opt == NULL) 113914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend return 0; 114914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend 115914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend qopt = RTA_DATA(opt); 116914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend 117914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend fprintf(f, " tc %u map ", qopt->num_tc); 118914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend for (i = 0; i <= TC_PRIO_MAX; i++) 119914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend fprintf(f, "%d ", qopt->prio_tc_map[i]); 120914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend fprintf(f, "\n queues:"); 121914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend for (i = 0; i < qopt->num_tc; i++) 122914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend fprintf(f, "(%i:%i) ", qopt->offset[i], 123914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend qopt->offset[i] + qopt->count[i] - 1); 124914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend return 0; 125914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend} 126914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend 127914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabendstruct qdisc_util mqprio_qdisc_util = { 128914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend .id = "mqprio", 129914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend .parse_qopt = mqprio_parse_opt, 130914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend .print_qopt = mqprio_print_opt, 131914953046aac346b16143eee1c04b8a49bec8c8eJohn Fastabend}; 132