aboutsummaryrefslogtreecommitdiffstats
path: root/samples
diff options
context:
space:
mode:
authorDavid Ahern <dsahern@gmail.com>2017-08-31 18:05:48 -0400
committerDavid S. Miller <davem@davemloft.net>2017-09-01 01:05:15 -0400
commitf776d460b8d25c5319b7dbc4ffd4d5fbbc10e7c1 (patch)
treee448be02f9d9683541f1396f7ccbea39a6d9099d /samples
parent609b1c32752de65134a4e4e2ceb3933790463723 (diff)
samples/bpf: Add option to dump socket settings
Add option to dump socket settings. Will be used in the next patch to verify bpf programs are correctly setting mark, priority and device based on the cgroup attachment for the program run. Signed-off-by: David Ahern <dsahern@gmail.com> Acked-by: Alexei Starovoitov <ast@kernel.org> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'samples')
-rw-r--r--samples/bpf/test_cgrp2_sock.c75
1 files changed, 73 insertions, 2 deletions
diff --git a/samples/bpf/test_cgrp2_sock.c b/samples/bpf/test_cgrp2_sock.c
index 15396761c5cc..5a688837720c 100644
--- a/samples/bpf/test_cgrp2_sock.c
+++ b/samples/bpf/test_cgrp2_sock.c
@@ -112,6 +112,70 @@ static int prog_load(__u32 idx, __u32 mark, __u32 prio)
112 return ret; 112 return ret;
113} 113}
114 114
115static int get_bind_to_device(int sd, char *name, size_t len)
116{
117 socklen_t optlen = len;
118 int rc;
119
120 name[0] = '\0';
121 rc = getsockopt(sd, SOL_SOCKET, SO_BINDTODEVICE, name, &optlen);
122 if (rc < 0)
123 perror("setsockopt(SO_BINDTODEVICE)");
124
125 return rc;
126}
127
128static unsigned int get_somark(int sd)
129{
130 unsigned int mark = 0;
131 socklen_t optlen = sizeof(mark);
132 int rc;
133
134 rc = getsockopt(sd, SOL_SOCKET, SO_MARK, &mark, &optlen);
135 if (rc < 0)
136 perror("getsockopt(SO_MARK)");
137
138 return mark;
139}
140
141static unsigned int get_priority(int sd)
142{
143 unsigned int prio = 0;
144 socklen_t optlen = sizeof(prio);
145 int rc;
146
147 rc = getsockopt(sd, SOL_SOCKET, SO_PRIORITY, &prio, &optlen);
148 if (rc < 0)
149 perror("getsockopt(SO_PRIORITY)");
150
151 return prio;
152}
153
154static int show_sockopts(int family)
155{
156 unsigned int mark, prio;
157 char name[16];
158 int sd;
159
160 sd = socket(family, SOCK_DGRAM, 17);
161 if (sd < 0) {
162 perror("socket");
163 return 1;
164 }
165
166 if (get_bind_to_device(sd, name, sizeof(name)) < 0)
167 return 1;
168
169 mark = get_somark(sd);
170 prio = get_priority(sd);
171
172 close(sd);
173
174 printf("sd %d: dev %s, mark %u, priority %u\n", sd, name, mark, prio);
175
176 return 0;
177}
178
115static int usage(const char *argv0) 179static int usage(const char *argv0)
116{ 180{
117 printf("Usage:\n"); 181 printf("Usage:\n");
@@ -120,6 +184,9 @@ static int usage(const char *argv0)
120 printf("\n"); 184 printf("\n");
121 printf(" Detach a program\n"); 185 printf(" Detach a program\n");
122 printf(" %s -d cg-path\n", argv0); 186 printf(" %s -d cg-path\n", argv0);
187 printf("\n");
188 printf(" Show inherited socket settings (mark, priority, and device)\n");
189 printf(" %s [-6]\n", argv0);
123 return EXIT_FAILURE; 190 return EXIT_FAILURE;
124} 191}
125 192
@@ -128,10 +195,11 @@ int main(int argc, char **argv)
128 __u32 idx = 0, mark = 0, prio = 0; 195 __u32 idx = 0, mark = 0, prio = 0;
129 const char *cgrp_path = NULL; 196 const char *cgrp_path = NULL;
130 int cg_fd, prog_fd, ret; 197 int cg_fd, prog_fd, ret;
198 int family = PF_INET;
131 int do_attach = 1; 199 int do_attach = 1;
132 int rc; 200 int rc;
133 201
134 while ((rc = getopt(argc, argv, "db:m:p:")) != -1) { 202 while ((rc = getopt(argc, argv, "db:m:p:6")) != -1) {
135 switch (rc) { 203 switch (rc) {
136 case 'd': 204 case 'd':
137 do_attach = 0; 205 do_attach = 0;
@@ -152,13 +220,16 @@ int main(int argc, char **argv)
152 case 'p': 220 case 'p':
153 prio = strtoumax(optarg, NULL, 0); 221 prio = strtoumax(optarg, NULL, 0);
154 break; 222 break;
223 case '6':
224 family = PF_INET6;
225 break;
155 default: 226 default:
156 return usage(argv[0]); 227 return usage(argv[0]);
157 } 228 }
158 } 229 }
159 230
160 if (optind == argc) 231 if (optind == argc)
161 return usage(argv[0]); 232 return show_sockopts(family);
162 233
163 cgrp_path = argv[optind]; 234 cgrp_path = argv[optind];
164 if (!cgrp_path) { 235 if (!cgrp_path) {