1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
|
#include <stdlib.h>
#include "net.h"
#include "config.h"
#define SOL_RDS 276
#ifdef USE_RDS
#include <linux/rds.h>
#endif
#include "compat.h"
#include "utils.h" // ARRAY_SIZE
void rds_rand_socket(struct socket_triplet *st)
{
st->protocol = 0;
st->type = SOCK_SEQPACKET;
}
void rds_gen_sockaddr(struct sockaddr **addr, socklen_t *addrlen)
{
struct sockaddr_in *rds;
rds = malloc(sizeof(struct sockaddr_in));
if (rds == NULL)
return;
rds->sin_family = AF_INET;
rds->sin_addr.s_addr = random_ipv4_address();
rds->sin_port = rand() % 65535;
*addr = (struct sockaddr *) rds;
*addrlen = sizeof(struct sockaddr_in);
}
#ifdef USE_RDS
static const unsigned int rds_opts[] = {
RDS_CANCEL_SENT_TO, RDS_GET_MR, RDS_FREE_MR,
4, /* deprecated RDS_BARRIER 4 */
RDS_RECVERR, RDS_CONG_MONITOR, RDS_GET_MR_FOR_DEST };
#define NR_SOL_RDS_OPTS ARRAY_SIZE(rds_opts)
void rds_setsockopt(struct sockopt *so)
{
unsigned char val;
so->level = SOL_RDS;
val = rand() % NR_SOL_RDS_OPTS;
so->optname = rds_opts[val];
}
#else
/* stub if we are built on something without RDS headers */
void rds_setsockopt(struct sockopt *so)
{
so->level = SOL_RDS;
}
#endif /* USE_RDS */
|