|      **bpftool** **map pop**        *MAP*
 |      **bpftool** **map enqueue**    *MAP* **value** *VALUE*
 |      **bpftool** **map dequeue**    *MAP*
+|      **bpftool** **map freeze**     *MAP*
 |      **bpftool** **map help**
 |
 |      *MAP* := { **id** *MAP_ID* | **pinned** *FILE* }
        **bpftool map dequeue**  *MAP*
                  Dequeue and print **value** from the queue.
 
+       **bpftool map freeze**  *MAP*
+                 Freeze the map as read-only from user space. Entries from a
+                 frozen map can not longer be updated or deleted with the
+                 **bpf\ ()** system call. This operation is not reversible,
+                 and the map remains immutable from user space until its
+                 destruction. However, read and write permissions for BPF
+                 programs to the map remain unchanged.
+
        **bpftool map help**
                  Print short help message.
 
 
         map)
             local MAP_TYPE='id pinned'
             case $command in
-                show|list|dump|peek|pop|dequeue)
+                show|list|dump|peek|pop|dequeue|freeze)
                     case $prev in
                         $command)
                             COMPREPLY=( $( compgen -W "$MAP_TYPE" -- "$cur" ) )
                     [[ $prev == $object ]] && \
                         COMPREPLY=( $( compgen -W 'delete dump getnext help \
                             lookup pin event_pipe show list update create \
-                            peek push enqueue pop dequeue' -- \
+                            peek push enqueue pop dequeue freeze' -- \
                             "$cur" ) )
                     ;;
             esac
 
        return err;
 }
 
+static int do_freeze(int argc, char **argv)
+{
+       int err, fd;
+
+       if (!REQ_ARGS(2))
+               return -1;
+
+       fd = map_parse_fd(&argc, &argv);
+       if (fd < 0)
+               return -1;
+
+       if (argc) {
+               close(fd);
+               return BAD_ARG();
+       }
+
+       err = bpf_map_freeze(fd);
+       close(fd);
+       if (err) {
+               p_err("failed to freeze map: %s", strerror(errno));
+               return err;
+       }
+
+       if (json_output)
+               jsonw_null(json_wtr);
+
+       return 0;
+}
+
 static int do_help(int argc, char **argv)
 {
        if (json_output) {
                "       %s %s pop        MAP\n"
                "       %s %s enqueue    MAP value VALUE\n"
                "       %s %s dequeue    MAP\n"
+               "       %s %s freeze     MAP\n"
                "       %s %s help\n"
                "\n"
                "       " HELP_SPEC_MAP "\n"
                bin_name, argv[-2], bin_name, argv[-2], bin_name, argv[-2],
                bin_name, argv[-2], bin_name, argv[-2], bin_name, argv[-2],
                bin_name, argv[-2], bin_name, argv[-2], bin_name, argv[-2],
-               bin_name, argv[-2], bin_name, argv[-2], bin_name, argv[-2]);
+               bin_name, argv[-2], bin_name, argv[-2], bin_name, argv[-2],
+               bin_name, argv[-2]);
 
        return 0;
 }
        { "enqueue",    do_update },
        { "pop",        do_pop_dequeue },
        { "dequeue",    do_pop_dequeue },
+       { "freeze",     do_freeze },
        { 0 }
 };