in pkg/profiling/task/network/runner.go [117:187]
func (r *Runner) Start(ctx context.Context, task *base.ProfilingTask, processes []api.ProcessInterface) error {
r.startLock.Lock()
defer r.startLock.Unlock()
// if already start, then just adding the processes
if r.bpf != nil {
return r.updateTask(task, processes)
}
r.ctx, r.cancel = context.WithCancel(ctx)
// load bpf program
bpfLoader, err := bpf.NewLoader()
if err != nil {
return err
}
r.bpf = bpfLoader
if err := r.updateTask(task, processes); err != nil {
return err
}
// register all handlers
r.analyzeContext.RegisterAllHandlers(r.ctx, bpfLoader)
r.analyzeContext.StartSocketAddressParser(r.ctx)
// sock opts
bpfLoader.AddSysCall("close", bpfLoader.SysClose, bpfLoader.SysCloseRet)
bpfLoader.AddSysCall("connect", bpfLoader.SysConnect, bpfLoader.SysConnectRet)
bpfLoader.AddSysCall("accept", bpfLoader.SysAccept, bpfLoader.SysAcceptRet)
bpfLoader.AddSysCall("accept4", bpfLoader.SysAccept, bpfLoader.SysAcceptRet)
bpfLoader.AddLink(link.Kretprobe, map[string]*ebpf.Program{"sock_alloc": bpfLoader.SockAllocRet})
bpfLoader.AddLink(link.Kprobe, map[string]*ebpf.Program{"tcp_connect": bpfLoader.TcpConnect})
// write/receive data
bpfLoader.AddSysCall("send", bpfLoader.SysSend, bpfLoader.SysSendRet)
bpfLoader.AddSysCall("sendto", bpfLoader.SysSendto, bpfLoader.SysSendtoRet)
bpfLoader.AddSysCall("sendmsg", bpfLoader.SysSendmsg, bpfLoader.SysSendmsgRet)
bpfLoader.AddSysCall("sendmmsg", bpfLoader.SysSendmmsg, bpfLoader.SysSendmmsgRet)
bpfLoader.AddSysCall("sendfile", bpfLoader.SysSendfile, bpfLoader.SysSendfileRet)
bpfLoader.AddSysCall("sendfile64", bpfLoader.SysSendfile, bpfLoader.SysSendfileRet)
bpfLoader.AddSysCall("write", bpfLoader.SysWrite, bpfLoader.SysWriteRet)
bpfLoader.AddSysCall("writev", bpfLoader.SysWritev, bpfLoader.SysWritevRet)
bpfLoader.AddSysCall("read", bpfLoader.SysRead, bpfLoader.SysReadRet)
bpfLoader.AddSysCall("readv", bpfLoader.SysReadv, bpfLoader.SysReadvRet)
bpfLoader.AddSysCall("recv", bpfLoader.SysRecv, bpfLoader.SysRecvRet)
bpfLoader.AddSysCall("recvfrom", bpfLoader.SysRecvfrom, bpfLoader.SysRecvfromRet)
bpfLoader.AddSysCall("recvmsg", bpfLoader.SysRecvmsg, bpfLoader.SysRecvmsgRet)
bpfLoader.AddSysCall("recvmmsg", bpfLoader.SysRecvmmsg, bpfLoader.SysRecvmmsgRet)
bpfLoader.AddLink(link.Kprobe, map[string]*ebpf.Program{"tcp_rcv_established": bpfLoader.TcpRcvEstablished})
bpfLoader.AddLink(link.Kprobe, map[string]*ebpf.Program{"security_socket_sendmsg": bpfLoader.SecuritySocketSendmsg})
bpfLoader.AddLink(link.Kprobe, map[string]*ebpf.Program{"security_socket_recvmsg": bpfLoader.SecuritySocketRecvmsg})
// retransmit/drop
bpfLoader.AddLink(link.Kprobe, map[string]*ebpf.Program{"tcp_retransmit_skb": bpfLoader.TcpRetransmit})
if e := bpfLoader.AddLinkOrError(link.Kprobe, map[string]*ebpf.Program{
"tcp_drop": bpfLoader.TcpDrop,
"kfree_skb_reason": bpfLoader.KfreeSkbReason}); e != nil {
log.Warnf("cannot monitor the tcp drop, ignore it and keep profiling: %v", e)
}
bpfLoader.AddLink(link.Kprobe, map[string]*ebpf.Program{"ip_finish_output": bpfLoader.IpFinishOutput})
bpfLoader.AddLink(link.Kprobe, map[string]*ebpf.Program{"skb_copy_datagram_iter": bpfLoader.SkbCopyDatagramIter})
if err := bpfLoader.HasError(); err != nil {
_ = bpfLoader.Close()
return err
}
// metrics report
r.registerMetricsReport()
return nil
}