1
0
mirror of https://github.com/simh/simh.git synced 2026-03-25 17:58:26 +00:00

From Matt Burke

- Fixes a bug with DEC C v6.5-001 for OpenVMS/Alpha
  - Adds support for OpenVMS/Integrity
This commit is contained in:
Mark Pizzolato
2011-09-23 11:28:00 -07:00
parent ac4a6ad369
commit af6338d927
7 changed files with 160 additions and 91 deletions

View File

@@ -2,7 +2,7 @@ $ if f$search("pcap.olb") .eqs. ""
$ then
$ libr/crea pcap.olb
$ endif
$ if p1 .nes. ""
$ if p1 .eqs. "DEBUG"
$ then
$ opt = "/debug/noopt"
$ else
@@ -39,7 +39,7 @@ $ libr/replace pcap grammar
$ cc/name=( as_is,shortened)/opt/nomember_align'opt/include=sys$disk:[] -
inet+sys$share:sys$lib_c.tlb/lib
$ libr/replace pcap inet
$ cc/name=( as_is,shortened)/opt'opt/include=sys$disk:[] -
$ cc/name=( as_is,shortened)/opt/nomember_align'opt/include=sys$disk:[] -
nametoaddr+sys$share:sys$lib_c.tlb/lib
$ libr/replace pcap nametoaddr
$ cc/name=( as_is,shortened)/opt/nomember_align'opt/include=sys$disk:[] -
@@ -61,4 +61,3 @@ $ cc/name=( as_is,shortened)/opt/nomember_alig'opt/include=sys$disk:[] -
pcap-vms+sys$share:sys$lib_c.tlb/lib
$ libr/replace pcap pcap-vms
$ exit

View File

