/* This file was generated by upbc (the upb compiler) from the input
 * file:
 *
 *     envoy/config/listener/v3/listener_components.proto
 *
 * Do not edit -- your changes will be discarded when the file is
 * regenerated. */

#ifndef ENVOY_CONFIG_LISTENER_V3_LISTENER_COMPONENTS_PROTO_UPBDEFS_H_
#define ENVOY_CONFIG_LISTENER_V3_LISTENER_COMPONENTS_PROTO_UPBDEFS_H_

#include "upb/def.h"
#include "upb/port_def.inc"
#ifdef __cplusplus
extern "C" {
#endif

#include "upb/def.h"

#include "upb/port_def.inc"

extern upb_def_init envoy_config_listener_v3_listener_components_proto_upbdefinit;

UPB_INLINE const upb_msgdef *envoy_config_listener_v3_Filter_getmsgdef(upb_symtab *s) {
  _upb_symtab_loaddefinit(s, &envoy_config_listener_v3_listener_components_proto_upbdefinit);
  return upb_symtab_lookupmsg(s, "envoy.config.listener.v3.Filter");
}

UPB_INLINE const upb_msgdef *envoy_config_listener_v3_FilterChainMatch_getmsgdef(upb_symtab *s) {
  _upb_symtab_loaddefinit(s, &envoy_config_listener_v3_listener_components_proto_upbdefinit);
  return upb_symtab_lookupmsg(s, "envoy.config.listener.v3.FilterChainMatch");
}

UPB_INLINE const upb_msgdef *envoy_config_listener_v3_FilterChain_getmsgdef(upb_symtab *s) {
  _upb_symtab_loaddefinit(s, &envoy_config_listener_v3_listener_components_proto_upbdefinit);
  return upb_symtab_lookupmsg(s, "envoy.config.listener.v3.FilterChain");
}

UPB_INLINE const upb_msgdef *envoy_config_listener_v3_FilterChain_OnDemandConfiguration_getmsgdef(upb_symtab *s) {
  _upb_symtab_loaddefinit(s, &envoy_config_listener_v3_listener_components_proto_upbdefinit);
  return upb_symtab_lookupmsg(s, "envoy.config.listener.v3.FilterChain.OnDemandConfiguration");
}

UPB_INLINE const upb_msgdef *envoy_config_listener_v3_ListenerFilterChainMatchPredicate_getmsgdef(upb_symtab *s) {
  _upb_symtab_loaddefinit(s, &envoy_config_listener_v3_listener_components_proto_upbdefinit);
  return upb_symtab_lookupmsg(s, "envoy.config.listener.v3.ListenerFilterChainMatchPredicate");
}

UPB_INLINE const upb_msgdef *envoy_config_listener_v3_ListenerFilterChainMatchPredicate_MatchSet_getmsgdef(upb_symtab *s) {
  _upb_symtab_loaddefinit(s, &envoy_config_listener_v3_listener_components_proto_upbdefinit);
  return upb_symtab_lookupmsg(s, "envoy.config.listener.v3.ListenerFilterChainMatchPredicate.MatchSet");
}

UPB_INLINE const upb_msgdef *envoy_config_listener_v3_ListenerFilter_getmsgdef(upb_symtab *s) {
  _upb_symtab_loaddefinit(s, &envoy_config_listener_v3_listener_components_proto_upbdefinit);
  return upb_symtab_lookupmsg(s, "envoy.config.listener.v3.ListenerFilter");
}

#ifdef __cplusplus
}  /* extern "C" */
#endif

#include "upb/port_undef.inc"

#endif  /* ENVOY_CONFIG_LISTENER_V3_LISTENER_COMPONENTS_PROTO_UPBDEFS_H_ */
