xref: /freebsd/tests/sys/netinet/tcp_user_cookie.c (revision b3e7694832e81d7a904a10f525f8797b753bf0d3)
115dbc160SGeorge V. Neville-Neil /*
215dbc160SGeorge V. Neville-Neil  *  Copyright (c) 2016 Limelight Networks
315dbc160SGeorge V. Neville-Neil  *  All rights reserved.
415dbc160SGeorge V. Neville-Neil  *
515dbc160SGeorge V. Neville-Neil  *  Redistribution and use in source and binary forms, with or without
615dbc160SGeorge V. Neville-Neil  *  modification, are permitted provided that the following conditions
715dbc160SGeorge V. Neville-Neil  *  are met:
815dbc160SGeorge V. Neville-Neil  *  1. Redistributions of source code must retain the above copyright
915dbc160SGeorge V. Neville-Neil  *     notice, this list of conditions, and the following disclaimer,
1015dbc160SGeorge V. Neville-Neil  *     without modification.
1115dbc160SGeorge V. Neville-Neil  *  2. Redistributions in binary form must reproduce at minimum a disclaimer
1215dbc160SGeorge V. Neville-Neil  *     substantially similar to the "NO WARRANTY" disclaimer below
1315dbc160SGeorge V. Neville-Neil  *     ("Disclaimer") and any redistribution must be conditioned upon
1415dbc160SGeorge V. Neville-Neil  *     including a substantially similar Disclaimer requirement for further
1515dbc160SGeorge V. Neville-Neil  *     binary redistribution.
1615dbc160SGeorge V. Neville-Neil  *
1715dbc160SGeorge V. Neville-Neil  *  NO WARRANTY
1815dbc160SGeorge V. Neville-Neil  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1915dbc160SGeorge V. Neville-Neil  *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2015dbc160SGeorge V. Neville-Neil  *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
2115dbc160SGeorge V. Neville-Neil  *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2215dbc160SGeorge V. Neville-Neil  *  HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2315dbc160SGeorge V. Neville-Neil  *  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2415dbc160SGeorge V. Neville-Neil  *  OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2515dbc160SGeorge V. Neville-Neil  *  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
2615dbc160SGeorge V. Neville-Neil  *  STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
2715dbc160SGeorge V. Neville-Neil  *  IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2815dbc160SGeorge V. Neville-Neil  *  POSSIBILITY OF SUCH DAMAGES.
2915dbc160SGeorge V. Neville-Neil  *
3015dbc160SGeorge V. Neville-Neil  *  Authors: George Neville-Neil
3115dbc160SGeorge V. Neville-Neil  */
3215dbc160SGeorge V. Neville-Neil 
3315dbc160SGeorge V. Neville-Neil #include <arpa/inet.h>
3415dbc160SGeorge V. Neville-Neil #include <netinet/in.h>
3515dbc160SGeorge V. Neville-Neil #include <sys/types.h>
3615dbc160SGeorge V. Neville-Neil #include <sys/socket.h>
3715dbc160SGeorge V. Neville-Neil 
3815dbc160SGeorge V. Neville-Neil #include <err.h>
3915dbc160SGeorge V. Neville-Neil #include <sysexits.h>
4015dbc160SGeorge V. Neville-Neil #include <errno.h>
4115dbc160SGeorge V. Neville-Neil #include <fcntl.h>
4215dbc160SGeorge V. Neville-Neil #include <stdio.h>
4315dbc160SGeorge V. Neville-Neil #include <stdlib.h>
4415dbc160SGeorge V. Neville-Neil #include <string.h>
4515dbc160SGeorge V. Neville-Neil #include <unistd.h>
4615dbc160SGeorge V. Neville-Neil 
4715dbc160SGeorge V. Neville-Neil #define buflen 80
4815dbc160SGeorge V. Neville-Neil 
4915dbc160SGeorge V. Neville-Neil /*
5015dbc160SGeorge V. Neville-Neil  * Setup a TCP server listening on a port for connections, all of
5115dbc160SGeorge V. Neville-Neil  * which subseuqently have their user cookie set.
5215dbc160SGeorge V. Neville-Neil  */
5315dbc160SGeorge V. Neville-Neil int
main(int argc,char ** argv)5415dbc160SGeorge V. Neville-Neil main(int argc, char **argv)
5515dbc160SGeorge V. Neville-Neil {
5615dbc160SGeorge V. Neville-Neil 	struct sockaddr_in srv;
5715dbc160SGeorge V. Neville-Neil 	int sock, accepted, port, cookie;
5815dbc160SGeorge V. Neville-Neil 	int ret;
5915dbc160SGeorge V. Neville-Neil 	char recvbuf[buflen];
6015dbc160SGeorge V. Neville-Neil 
6115dbc160SGeorge V. Neville-Neil 	if (argc != 3) {
6215dbc160SGeorge V. Neville-Neil 		fprintf(stderr, "Usage: %s port cookie\n", argv[0]);
6315dbc160SGeorge V. Neville-Neil 		exit(2);
6415dbc160SGeorge V. Neville-Neil 	}
6515dbc160SGeorge V. Neville-Neil 
6615dbc160SGeorge V. Neville-Neil 	port = atoi(argv[1]);
6715dbc160SGeorge V. Neville-Neil 	cookie = atoi(argv[2]);
6815dbc160SGeorge V. Neville-Neil 
6915dbc160SGeorge V. Neville-Neil 	sock = socket(PF_INET, SOCK_STREAM, 0);
7015dbc160SGeorge V. Neville-Neil 	if (sock < 0)
7115dbc160SGeorge V. Neville-Neil 		err(EXIT_FAILURE, "socket");
7215dbc160SGeorge V. Neville-Neil 
73*e5853fc5SEnji Cooper 	memset(&srv, 0, sizeof(srv));
7415dbc160SGeorge V. Neville-Neil 	srv.sin_len = sizeof(srv);
7515dbc160SGeorge V. Neville-Neil 	srv.sin_family = AF_INET;
7615dbc160SGeorge V. Neville-Neil 	srv.sin_port = htons(port);
7715dbc160SGeorge V. Neville-Neil 	srv.sin_addr.s_addr = INADDR_ANY;
7815dbc160SGeorge V. Neville-Neil 
7915dbc160SGeorge V. Neville-Neil 	if (bind(sock, (struct sockaddr *)&srv, srv.sin_len) < 0)
8015dbc160SGeorge V. Neville-Neil 		err(EX_OSERR, "failed to bind to port %d", port);
8115dbc160SGeorge V. Neville-Neil 
8215dbc160SGeorge V. Neville-Neil 	if (listen(sock, 5) < 0)
8315dbc160SGeorge V. Neville-Neil 		err(EX_OSERR, "failed to listen on socket");
8415dbc160SGeorge V. Neville-Neil 
8515dbc160SGeorge V. Neville-Neil 	ret = setsockopt(sock, SOL_SOCKET, SO_USER_COOKIE, &cookie, sizeof(cookie));
8615dbc160SGeorge V. Neville-Neil 	if (ret < 0)
8715dbc160SGeorge V. Neville-Neil 		err(EX_OSERR, "setsockopt(SO_USER_COOKIE)");
8815dbc160SGeorge V. Neville-Neil 
8915dbc160SGeorge V. Neville-Neil 	while (1) {
9015dbc160SGeorge V. Neville-Neil 
9115dbc160SGeorge V. Neville-Neil 		accepted = accept(sock, NULL, 0);
9215dbc160SGeorge V. Neville-Neil 
9315dbc160SGeorge V. Neville-Neil 		if (accepted < 0)
9415dbc160SGeorge V. Neville-Neil 			err(EX_OSERR, "accept failed");
9515dbc160SGeorge V. Neville-Neil 
9615dbc160SGeorge V. Neville-Neil 		ret = setsockopt(accepted, SOL_SOCKET, SO_USER_COOKIE,
9715dbc160SGeorge V. Neville-Neil 				 &cookie, sizeof(cookie));
9815dbc160SGeorge V. Neville-Neil 		if (ret < 0)
9915dbc160SGeorge V. Neville-Neil 			err(EX_OSERR, "setsockopt(SO_USER_COOKIE)");
10015dbc160SGeorge V. Neville-Neil 
10115dbc160SGeorge V. Neville-Neil 		ret = read(accepted, &recvbuf, buflen);
10215dbc160SGeorge V. Neville-Neil 
10315dbc160SGeorge V. Neville-Neil 		if (ret < 0)
10415dbc160SGeorge V. Neville-Neil 			warn("failed read");
10515dbc160SGeorge V. Neville-Neil 
10615dbc160SGeorge V. Neville-Neil 		close(accepted);
10715dbc160SGeorge V. Neville-Neil 	}
10815dbc160SGeorge V. Neville-Neil 
10915dbc160SGeorge V. Neville-Neil 	return (0);
11015dbc160SGeorge V. Neville-Neil }
111