@@ -17,6 +17,9 @@
* WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
* X-5 MB Matt Burke 10-Jun-2011
* Changed protocol type from 'IP' to 'DEC Customer Protocol'
*
* X-4 Mark Pizzolato mark@infocomm.com 30-Oct-2003
* Changed the interface names returned by pcap_platform_finddevs
* to be upper case to conform to the form provided by UCX. This
@@ -302,7 +305,7 @@ pcap_t *pcap_open_live(char *device, int snaplen, int promisc, int to_ms, char *
pcap_t *pcap_handle;
char *ctlptr;
char proto[5] = {8,0,0x2b,0x80,0x00};
char pty[2] = {0x08,0x00};
char pty[2] = {0x60,0x06};
unsigned long ctldesc[2];
INTERFACE interface;
@@ -368,13 +371,9 @@ pcap_t *pcap_open_live(char *device, int snaplen, int promisc, int to_ms, char *
// Use standard ethernet package type
//
ctlptr = pcap_handle->lan_ctl;
// ADD_INT_VAL(ctlptr, NMA$C_PCLI_FMT, NMA$C_LINFM_802E);
ADD_INT_VAL(ctlptr, NMA$C_PCLI_FMT, NMA$C_LINFM_ETH);
// ADD_INT_VAL(ctlptr, NMA$C_PCLI_SAP, 0xfffe);
ADD_INT_VAL(ctlptr, NMA$C_PCLI_PAD, NMA$C_STATE_OFF);
// ADD_INT_VAL(ctlptr, NMA$C_PCLI_CRC, NMA$C_STATE_OFF);
ADD_INT_VAL(ctlptr, NMA$C_PCLI_MLT, NMA$C_STATE_ON);
// ADD_INT_VAL(ctlptr, NMA$C_PCLI_ACC, NMA$C_ACC_SHR);
//
@@ -382,7 +381,6 @@ pcap_t *pcap_open_live(char *device, int snaplen, int promisc, int to_ms, char *
//
ADD_INT_VAL(ctlptr, NMA$C_PCLI_BFN, 255);
ADD_INT_VAL(ctlptr, NMA$C_PCLI_BUS, 2048);
// ADD_INT_VAL(ctlptr, NMA$C_PCLI_DCH, NMA$C_STATE_ON);
//
// If promiscious mode, enable it
@@ -395,7 +393,6 @@ pcap_t *pcap_open_live(char *device, int snaplen, int promisc, int to_ms, char *
// All ethernet packets
//
ADD_INT_VAL(ctlptr, NMA$C_PCLI_PTY, *(int *)pty);
// ADD_CNT_VAL(ctlptr, NMA$C_PCLI_PID, sizeof(proto), proto);
//
// Calculate length

View File

@@ -1,4 +1,4 @@
#pragma module PCAPVCI "X-1"
#pragma module PCAPVCI "X-2"
/*
**++
** FACILITY: PCAP
@@ -25,6 +25,9 @@
**
** MODIFICATION HISTORY:
**
** X-2 MB Matt Burke 10-Jun-2011
** Changes to allow compilation on IA64.
**
** X-1 Ankan 25-Oct-2003
** Lock/unlock data prior to passing it to execlet.
** Return proper status from enable/disable port.
@@ -447,7 +450,11 @@ int load_execlet ()
// Get the shared context. We built the execlet so that the address
// of the routine that does this is at home base...
#ifdef __ia64
rtnptr = *(void **)reference_handle.ldrimg_ptr->ldrimg$l_segments[5].ldrisd$p_base;
#else
rtnptr = *(void **)reference_handle.ldrimg_ptr->ldrimg$l_nonpag_w_base;
#endif
if (rtnptr) {
getContext = (int (*)())rtnptr;
status = (*getContext)(&pcapvcm);

View File

@@ -1,64 +0,0 @@
$ if f$search("pcap.olb") .eqs. ""
$ then
$ libr/crea pcap.olb
$ endif
$ if p1 .eqs. "DEBUG"
$ then
$ opt = "/debug/noopt"
$ else
$! Nodebug
$ opt = "/opt=(level=4)"
$ endif
$ cc/opt/name=(as_is, shortened)/nomember_align'opt/include=sys$disk:[] -
pcapvci+sys$share:sys$lib_c.tlb/lib
$ libr/replace pcap pcapvci
$ cc/opt/name=(as_is, shortened)/nomember_align'opt/include=sys$disk:[] -
vcmutil+sys$share:sys$lib_c.tlb/lib
$ libr/replace pcap vcmutil
$ cc/name=( as_is,shortened)/opt/nomember_align'opt/include=sys$disk:[] -
bpf_dump+sys$share:sys$lib_c.tlb/lib
$ libr/replace pcap bpf_dump
$ cc/name=( as_is,shortened)/opt/nomember_align'opt/include=sys$disk:[] -
bpf_filter+sys$share:sys$lib_c.tlb/lib
$ libr/replace pcap bpf_filter
$ cc/name=( as_is,shortened)/opt/nomember_align'opt/include=sys$disk:[] -
bpf_image+sys$share:sys$lib_c.tlb/lib
$ libr/replace pcap bpf_image
$ cc/name=( as_is,shortened)/opt/nomember_align'opt/include=sys$disk:[] -
etherent+sys$share:sys$lib_c.tlb/lib
$ libr/replace pcap etherent
$ cc/name=( as_is,shortened)/opt/nomember_align'opt/include=sys$disk:[] -
fad-gifc+sys$share:sys$lib_c.tlb/lib
$ libr/replace pcap fad-gifc
$ cc/name=( as_is,shortened)/opt/nomember_align'opt/include=sys$disk:[] -
gencode+sys$share:sys$lib_c.tlb/lib
$ libr/replace pcap gencode
$ cc/name=( as_is,shortened)/opt/nomember_align'opt/include=sys$disk:[] -
grammar+sys$share:sys$lib_c.tlb/lib
$ libr/replace pcap grammar
$ cc/name=( as_is,shortened)/opt/nomember_align'opt/include=sys$disk:[] -
inet+sys$share:sys$lib_c.tlb/lib
$ libr/replace pcap inet
$ cc/name=( as_is,shortened)/opt/nomember_align'opt/include=sys$disk:[] -
nametoaddr+sys$share:sys$lib_c.tlb/lib
$ libr/replace pcap nametoaddr
$ cc/name=( as_is,shortened)/opt/nomember_align'opt/include=sys$disk:[] -
optimize+sys$share:sys$lib_c.tlb/lib
$ libr/replace pcap optimize
$ cc/name=( as_is,shortened)/opt/nomember_align'opt/include=sys$disk:[] -
pcap+sys$share:sys$lib_c.tlb/lib
$ libr/replace pcap pcap
$ cc/name=( as_is,shortened)/opt/nomember_align'opt/include=sys$disk:[] -
savefile+sys$share:sys$lib_c.tlb/lib
$ libr/replace pcap savefile
$ cc/name=( as_is,shortened)/opt/nomember_align'opt/include=sys$disk:[] -
scanner+sys$share:sys$lib_c.tlb/lib
$ libr/replace pcap scanner
$ cc/name=( as_is,shortened)/opt/nomember_align'opt/include=sys$disk:[] -
snprintf+sys$share:sys$lib_c.tlb/lib
$ libr/replace pcap snprintf
$ cc/name=( as_is,shortened)/opt/nomember_align'opt/include=sys$disk:[] -
pcap-vms+sys$share:sys$lib_c.tlb/lib
$ libr/replace pcap pcap-vms
$ exit

View File

@@ -26,6 +26,7 @@ $ SAVE_DEFAULT = F$ENVIRONMENT("DEFAULT")
$ NEW_DEFAULT = F$ENVIRONMENT("PROCEDURE")
$ NEW_DEFAULT = F$PARSE(NEW_DEFAULT,,,"DEVICE") + -
F$PARSE(NEW_DEFAULT,,,"DIRECTORY")
$ ARCH_NAME = F$GETSYI("ARCH_NAME")
$ SET DEFAULT 'NEW_DEFAULT'
$
$ DEFINE PCAPVCM$OBJ 'NEW_DEFAULT'
@@ -52,6 +53,8 @@ $ LIBRARY/OBJECT/REPLACE PCAPVCM PCAPVCM_INIT,PCAPVCM,vci_jacket,vcmutil
$ ENDIF
$
$! Link it
$ IF ARCH_NAME .EQS. "Alpha"
$ THEN
$ LINK/NOTRACE/NOUSERLIB/MAP=pcapvcm/FULL/NOSYSLIB/NOSYSSHR -
/SHARE -
/NATIVEONLY -
@@ -121,6 +124,65 @@ COLLECT=INIT/ATTRIBUTES=INITIALIZATION_CODE, EXEC$INIT_LINKAGE, -
EXEC$INIT_SSTBL_000, -
EXEC$INIT_SSTBL_001, -
EXEC$INIT_SSTBL_002
$ ENDIF
$
$ IF ARCH_NAME .EQS. "IA64"
$ THEN
$ LINK/NOTRACE/NOUSERLIB/MAP=PCAPVCM/FULL/NOSYSSHR -
/SHARE -
/NATIVEONLY -
/BPAGE=14/NOTRACEBACK/NODEMAND_ZERO -
/SYSEXE=SELECTIVE -
/EXE=PCAPVCM.EXE -
SYS$INPUT/OPT
SYMBOL_TABLE=GLOBALS
!
vector_table = sys$share:sys$public_vectors.exe
!
! Ensure fixups are done before our initialization routines are called
!
IA64$LIBRARY:STARLET/INCLUDE=(SYS$DOINIT,SYS$SSDEF)
!
PCAPVCM$OBJ:PCAPVCM/INCLUDE=(PCAPVCM_INIT, PCAPVCM, VCI_JACKET, VCMUTIL)
SYS$LIBRARY:VMS$VOLATILE_PRIVATE_INTERFACES/INCLUDE=(BUGCHECK_CODES)
!
SHORT_DATA=WRT
CASE_SENSITIVE=YES
PSECT_ATTR=$CODE$, CON,REL,GBL,SHR,EXE,RD,NOWRT,NOVEC
PSECT_ATTR=EXEC$NONPAGED_CODE, CON,REL,GBL,SHR,EXE,RD,NOWRT,NOVEC
PSECT_ATTR=EXEC$INIT_CODE, CON,REL,GBL,NOSHR,EXE,RD,WRT,NOVEC
PSECT_ATTR=EXEC$INIT_000, QUAD,CON,REL,GBL,NOSHR,EXE,RD,WRT,NOVEC
PSECT_ATTR=EXEC$INIT_001, QUAD,CON,REL,GBL,NOSHR,EXE,RD,WRT,NOVEC
PSECT_ATTR=EXEC$INIT_002, QUAD,CON,REL,GBL,NOSHR,EXE,RD,WRT,NOVEC
PSECT_ATTR=EXEC$INIT_SSTBL_000, OCTA,CON,REL,GBL,NOSHR,EXE,RD,WRT,NOVEC,MOD
PSECT_ATTR=EXEC$INIT_SSTBL_001, OCTA,CON,REL,GBL,NOSHR,EXE,RD,WRT,NOVEC,MOD
PSECT_ATTR=EXEC$INIT_SSTBL_002, OCTA,CON,REL,GBL,NOSHR,EXE,RD,WRT,NOVEC,MOD
PSECT_ATTR=$BSS$, CON,REL,GBL,NOSHR,NOEXE,RD,WRT,NOVEC,MOD
PSECT_ATTR=$READONLY$, CON,REL,GBL,NOSHR,NOEXE,RD,WRT,NOVEC
COLLECT=NONPAGED_READONLY_PSECTS/ATTRIBUTES=RESIDENT,-
$CODE$,-
EXEC$NONPAGED_CODE
COLLECT=NONPAGED_READWRITE_PSECTS/ATTRIBUTES=RESIDENT,-
$BSS$,-
$READONLY$
COLLECT=INITIALIZATION_PSECTS/ATTRIBUTES=INITIALIZATION_CODE,-
EXEC$INIT_CODE,-
EXEC$INIT_000,-
EXEC$INIT_001,-
EXEC$INIT_002,-
EXEC$INIT_SSTBL_000,-
EXEC$INIT_SSTBL_001,-
EXEC$INIT_SSTBL_002
CASE_SENSITIVE=NO
$ ENDIF
$
$ WRITE SYS$OUTPUT ""
$ WRITE SYS$OUTPUT "To use the PCAPVCM.EXE execlet you must copy it to"

View File

@@ -1,4 +1,4 @@
#pragma module pcap_client "X-1"
#pragma module pcap_client "X-2"
/*
*****************************************************************************
*
@@ -34,15 +34,15 @@
/* Define data structures and constants */
#include <descrip.h> /* Descriptors */
#include <ldrimgdef.h> /* Loaded image data block */
#include <lnmdef.h> /* Logical names */
#include <pdscdef.h> /* Linkage pairs */
#include <starlet.h> /* System service proto-types */
#include <ssdef.h> /* System service status codes */
#include <stsdef.h>
#include <stdio.h> /* CRTL I/O */
#include <string.h> /* CTRL strings */
#include <descrip.h> /* Descriptors */
#include <ldrimgdef.h> /* Loaded image data block */
#include <lnmdef.h> /* Logical names */
#include <pdscdef.h> /* Linkage pairs */
#include <starlet.h> /* System service proto-types */
#include <ssdef.h> /* System service status codes */
#include <stsdef.h>
#include <stdio.h> /* CRTL I/O */
#include <string.h> /* CTRL strings */
#include <ldrdef.h>
#include <nmadef.h>
@@ -399,7 +399,11 @@ int load_execlet ()
// Get the shared context. We built the execlet so that the address
// of the routine that does this is at home base...
rtnptr = *(void **)reference_handle.ldrimg_ptr->ldrimg$l_nonpag_w_base;
#ifdef __ia64
rtnptr = *(void **)reference_handle.ldrimg_ptr->ldrimg$l_segments[5].ldrisd$p_base;
#else
rtnptr = *(void **)reference_handle.ldrimg_ptr->ldrimg$l_nonpag_w_base;
#endif
if (rtnptr) {
getContext = (int (*)())rtnptr;
status = (*getContext)(&pcapvcm);

View File

@@ -1,4 +1,4 @@
#pragma module PCAPVCM "X-1"
#pragma module PCAPVCM "X-3"
#pragma code_psect "EXEC$NONPAGED_CODE"
#pragma linkage_psect "EXEC$NONPAGED_LINKAGE"
@@ -62,6 +62,17 @@
//
// REVISION HISTORY:
//
// X-3 MB Matt Burke 07-Jul-2011
// Missing fork_unlock for return path in
// pcap$vcm_read_packet when queue is empty.
//
// X-2 MB Matt Burke 10-Jun-2011
// 03 IOLOCK8 must be held whilst calling any LAN
// functions to ensure proper synchronization
// on SMP systems.
// 02 Changes to allow compilation on IA64.
// 01 Fix register corruption in pcap_event on ALPHA.
//
// X-1 Ankan Anders Ahgren 21-Mar-2003
// Initial version.
//
@@ -137,22 +148,38 @@ int pcap$vcm_get_statistics(VCMCTX_64P vcmctx, CHAR_64P stats);
// are called via JSBs from the LAN driver (LAN.MAR).
//
/* Transmit Complete */
#ifdef __ia64
#pragma linkage_ia64 pcap_txLnkg = (parameters(r4,r3), preserved(r28,r4,r5), nopreserve(r8,r9))
#else
#pragma linkage pcap_txLnkg = (parameters(r4,r3), preserved(r2,r4,r5), nopreserve(r0,r1))
#endif
#pragma use_linkage pcap_txLnkg (pcap_txCompl)
void pcap_txCompl( VCIBDLLDEF *vcib, VCRPDEF *request );
/* PortMgmt Complete */
#ifdef __ia64
#pragma linkage_ia64 pcap_mgmLnkg = (parameters(r4,r3), preserved(r28,r4,r5), nopreserve(r8,r9))
#else
#pragma linkage pcap_mgmLnkg = (parameters(r4,r3), preserved(r2,r4,r5), nopreserve(r0,r1))
#endif
#pragma use_linkage pcap_mgmLnkg (pcap_mgmCompl)
void pcap_mgmCompl( VCIBDLLDEF *vcib, VCRPDEF *request );
/* Receive */
#ifdef __ia64
#pragma linkage_ia64 pcap_rxLnkg = (parameters(r4,r3), preserved(r28,r4,r5), nopreserve(r8,r9))
#else
#pragma linkage pcap_rxLnkg = (parameters(r4,r3), preserved(r2,r4,r5), nopreserve(r0,r1))
#endif
#pragma use_linkage pcap_rxLnkg (pcap_rxCompl)
void pcap_rxCompl( VCIBDEF *vcib, VCRPDEF *request );
/* Events */
#pragma linkage pcap_evtLnkg = (parameters(r4,r1, r2), preserved(r5), nopreserve(r0,r1))
#ifdef __ia64
#pragma linkage_ia64 pcap_evtLnkg = (parameters(r4,r9,r28), preserved(r4,r5), nopreserve(r8,r9))
#else
#pragma linkage pcap_evtLnkg = (parameters(r4,r1,r2), preserved(r4,r5), nopreserve(r0,r1))
#endif
#pragma use_linkage pcap_evtLnkg (pcap_event)
void pcap_event( VCIBDLLDEF *vcib, int event, int reason );
@@ -259,15 +286,26 @@ int pcap$vcm_init (LDRIMG *ini_image_block,
ini_image_block->ldrimg$l_unlvec = unlvec;
//
// Allocate a 2 pages for our shared data structure
// Allocate 2 pages for our shared data structure
// with our companion, the PCAP library.
//
#if __VMS_VER >= 80200000
status = mmg$allocate_sva_and_pfns (
2, // number of pages
0,
0,
1, // S1 space
PTE$C_UW | PTE$M_ASM, // User mode RW
1, // nonpaged
(VOID_PPQ) &pcapvcm );
#else
status = mmg_std$alloc_system_va_map (
PTE$C_UW | PTE$M_ASM, // User mode RW
2, // number of pages
1, // nonpaged
1, // S1 space
(VOID_PPQ) &pcapvcm );
#endif
if (!$VMS_STATUS_SUCCESS(status))
bug_check (CUSTOMER, FATAL, COLD);
@@ -352,7 +390,7 @@ void pcap_txCompl( VCIBDLLDEF *vcib, VCRPDEF *request )
//
// Do nothing. We own the management VCRP an have a method for getting
// Do nothing. We own the management VCRP and have a method for getting
// the status below.
//
void pcap_mgmCompl( VCIBDLLDEF *vcib, VCRPDEF *request )
@@ -375,7 +413,8 @@ void pcap_rxCompl( VCIBDEF *vcib, VCRPDEF *request )
PCAPVCIB *pcapvcib;
VCRPDEF *vcrpout;
VCMCTX *vcmctx;
int saved_ipl;
//
// Get our port context
@@ -397,7 +436,9 @@ void pcap_rxCompl( VCIBDEF *vcib, VCRPDEF *request )
// If we failed to insert this item, drop it
//
if (status < 0) {
fork_lock(SPL$C_IOLOCK8, &saved_ipl);
status = vci_delete_vcrp(request);
fork_unlock(SPL$C_IOLOCK8, saved_ipl, SMP_RESTORE);
vcmctx->stat.recv_packets_dropped++;
return;
}
@@ -415,7 +456,9 @@ void pcap_rxCompl( VCIBDEF *vcib, VCRPDEF *request )
status = __PAL_REMQTIL(vcib, (void *)&vcrpout);
vcib->vcib$w_size--;
if (status != 0) {
fork_lock(SPL$C_IOLOCK8, &saved_ipl);
status = vci_delete_vcrp(vcrpout);
fork_unlock(SPL$C_IOLOCK8, saved_ipl, SMP_RESTORE);
vcmctx->stat.recv_packets_dropped++;
}
}
@@ -525,9 +568,12 @@ int pcap$vcm_getdevice(VCMCTX_64P vcmctx, CHAR_64P devnam)
LDCDEF *ldc;
unsigned char *tmpname;
int len = 0;
int saved_ipl;
id = vcmctx->ldcid;
fork_lock(SPL$C_IOLOCK8, &saved_ipl);
status = vci_get_device(&id, &ldc);
fork_unlock(SPL$C_IOLOCK8, saved_ipl, SMP_RESTORE);
if ($VMS_STATUS_SUCCESS(status)) {
vcmctx->ldcid = id;
tmpname = (unsigned char *) ldc->ldc$a_name;
@@ -554,6 +600,7 @@ int pcap$vcm_create_port(VCMCTX_64P vcmctx, CHAR_64P device)
char tmpdev[128];
int len;
PCAPVCIB *pcapvcib;
int saved_ipl;
len = (int) device[0];
memcpy(tmpdev, device, len+1);
@@ -578,7 +625,9 @@ int pcap$vcm_create_port(VCMCTX_64P vcmctx, CHAR_64P device)
pcapvcib->vcmctx = (VCMCTX *) vcmctx;
if $VMS_STATUS_SUCCESS(status) {
fork_lock(SPL$C_IOLOCK8, &saved_ipl);
status = vci_create_port((VCIBDLLDEF *)&vcmctx->vcib);
fork_unlock(SPL$C_IOLOCK8, saved_ipl, SMP_RESTORE);
}
return status;
@@ -590,8 +639,11 @@ int pcap$vcm_create_port(VCMCTX_64P vcmctx, CHAR_64P device)
int pcap$vcm_delete_port(VCMCTX_64P vcmctx)
{
int status;
int saved_ipl;
fork_lock(SPL$C_IOLOCK8, &saved_ipl);
status = vci_delete_port((VCIBDLLDEF *)&vcmctx->vcib);
fork_unlock(SPL$C_IOLOCK8, saved_ipl, SMP_RESTORE);
return status;
}
@@ -602,6 +654,7 @@ int pcap$vcm_delete_port(VCMCTX_64P vcmctx)
int pcap$vcm_enable_port(VCMCTX_64P vcmctx, int p2len, CHAR_64P p2buf)
{
int status;
int saved_ipl;
if (p2len > 0 && p2buf != NULL) {
memcpy(&vcmctx->p2_buf[0], p2buf, p2len);
@@ -615,8 +668,10 @@ int pcap$vcm_enable_port(VCMCTX_64P vcmctx, int p2len, CHAR_64P p2buf)
}
if $VMS_STATUS_SUCCESS(status) {
fork_lock(SPL$C_IOLOCK8, &saved_ipl);
status = vci_mgmt_port((VCRPLANDEF *)&vcmctx->vcrp,
(VCIBDLLDEF *)&vcmctx->vcib);
fork_unlock(SPL$C_IOLOCK8, saved_ipl, SMP_RESTORE);
}
return status;
@@ -628,13 +683,16 @@ int pcap$vcm_enable_port(VCMCTX_64P vcmctx, int p2len, CHAR_64P p2buf)
int pcap$vcm_disable_port(VCMCTX_64P vcmctx)
{
int status = SS$_NORMAL;
int saved_ipl;
status = init_mgmt_vcrp((VCRPLANDEF *)&vcmctx->vcrp,
VCRP$K_FC_DISABLE_PORT, 0, 0);
if $VMS_STATUS_SUCCESS(status) {
fork_lock(SPL$C_IOLOCK8, &saved_ipl);
status = vci_mgmt_port((VCRPLANDEF *)&vcmctx->vcrp,
(VCIBDLLDEF *)&vcmctx->vcib);
fork_unlock(SPL$C_IOLOCK8, saved_ipl, SMP_RESTORE);
}
return status;
@@ -707,6 +765,7 @@ int pcap$vcm_read_packet(VCMCTX_64P vcmctx, int len, CHAR_64P packet)
// If queue is empty, give up
//
if (status <= 0) {
fork_unlock(SPL$C_IOLOCK8, saved_ipl, SMP_RESTORE);
return SS$_NOSUCHOBJECT;
}
@@ -777,7 +836,9 @@ int pcap$vcm_send_packet(VCMCTX_64P vcmctx, int hdrlen, int len,
// Point to where we're going to put the packet
//
packptr = (char *) vcrp + VCRP$T_LAN_DATA + LAN$C_MAX_HDR_SIZE + 8;
fork_lock(SPL$C_IOLOCK8, &saved_ipl);
built_hdrlen = vci_build_header(packptr, &reshdr, 0, 0, (VCRPLANDEF *)&vcmctx->vcib);
fork_unlock(SPL$C_IOLOCK8, saved_ipl, SMP_RESTORE);
//
// Save the port context address
@@ -832,6 +893,7 @@ int pcap$vcm_build_header(VCMCTX_64P vcmctx, int len, CHAR_64P header)
char *reshdr;
char *hdrptr;
int hdrlen;
int saved_ipl;
//
// Set up pointer to (the middle of) header
@@ -841,7 +903,9 @@ int pcap$vcm_build_header(VCMCTX_64P vcmctx, int len, CHAR_64P header)
//
// Build the header
//
fork_lock(SPL$C_IOLOCK8, &saved_ipl);
hdrlen = vci_build_header(hdrptr, &reshdr, 0, 0, (VCRPLANDEF *)&vcmctx->vcib);
fork_unlock(SPL$C_IOLOCK8, saved_ipl, SMP_RESTORE);
//
// Copy header just built