Asuro/src/driver/net/l1/net.pas
Kieron Morris 64b3c9a7ba Apache License
Added the apache license to all source files, accounting for authors. Also added a license.md containing the apache license + contributors.md listing all contributors.
2021-06-22 21:31:17 +01:00

151 lines
3.5 KiB
ObjectPascal

// Copyright 2021 Kieron Morris
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
{
Driver->Net->L1->Net - Network Card<->Driver Interface.
@author(Kieron Morris <kjm@kieronmorris.me>)
}
unit net;
interface
uses
tracer,
console,
nettypes, netutils,
netlog,
RTC;
procedure init;
procedure registerNetworkCard(SendCallback : TNetSendCallback; _MAC : puint8);
procedure registerNextLayer(RecvCallback : TRecvCallback);
procedure send(p_data : void; p_len : uint16);
procedure recv(p_data : void; p_len : uint16);
function getMAC : puint8;
procedure writeToLog(str : pchar);
procedure writeToLogLn(str : pchar);
implementation
uses
terminal,
e1000, //dev
eth2, //L2
arp, ipv4, //L3
icmp, tcp, udp, //L4
dhcp; //L5
var
CBSend : TNetSendCallback = nil;
CBNext : TRecvCallback = nil;
MAC : puint8 = @NULL_MAC[0];
procedure writeToLog(str : pchar);
var
DateTime : TDateTime;
begin
if getNetlogHWND <> 0 then begin
DateTime:= getDateTime;
writeStringWND('[', getNetlogHWND);
if DateTime.Hours < 10 then writeIntWND(0, getNetlogHWND);
writeIntWND(DateTime.Hours, getNetlogHWND);
writeStringWND(':', getNetlogHWND);
if DateTime.Minutes < 10 then writeIntWND(0, getNetlogHWND);
writeIntWND(DateTime.Minutes, getNetlogHWND);
writeStringWND(':', getNetlogHWND);
if DateTime.Seconds < 10 then writeIntWND(0, getNetlogHWND);
writeIntWND(DateTime.Seconds, getNetlogHWND);
writeStringWND('] ', getNetlogHWND);
writeStringWND(str, getNetlogHWND);
end;
end;
procedure writeToLogLn(str : pchar);
begin
writeToLog(str);
if getNetlogHWND <> 0 then begin
writestringlnWND(' ', getNetlogHWND);
end;
end;
procedure registerNetworkCard(SendCallback : TNetSendCallback; _MAC : puint8);
begin
push_trace('net.registerNetworkCard');
if CBSend = nil then begin
CBSend:= SendCallback;
MAC:= _MAC;
end;
pop_trace;
end;
procedure registerNextLayer(RecvCallback : TRecvCallback);
begin
push_trace('net.registerNextLayer');
if CBNext = nil then begin
CBNext:= RecvCallback;
end;
pop_trace;
end;
procedure send(p_data : void; p_len : uint16);
begin
//push_trace('net.send');
//writeToLogLn('L1: net.send');
if CBSend <> nil then CBSend(p_data, p_len);
pop_trace;
end;
procedure recv(p_data : void; p_len : uint16);
var
context : PPacketContext;
begin
//push_trace('net.recv');
//writeToLogLn('L1: net.recv');
context:= newPacketContext;
if CBNext <> nil then CBNext(p_data, p_len, context);
freePacketContext(context);
pop_trace;
end;
function getMAC : puint8;
begin
push_trace('net.getMAC');
getMAC:= MAC;
pop_trace;
end;
procedure init;
begin
push_trace('net.init');
//l2
eth2.register;
//l3
arp.register;
ipv4.register;
//l4
icmp.register;
udp.register;
//l5
dhcp.register;
pop_trace;
end;
end.