static int opt_poll;
 static int opt_interval = 1;
 static u32 opt_xdp_bind_flags = XDP_USE_NEED_WAKEUP;
+static u32 opt_umem_flags;
+static int opt_unaligned_chunks;
+static u32 opt_xdp_bind_flags;
 static int opt_xsk_frame_size = XSK_UMEM__DEFAULT_FRAME_SIZE;
 static int opt_timeout = 1000;
 static bool opt_need_wakeup = true;
                .comp_size = XSK_RING_CONS__DEFAULT_NUM_DESCS,
                .frame_size = opt_xsk_frame_size,
                .frame_headroom = XSK_UMEM__DEFAULT_FRAME_HEADROOM,
+               .flags = opt_umem_flags
        };
+
        int ret;
 
        umem = calloc(1, sizeof(*umem));
 
        ret = xsk_umem__create(&umem->umem, buffer, size, &umem->fq, &umem->cq,
                               &cfg);
+
        if (ret)
                exit_with_error(-ret);
 
        {"copy", no_argument, 0, 'c'},
        {"frame-size", required_argument, 0, 'f'},
        {"no-need-wakeup", no_argument, 0, 'm'},
+       {"unaligned", no_argument, 0, 'u'},
        {0, 0, 0, 0}
 };
 
                "  -c, --copy           Force copy mode.\n"
                "  -f, --frame-size=n   Set the frame size (must be a power of two, default is %d).\n"
                "  -m, --no-need-wakeup Turn off use of driver need wakeup flag.\n"
+               "  -f, --frame-size=n   Set the frame size (must be a power of two in aligned mode, default is %d).\n"
+               "  -u, --unaligned      Enable unaligned chunk placement\n"
                "\n";
        fprintf(stderr, str, prog, XSK_UMEM__DEFAULT_FRAME_SIZE);
        exit(EXIT_FAILURE);
        opterr = 0;
 
        for (;;) {
-
-               c = getopt_long(argc, argv, "Frtli:q:psSNn:czf:m",
+               c = getopt_long(argc, argv, "Frtli:q:psSNn:czf:mu",
                                long_options, &option_index);
                if (c == -1)
                        break;
                case 'c':
                        opt_xdp_bind_flags |= XDP_COPY;
                        break;
+               case 'u':
+                       opt_umem_flags |= XDP_UMEM_UNALIGNED_CHUNK_FLAG;
+                       opt_unaligned_chunks = 1;
+                       break;
                case 'F':
                        opt_xdp_flags &= ~XDP_FLAGS_UPDATE_IF_NOEXIST;
                        break;
                        opt_need_wakeup = false;
                        opt_xdp_bind_flags &= ~XDP_USE_NEED_WAKEUP;
                        break;
+
                default:
                        usage(basename(argv[0]));
                }
                usage(basename(argv[0]));
        }
 
-       if (opt_xsk_frame_size & (opt_xsk_frame_size - 1)) {
+       if ((opt_xsk_frame_size & (opt_xsk_frame_size - 1)) &&
+           !opt_unaligned_chunks) {
                fprintf(stderr, "--frame-size=%d is not a power of two\n",
                        opt_xsk_frame_size);
                usage(basename(argv[0]));