  Traditionally, the data plane has been designed with fixed functions to
forward packets using a small set of protocols. This closed-design paradigm has
limited the capability of the switches to proprietary implementations which are
hardcoded by vendors, inducing a lengthy, costly, and inflexible process.
Recently, data plane programmability has attracted significant attention from
both the research community and the industry, permitting operators and
programmers in general to run customized packet processing function. This
open-design paradigm is paving the way for an unprecedented wave of innovation
and experimentation by reducing the time of designing, testing, and adopting
new protocols; enabling a customized, top-down approach to develop network
applications; providing granular visibility of packet events defined by the
programmer; reducing complexity and enhancing resource utilization of the
programmable switches; and drastically improving the performance of
applications that are offloaded to the data plane. Despite the impressive
advantages of programmable data plane switches and their importance in modern
networks, the literature has been missing a comprehensive survey. To this end,
this paper provides a background encompassing an overview of the evolution of
networks from legacy to programmable, describing the essentials of programmable
switches, and summarizing their advantages over Software-defined Networking
(SDN) and legacy devices. The paper then presents a unique, comprehensive
taxonomy of applications developed with P4 language; surveying, classifying,
and analyzing more than 150 articles; discussing challenges and considerations;
and presenting future perspectives and open research issues.
