eBPF 之 ProgramType、AttachType和InputContext
1. ProgramType 定义
定义在 include/uapi/linux/bpf.h 文件中,不同 Linux 版本会有变化,以下是 Linux 5.19 版本定义:
enum bpf_prog_type {BPF_PROG_TYPE_UNSPEC,BPF_PROG_TYPE_SOCKET_FILTER,BPF_PROG_TYPE_KPROBE,BPF_PROG_TYPE_SCHED_CLS,BPF_PROG_TYPE_SCHED_ACT,BPF_PROG_TYPE_TRACEPOINT,BPF_PROG_TYPE_XDP,BPF_PROG_TYPE_PERF_EVENT,BPF_PROG_TYPE_CGROUP_SKB,BPF_PROG_TYPE_CGROUP_SOCK,BPF_PROG_TYPE_LWT_IN,BPF_PROG_TYPE_LWT_OUT,BPF_PROG_TYPE_LWT_XMIT,BPF_PROG_TYPE_SOCK_OPS,BPF_PROG_TYPE_SK_SKB,BPF_PROG_TYPE_CGROUP_DEVICE,BPF_PROG_TYPE_SK_MSG,BPF_PROG_TYPE_RAW_TRACEPOINT,BPF_PROG_TYPE_CGROUP_SOCK_ADDR,BPF_PROG_TYPE_LWT_SEG6LOCAL,BPF_PROG_TYPE_LIRC_MODE2,BPF_PROG_TYPE_SK_REUSEPORT,BPF_PROG_TYPE_FLOW_DISSECTOR,BPF_PROG_TYPE_CGROUP_SYSCTL,BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE,BPF_PROG_TYPE_CGROUP_SOCKOPT,BPF_PROG_TYPE_TRACING,BPF_PROG_TYPE_STRUCT_OPS,BPF_PROG_TYPE_EXT,BPF_PROG_TYPE_LSM,BPF_PROG_TYPE_SK_LOOKUP,BPF_PROG_TYPE_SYSCALL, /* a program that can execute syscalls */
};2. AttachType 定义
定义在 include/uapi/linux/bpf.h 文件中,不同 Linux 版本会有变化,以下是 Linux 5.19 版本定义:
enum bpf_attach_type {BPF_CGROUP_INET_INGRESS,BPF_CGROUP_INET_EGRESS,BPF_CGROUP_INET_SOCK_CREATE,BPF_CGROUP_SOCK_OPS,BPF_SK_SKB_STREAM_PARSER,BPF_SK_SKB_STREAM_VERDICT,BPF_CGROUP_DEVICE,BPF_SK_MSG_VERDICT,BPF_CGROUP_INET4_BIND,BPF_CGROUP_INET6_BIND,BPF_CGROUP_INET4_CONNECT,BPF_CGROUP_INET6_CONNECT,BPF_CGROUP_INET4_POST_BIND,BPF_CGROUP_INET6_POST_BIND,BPF_CGROUP_UDP4_SENDMSG,BPF_CGROUP_UDP6_SENDMSG,BPF_LIRC_MODE2,BPF_FLOW_DISSECTOR,BPF_CGROUP_SYSCTL,BPF_CGROUP_UDP4_RECVMSG,BPF_CGROUP_UDP6_RECVMSG,BPF_CGROUP_GETSOCKOPT,BPF_CGROUP_SETSOCKOPT,BPF_TRACE_RAW_TP,BPF_TRACE_FENTRY,BPF_TRACE_FEXIT,BPF_MODIFY_RETURN,BPF_LSM_MAC,BPF_TRACE_ITER,BPF_CGROUP_INET4_GETPEERNAME,BPF_CGROUP_INET6_GETPEERNAME,BPF_CGROUP_INET4_GETSOCKNAME,BPF_CGROUP_INET6_GETSOCKNAME,BPF_XDP_DEVMAP,BPF_CGROUP_INET_SOCK_RELEASE,BPF_XDP_CPUMAP,BPF_SK_LOOKUP,BPF_XDP,BPF_SK_SKB_VERDICT,BPF_SK_REUSEPORT_SELECT,BPF_SK_REUSEPORT_SELECT_OR_MIGRATE,BPF_PERF_EVENT,__MAX_BPF_ATTACH_TYPE
};3. ProgramType、AttachType和 InputContext关系
在 Linux 源码 kernel/bpf/syscall.c 文件的 attach_type_to_prog_type 函数中有 ProgramType 与 AttachType 的映射关系,同时在 Linux 源码 include/linux/bpf_types.h 中定义了 ProgramType 与 InputContext 的映射关系。
整理后的映射关系如下:
ProgramType | AttachType | InputContext |
BPF_PROG_TYPE_SOCKET_FILTER | None | struct __sk_buff |
BPF_PROG_TYPE_KPROBE | AttachTraceKprobeMulti | struct pt_regs |
BPF_PROG_TYPE_SCHED_CLS | None | struct __sk_buff |
BPF_PROG_TYPE_SCHED_ACT | None | struct __sk_buff |
BPF_PROG_TYPE_TRACEPOINT | None | __u64 |
BPF_PROG_TYPE_XDP | BPF_XDP_DEVMAP BPF_XDP_CPUMAP BPF_XDP | struct xdp_md |
BPF_PROG_TYPE_PERF_EVENT | None | struct bpf_perf_event_data |
BPF_PROG_TYPE_CGROUP_SKB | BPF_CGROUP_INET_INGRESS BPF_CGROUP_INET_EGRESS | struct __sk_buff |
BPF_PROG_TYPE_CGROUP_SOCK | BPF_CGROUP_INET_SOCK_CREATE BPF_CGROUP_INET_SOCK_RELEASE BPF_CGROUP_INET4_POST_BIND BPF_CGROUP_INET6_POST_BIND | struct bpf_sock |
BPF_PROG_TYPE_LWT_IN | None | struct __sk_buff |
BPF_PROG_TYPE_LWT_OUT | None | struct __sk_buff |
BPF_PROG_TYPE_LWT_XMIT | None | struct __sk_buff |
BPF_PROG_TYPE_SOCK_OPS | BPF_CGROUP_SOCK_OPS | struct bpf_sock_ops |
BPF_PROG_TYPE_SK_SKB | BPF_SK_SKB_STREAM_PARSER BPF_SK_SKB_STREAM_VERDICT BPF_SK_SKB_VERDICT | struct __sk_buff |
BPF_PROG_TYPE_CGROUP_DEVICE | BPF_CGROUP_DEVICE | struct bpf_cgroup_dev_ctx |
BPF_PROG_TYPE_SK_MSG | BPF_SK_MSG_VERDICT | struct sk_msg_md |
BPF_PROG_TYPE_RAW_TRACEPOINT | None | struct bpf_raw_tracepoint_args |
BPF_PROG_TYPE_CGROUP_SOCK_ADDR | BPF_CGROUP_INET4_BIND BPF_CGROUP_INET6_BIND BPF_CGROUP_INET4_CONNECT BPF_CGROUP_INET6_CONNECT BPF_CGROUP_UDP4_SENDMSG BPF_CGROUP_UDP6_SENDMSG BPF_CGROUP_UDP4_RECVMSG BPF_CGROUP_UDP6_RECVMSG BPF_CGROUP_INET4_GETPEERNAME BPF_CGROUP_INET6_GETPEERNAME BPF_CGROUP_INET4_GETSOCKNAME BPF_CGROUP_INET6_GETSOCKNAME | struct bpf_sock_addr |
BPF_PROG_TYPE_LWT_SEG6LOCAL | None | struct __sk_buff |
BPF_PROG_TYPE_LIRC_MODE2 | BPF_LIRC_MODE2 | __u32 |
BPF_PROG_TYPE_SK_REUSEPORT | BPF_SK_REUSEPORT_SELECT BPF_SK_REUSEPORT_SELECT_OR_MIGRATE | struct sk_reuseport_md |
BPF_PROG_TYPE_FLOW_DISSECTOR | BPF_FLOW_DISSECTOR | struct __sk_buff |
BPF_PROG_TYPE_CGROUP_SYSCTL | BPF_CGROUP_SYSCTL | struct bpf_sysctl |
BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE | None | struct bpf_raw_tracepoint_args |
BPF_PROG_TYPE_CGROUP_SOCKOPT | BPF_CGROUP_GETSOCKOPT BPF_CGROUP_SETSOCKOPT | struct bpf_sockopt |
BPF_PROG_TYPE_TRACING | BPF_TRACE_RAW_TP BPF_TRACE_FENTRY BPF_TRACE_FEXIT BPF_MODIFY_RETURN BPF_TRACE_ITER | void * |
BPF_PROG_TYPE_STRUCT_OPS | None | void * |
BPF_PROG_TYPE_EXT | None | void * |
BPF_PROG_TYPE_LSM | BPF_LSM_MAC | void * |
BPF_PROG_TYPE_SK_LOOKUP | BPF_SK_LOOKUP | struct bpf_sk_lookup |
BPF_PROG_TYPE_SYSCALL | None | void * |
注:也参考了 github.com/cilium/ebpf/elf_reader.go 文件定义的映射关系。
4. InputContext 详细定义
4.1. struct xdp_md
在 include/uapi/linux/bpf.h 文件下定义:
struct xdp_md { __u32 data;__u32 data_end;__u32 data_meta;/* Below access go through struct xdp_rxq_info */__u32 ingress_ifindex; /* rxq->dev->ifindex */__u32 rx_queue_index; /* rxq->queue_index */__u32 egress_ifindex; /* txq->dev->ifindex */
};4.2. struct pt_regs
struct pt_regs 的定义与系统架构相关,以 x86 系统为例,可以在 /usr/src/linux-headers-${uname -r}/arch/x86/include/uapi/asm/ptrace.h 文件中找到,下面是 x86_64 系统架构的定义:
struct pt_regs {
/** C ABI says these regs are callee-preserved. They aren't saved on kernel entry* unless syscall needs a complete, fully filled "struct pt_regs".*/unsigned long r15;unsigned long r14;unsigned long r13;unsigned long r12;unsigned long rbp;unsigned long rbx;
/* These regs are callee-clobbered. Always saved on kernel entry. */unsigned long r11;unsigned long r10;unsigned long r9;unsigned long r8;unsigned long rax;unsigned long rcx;unsigned long rdx;unsigned long rsi;unsigned long rdi;
/** On syscall entry, this is syscall#. On CPU exception, this is error code.* On hw interrupt, it's IRQ number:*/unsigned long orig_rax;
/* Return frame for iretq */unsigned long rip;unsigned long cs;unsigned long eflags;unsigned long rsp;unsigned long ss;
/* top of stack page */
};4.3. struct __sk_buff
在 include/uapi/linux/bpf.h 文件下定义:
/* user accessible mirror of in-kernel sk_buff.* new fields can only be added to the end of this structure*/
struct __sk_buff {__u32 len; __u32 pkt_type;__u32 mark;__u32 queue_mapping;__u32 protocol;__u32 vlan_present;__u32 vlan_tci;__u32 vlan_proto;__u32 priority;__u32 ingress_ifindex;__u32 ifindex;__u32 tc_index;__u32 cb[5];__u32 hash;__u32 tc_classid;__u32 data;__u32 data_end;__u32 napi_id;/* Accessed by BPF_PROG_TYPE_sk_skb types from here to ... */__u32 family;__u32 remote_ip4; /* Stored in network byte order */__u32 local_ip4; /* Stored in network byte order */__u32 remote_ip6[4]; /* Stored in network byte order */__u32 local_ip6[4]; /* Stored in network byte order */__u32 remote_port; /* Stored in network byte order */__u32 local_port; /* stored in host byte order *//* ... here. */__u32 data_meta;__bpf_md_ptr(struct bpf_flow_keys *, flow_keys);__u64 tstamp;__u32 wire_len;__u32 gso_segs;__bpf_md_ptr(struct bpf_sock *, sk); __u32 gso_size;
};4.4. struct bpf_perf_event_data
在 include/uapi/linux/bpf_perf_event.h 文件下定义:
typedef struct pt_regs bpf_user_pt_regs_t;struct bpf_perf_event_data {bpf_user_pt_regs_t regs;__u64 sample_period;__u64 addr;
};4.5. struct bpf_sock
在 include/uapi/linux/bpf.h 文件下定义:
struct bpf_sock {__u32 bound_dev_if;__u32 family;__u32 type;__u32 protocol;__u32 mark;__u32 priority;/* IP address also allows 1 and 2 bytes access */__u32 src_ip4;__u32 src_ip6[4];__u32 src_port; /* host byte order */__be16 dst_port; /* network byte order */__u16 :16; /* zero padding */__u32 dst_ip4;__u32 dst_ip6[4];__u32 state;__s32 rx_queue_mapping;
};4.6. struct bpf_sock_ops
在 include/uapi/linux/bpf.h 文件下定义:
struct bpf_sock_ops {__u32 op;union {__u32 args[4]; /* Optionally passed to bpf program */__u32 reply; /* Returned by bpf program */__u32 replylong[4]; /* Optionally returned by bpf prog */};__u32 family;__u32 remote_ip4; /* Stored in network byte order */__u32 local_ip4; /* Stored in network byte order */__u32 remote_ip6[4]; /* Stored in network byte order */__u32 local_ip6[4]; /* Stored in network byte order */__u32 remote_port; /* Stored in network byte order */__u32 local_port; /* stored in host byte order */__u32 is_fullsock; /* Some TCP fields are only valid if* there is a full socket. If not, the* fields read as zero.*/__u32 snd_cwnd;__u32 srtt_us; /* Averaged RTT << 3 in usecs */__u32 bpf_sock_ops_cb_flags; /* flags defined in uapi/linux/tcp.h */__u32 state;__u32 rtt_min;__u32 snd_ssthresh;__u32 rcv_nxt;__u32 snd_nxt;__u32 snd_una;__u32 mss_cache;__u32 ecn_flags;__u32 rate_delivered;__u32 rate_interval_us;__u32 packets_out;__u32 retrans_out;__u32 total_retrans;__u32 segs_in;__u32 data_segs_in;__u32 segs_out;__u32 data_segs_out;__u32 lost_out;__u32 sacked_out;__u32 sk_txhash;__u64 bytes_received;__u64 bytes_acked;__bpf_md_ptr(struct bpf_sock *, sk);/* [skb_data, skb_data_end) covers the whole TCP header.** BPF_SOCK_OPS_PARSE_HDR_OPT_CB: The packet received* BPF_SOCK_OPS_HDR_OPT_LEN_CB: Not useful because the* header has not been written.* BPF_SOCK_OPS_WRITE_HDR_OPT_CB: The header and options have* been written so far.* BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB: The SYNACK that concludes* the 3WHS.* BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB: The ACK that concludes* the 3WHS.** bpf_load_hdr_opt() can also be used to read a particular option.*/__bpf_md_ptr(void *, skb_data);__bpf_md_ptr(void *, skb_data_end);__u32 skb_len; /* The total length of a packet.* It includes the header, options,* and payload.*/__u32 skb_tcp_flags; /* tcp_flags of the header. It provides* an easy way to check for tcp_flags* without parsing skb_data.** In particular, the skb_tcp_flags* will still be available in* BPF_SOCK_OPS_HDR_OPT_LEN even though* the outgoing header has not* been written yet.*/
};4.7. struct bpf_cgroup_dev_ctx
在 include/uapi/linux/bpf.h 文件下定义:
struct bpf_cgroup_dev_ctx {/* access_type encoded as (BPF_DEVCG_ACC_* << 16) | BPF_DEVCG_DEV_* */__u32 access_type;__u32 major;__u32 minor;
};4.8. struct sk_msg_md
在 include/uapi/linux/bpf.h 文件下定义:
struct sk_msg_md {__bpf_md_ptr(void *, data);__bpf_md_ptr(void *, data_end);__u32 family;__u32 remote_ip4; /* Stored in network byte order */__u32 local_ip4; /* Stored in network byte order */__u32 remote_ip6[4]; /* Stored in network byte order */__u32 local_ip6[4]; /* Stored in network byte order */__u32 remote_port; /* Stored in network byte order */__u32 local_port; /* stored in host byte order */__u32 size; /* Total size of sk_msg */__bpf_md_ptr(struct bpf_sock *, sk); /* current socket */
};4.9. struct sk_reuseport_md
在 include/uapi/linux/bpf.h 文件下定义:
struct sk_reuseport_md {/** Start of directly accessible data. It begins from* the tcp/udp header.*/__bpf_md_ptr(void *, data);/* End of directly accessible data */__bpf_md_ptr(void *, data_end);/** Total length of packet (starting from the tcp/udp header).* Note that the directly accessible bytes (data_end - data)* could be less than this "len". Those bytes could be* indirectly read by a helper "bpf_skb_load_bytes()".*/__u32 len;/** Eth protocol in the mac header (network byte order). e.g.* ETH_P_IP(0x0800) and ETH_P_IPV6(0x86DD)*/__u32 eth_protocol;__u32 ip_protocol; /* IP protocol. e.g. IPPROTO_TCP, IPPROTO_UDP */__u32 bind_inany; /* Is sock bound to an INANY address? */__u32 hash; /* A hash of the packet 4 tuples *//* When reuse->migrating_sk is NULL, it is selecting a sk for the* new incoming connection request (e.g. selecting a listen sk for* the received SYN in the TCP case). reuse->sk is one of the sk* in the reuseport group. The bpf prog can use reuse->sk to learn* the local listening ip/port without looking into the skb.** When reuse->migrating_sk is not NULL, reuse->sk is closed and* reuse->migrating_sk is the socket that needs to be migrated* to another listening socket. migrating_sk could be a fullsock* sk that is fully established or a reqsk that is in-the-middle* of 3-way handshake.*/__bpf_md_ptr(struct bpf_sock *, sk);__bpf_md_ptr(struct bpf_sock *, migrating_sk);
};4.10. struct bpf_raw_tracepoint_args
在 include/uapi/linux/bpf.h 文件下定义:
struct bpf_raw_tracepoint_args {__u64 args[0];
};4.11. struct bpf_sock_addr
在 include/uapi/linux/bpf.h 文件下定义:
struct bpf_sock_addr {__u32 user_family; /* Allows 4-byte read, but no write. */__u32 user_ip4; /* Allows 1,2,4-byte read and 4-byte write.* Stored in network byte order.*/__u32 user_ip6[4]; /* Allows 1,2,4,8-byte read and 4,8-byte write.* Stored in network byte order.*/__u32 user_port; /* Allows 1,2,4-byte read and 4-byte write.* Stored in network byte order*/__u32 family; /* Allows 4-byte read, but no write */__u32 type; /* Allows 4-byte read, but no write */__u32 protocol; /* Allows 4-byte read, but no write */__u32 msg_src_ip4; /* Allows 1,2,4-byte read and 4-byte write.* Stored in network byte order.*/__u32 msg_src_ip6[4]; /* Allows 1,2,4,8-byte read and 4,8-byte write.* Stored in network byte order.*/__bpf_md_ptr(struct bpf_sock *, sk);
};4.12. struct bpf_sysctl
在 include/uapi/linux/bpf.h 文件下定义:
struct bpf_sysctl {__u32 write; /* Sysctl is being read (= 0) or written (= 1).* Allows 1,2,4-byte read, but no write.*/__u32 file_pos; /* Sysctl file position to read from, write to.* Allows 1,2,4-byte read an 4-byte write.*/
};4.13. struct bpf_sockopt
在 include/uapi/linux/bpf.h 文件下定义:
struct bpf_sockopt {__bpf_md_ptr(struct bpf_sock *, sk);__bpf_md_ptr(void *, optval);__bpf_md_ptr(void *, optval_end);__s32 level;__s32 optname;__s32 optlen;__s32 retval;
};4.14. struct bpf_sk_lookup
在 include/uapi/linux/bpf.h 文件下定义:
struct bpf_sk_lookup {union {__bpf_md_ptr(struct bpf_sock *, sk); /* Selected socket */__u64 cookie; /* Non-zero if socket was selected in PROG_TEST_RUN */};__u32 family; /* Protocol family (AF_INET, AF_INET6) */__u32 protocol; /* IP protocol (IPPROTO_TCP, IPPROTO_UDP) */__u32 remote_ip4; /* Network byte order */__u32 remote_ip6[4]; /* Network byte order */__be16 remote_port; /* Network byte order */__u16 :16; /* Zero padding */__u32 local_ip4; /* Network byte order */__u32 local_ip6[4]; /* Network byte order */__u32 local_port; /* Host byte order */__u32 ingress_ifindex; /* The arriving interface. Determined by inet_iif. */
};
相关文章:
eBPF 之 ProgramType、AttachType和InputContext
1. ProgramType 定义定义在 include/uapi/linux/bpf.h 文件中,不同 Linux 版本会有变化,以下是 Linux 5.19 版本定义:enum bpf_prog_type {BPF_PROG_TYPE_UNSPEC,BPF_PROG_TYPE_SOCKET_FILTER,BPF_PROG_TYPE_KPROBE,BPF_PROG_TYPE_SCHED_CLS,…...
C++运行时类型识别RTTI
C技能 runtime type identification(RTTI) 运行时类型识别在使用多态的时候经常用到。本文将会介绍RTTI的几个特征。1. 运行时类型转换下面的程序模仿了dynamic_cast<type_id>()类型转化符号,根据每个类的id来判断当前的类型,如果id不匹配…...
idea多时编辑多行-winmac都支持
1背景介绍 idea编辑器非常强大,其中一个功能非常优秀,很多程序员也非常喜欢用。这个功能能够大大大提高工作效率-------------多行代码同时编辑 2win 2.1方法1 按住alt鼠标左键上/下拖动即可 这样选中多行后,可以直接多行编辑。 优点&a…...
BI是报表?BI是可视化?BI到底是什么?
很多企业认为只要买一个前端商业智能BI分析工具就可以解决企业级的商业智能BI所有问题,这个看法实际上也不可行的。可能在最开始分析场景相对简单,对接数据的复杂度不是很高的情况下这类商业智能BI分析工具没有问题。但是在企业的商业智能BI项目建设有一…...
Python基础-数据类型之元组
一、元组的定义 nums (1, 2, 3, 4, 5) 元组是序列的其中一种,每个元素都以逗号分隔,用()包围。 当元组中只有一个元素时,需要在元素后面加逗号分隔,nums (1,),否则括号会被当成运算符 nums (1) print(type(nums…...
大数据面试小抄
项目地址:https://github.com/GTyingzi/BigDATA 该项目是自己在学习大数据过程中整理、总结下来的一份面试小抄。涵盖Hadoop、Spark、Flink、Hive、HBae、Kafka、ES、Zookeeper等。 开源给大家,若感觉不错欢迎star~ 摘取Flink部分如下文章目录FlinkFli…...
Vue:(三十一)Vue封装的过度与动画
上一篇订阅与发布不够过瘾,接着再来一篇,come on!!!作用:在插入、更新或移除DOM元素时,在合适的时候给元素添加样式类名写法:过度:元素进入的样式:v-enter&am…...
文本处理:字符串替换
方法1:str.replace str.replace(old, new[, count]) Return a copy of the string with all occurrences of substring old replaced by new. If the optional argument count is given, only the first count occurrences are replaced. 该方法逻辑大致如下所示&am…...
python 调用 dll 出现精度问题
问题:python 在调用dll 的时候出现了精度问题 总结:使用decimal库进行转换就可以正常传递。 ‘ 心急的朋友可以略过下文了。 心急的朋友可以略过下文了。 心急的朋友可以略过下文了。 心急的朋友可以略过下文了。 ’ 遇到的问题具体情况 dll 生成函数…...
STL讲解——模拟实现string
STL讲解——模拟实现string 经典的string类问题 大厂在面试中,面试官总喜欢让学生自己来模拟实现string类,最主要是实现string类的增、删、查、改、构造、拷贝构造、赋值运算符重载以及析构函数。大家看下自己可不可以写一个string类? cla…...
CDH 6.3.2 升级Hive 2.3.9
升级背景 DolphinScheduler 3.1.1安装好后,其源码中集成的是Hive 2.1.1,版本太低,当在数据中心连接Hive数据源时报错,所以升级CDH自带的Hive为2.3.9版本。 一、准备工作 1、下载hive2.3.9并解压 下载地址:http://a…...
距离不是拦截我们前进的主因,与社科院杜兰金融硕士一起奔赴山海
最近有咨询社科院杜兰金融管理硕士项目的同学反馈他在西安,读研来北京上课太远了。一直在纠结要不要申请,其实距离不是问题,相向而行才是关键。在项目就读的同学好多也是来自外地,他们克服了种种困难来到项目学习,就是…...
【SpringBoot】MyBatis-plus 报错 sqlSessionFactory sqlSessionTemplate 最新解决办法
本文针对 MyBatis-plus,对于 MyBatis 报相同的错误,可以看这个大佬的文章:SpringBoot3整合MyBatis报错:Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required 针对报错如下: Property sqlSessionF…...
jsp诊疗预约系统Myeclipse开发mysql数据库web结构java编程计算机网页项目
一、源码特点 jsp诊疗预约系统 是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql,使用jav…...
详解 APISIX Lua 动态调试插件 inspect
作者罗锦华,API7.ai 技术专家/技术工程师,开源项目 pgcat,lua-resty-ffi,lua-resty-inspect 的作者。 原文链接 为什么需要 Lua 动态调试插件? Apache APISIX 有很多 Lua 代码,如何在运行时不触碰源代码的…...
#科研筑基# python初学自用笔记 第五篇 函数
调用函数python有很多内置函数,我们可以直接调用,详见python官方文档:内置函数 — Python 3.11.2 文档,也可以在命令行中输入help(函数名)来查看该函数的使用法则。函数名的本质就是指向一个函数对象的引用,完全可以用…...
设计模式之策略模式
一.基本内容1 . 实例有各种鸭子(野鸭,北京鸭子,水鸭等,鸭子有各种行为,比如飞,叫等显示鸭子的信息传统方法解决:鸭子为抽象类,具体鸭子继承抽象类2.传统方法的不足:其他鸭…...
dbdeployer 使用札记
https://github.com/datacharmer/dbdeployer默认配置文件为当前用户的$HOME/.dbdeployer/config.json作为配置文件,可以通过dbdeplyoer defaults export导出并修改配置或者直接通过dbdeployer defaults update来更新默认文件,配置文件包含MySQL初始信息。…...
MATLAB算法实战应用案例精讲-【图像处理】数字图像模糊化(附Java、python和matlab代码实现)
目录 前言 几个相关概念 噪声 滤波器 算法原理 算法思想 噪...
搭建Hexo博客-第1章-Git和GitHub以及Coding的简单用法
搭建Hexo博客-第1章-Git和GitHub以及Coding的简单用法 搭建Hexo博客-第1章-Git和GitHub以及Coding的简单用法 Coding GitHub Hexo Markdown 搭建博客 大家好,这是我第一次写博客。使用 GitHub Hexo 创建最基本的博客很容易,网上有很多现成的教程。…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
