blob: bbaecffa473807b52d4de59f893a0c9200029ba0 [file] [log] [blame]
// Copyright 2015 syzkaller project authors. All rights reserved.
// Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.
// Package rpctype contains types of message passed via net/rpc connections
// between various parts of the system.
package rpctype
import (
"math"
"time"
"github.com/google/syzkaller/pkg/flatrpc"
"github.com/google/syzkaller/pkg/host"
"github.com/google/syzkaller/pkg/ipc"
"github.com/google/syzkaller/pkg/signal"
)
// ExecutionRequest describes the task of executing a particular program.
// Corresponds to Fuzzer.Request.
type ExecutionRequest struct {
ID int64
ProgData []byte
ExecOpts ipc.ExecOpts
NewSignal bool
// If set, ProgData contains compiled executable binary
// that needs to be written to disk and executed.
IsBinary bool
// If set, fully reset executor state befor executing the test.
ResetState bool
// If set, collect program output and return in ExecutionResult.Output.
ReturnOutput bool
// If set, don't fail on program failures, instead return the error in ExecutionResult.Error.
ReturnError bool
SignalFilter signal.Signal
SignalFilterCall int
// Repeat the program that many times (0 means 1).
Repeat int
}
// ExecutionResult is sent after ExecutionRequest is completed.
type ExecutionResult struct {
ID int64
ProcID int
Try int
Info ipc.ProgInfo
Output []byte
Error string
}
// ExchangeInfoRequest is periodically sent by syz-fuzzer to syz-manager.
type ExchangeInfoRequest struct {
Name string
NeedProgs int
StatsDelta map[string]uint64
Results []ExecutionResult
Latency time.Duration // latency of the previous ExchangeInfo request
}
// ExchangeInfoReply is a reply to ExchangeInfoRequest.
type ExchangeInfoReply struct {
Requests []ExecutionRequest
NewMaxSignal []uint32
DropMaxSignal []uint32
}
// ExecutingRequest is notification from the fuzzer that it started executing
// the program ProgID. We want this request to be as small and as fast as possible
// b/c we want it to reach manager (or at least leave the VM) before it crashes
// executing this program.
type ExecutingRequest struct {
Name string
ID int64
ProcID int
Try int
}
// TODO: merge ExecutionRequest and ExecTask.
type ExecTask struct {
Prog []byte
ID int64
}
type ConnectArgs struct {
Name string
GitRevision string
SyzRevision string
ExecutorArch string
ExecutorGitRevision string
ExecutorSyzRevision string
}
type ConnectRes struct {
MemoryLeakFrames []string
DataRaceFrames []string
// This is forwarded from CheckArgs, if checking was already done.
Features *host.Features
// Fuzzer reads these files inside of the VM and returns contents in CheckArgs.Files.
ReadFiles []string
ReadGlobs []string
}
type CheckArgs struct {
Name string
Error string
Features *host.Features
Globs map[string][]string
Files []flatrpc.FileInfoT
}
type CheckRes struct {
CoverFilterBitmap []byte
}
type SyscallReason struct {
ID int
Reason string
}
type RunnerConnectArgs struct {
Pool, VM int
}
type RunnerConnectRes struct {
// CheckUnsupportedCalls is set to true if the Runner needs to query the kernel
// for unsupported system calls and report them back to the server.
CheckUnsupportedCalls bool
}
// UpdateUnsupportedArgs contains the data passed from client to server in an
// UpdateSupported call, namely the system calls not supported by the client's
// kernel.
type UpdateUnsupportedArgs struct {
// Pool is used to identify the checked kernel.
Pool int
// UnsupportedCalls contains the ID's of system calls not supported by the
// client and the reason for this.
UnsupportedCalls []SyscallReason
}
// NextExchangeArgs contains the data passed from client to server namely
// identification information of the VM and program execution results.
type NextExchangeArgs struct {
// Pool/VM are used to identify the instance on which the client is running.
Pool, VM int
// ExecTaskID is used to uniquely identify the program for which the client is
// sending results.
ExecTaskID int64
// Hanged is set to true if the program for which we are sending results
// was killed due to hanging.
Hanged bool
// Info contains information about the execution of each system call in the
// program.
Info ipc.ProgInfo
}
// NextExchaneRes contains the data passed from server to client namely
// programs to execute on the VM.
type NextExchangeRes struct {
ExecTask
}
const (
NoTask int64 = math.MaxInt64
)
type HubConnectArgs struct {
// Client/Key are used for authentication.
Client string
// The key may be a secret password or the oauth token prefixed by "Bearer ".
Key string
// Manager name, must start with Client.
Manager string
// See pkg/mgrconfig.Config.HubDomain.
Domain string
// Manager has started with an empty corpus and requests whole hub corpus.
Fresh bool
// Set of system call names supported by this manager.
// Used to filter out programs with unsupported calls.
Calls []string
// Current manager corpus.
Corpus [][]byte
}
type HubSyncArgs struct {
// see HubConnectArgs.
Client string
Key string
Manager string
NeedRepros bool
// Programs added to corpus since last sync or connect.
Add [][]byte
// Hashes of programs removed from corpus since last sync or connect.
Del []string
// Repros found since last sync.
Repros [][]byte
}
type HubSyncRes struct {
// Set of inputs from other managers.
Inputs []HubInput
// Same as Inputs but for legacy managers that don't understand new format (remove later).
Progs [][]byte
// Set of repros from other managers.
Repros [][]byte
// Number of remaining pending programs,
// if >0 manager should do sync again.
More int
}
type HubInput struct {
// Domain of the source manager.
Domain string
Prog []byte
}