diff --git a/bind-test.c b/bind-test.c index b89b9de..c65469b 100644 --- a/bind-test.c +++ b/bind-test.c @@ -80,17 +80,20 @@ int main() struct tcp_state state; int r; - if (send(sock_recv, "hello", 5, 0) < 0) { + if (send(sock_recv, "hello\n", 6, 0) < 0) { perror("send"); return -1; } - r = getsockopt(sock_recv, IPPROTO_TCP, TCP_STATE, &state, &len); + len = sizeof(state); + r = getsockopt(sock, IPPROTO_TCP, TCP_STATE, &state, &len); if (r != 0) { perror("getsockopt"); return -1; } print_state(&state); + + sleep(5); return 0; diff --git a/forge_socket.c b/forge_socket.c index bdfa872..34245d1 100644 --- a/forge_socket.c +++ b/forge_socket.c @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -188,14 +189,41 @@ int forge_getsockopt(struct sock *sk, int level, int optname, char __user *optva { struct tcp_state ret; - if (optname == TCP_STATE) { + if (optname == TCP_SECURE_RAND) { + struct tcp_state user_st; + __u32 seq_ret; + + if (!capable(CAP_NET_RAW)) { + return -EACCES; + } + + __be32 h_init[16]; + memset(h_init, 0, 16); + h_init[0] = inet_sk(sk)->inet_saddr; + h_init[1] = inet_sk(sk)->inet_daddr; + h_init[2] = (inet_sk(sk)->inet_sport << 16) + (inet_sk(sk)->inet_dport); + + + seq_ret = secure_tcpv6_sequence_number(h_init, + h_init, + inet_sk(sk)->inet_sport, + inet_sk(sk)->inet_dport); + + if (put_user(sizeof(seq_ret), optlen)) + return -EFAULT; + if (put_user(seq_ret, optval)) + return -EFAULT; + + return 0; + + } else if (optname == TCP_STATE) { if (!capable(CAP_NET_RAW)) { return -EACCES; } ret.ack = tcp_sk(sk)->rcv_nxt; ret.seq = tcp_sk(sk)->snd_nxt; - ret.src_ip = inet_sk(sk)->inet_rcv_saddr; // or inet_saddr? + ret.src_ip = inet_sk(sk)->inet_saddr; // or inet_rcv_saddr? ret.dst_ip = inet_sk(sk)->inet_daddr; ret.sport = inet_sk(sk)->inet_sport; ret.dport = inet_sk(sk)->inet_dport; diff --git a/forge_socket.h b/forge_socket.h index c72e645..70fc714 100644 --- a/forge_socket.h +++ b/forge_socket.h @@ -5,6 +5,7 @@ #define SOCK_FORGE 9 // new protocol #define TCP_STATE 18 // new TCP sockopt +#define TCP_SECURE_RAND 19 // and another //Debug: #define TCP_CA_NAME_MAX 16