⬢ DragonFlyBSD Kernel Audit
DF-3372 / probe_affinity.c
← back to finding ↓ download raw
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>
#include <sys/usched.h>
static void groom(int n, unsigned char a){
  unsigned char g[8]; int i, u;
  g[0]=8; g[1]=AF_INET; g[2]=0x11; g[3]=0x22;
  g[4]=a; g[5]=2; g[6]=3; g[7]=4;
  for(i=0;i<n;i++){ u=socket(AF_INET,SOCK_DGRAM,0); bind(u,(struct sockaddr*)g,8); close(u);}
}
static int tcpb(int len){
  unsigned char sa[8]; int s,r;
  memset(sa,0,sizeof sa);
  sa[0]=len; sa[1]=AF_INET;
  s=socket(AF_INET,SOCK_STREAM,0);
  r=bind(s,(struct sockaddr*)sa,len); close(s);
  return (r==0)?0:errno;
}
int main(void){
  int cpu, r224, r8;
  for(cpu=0; cpu<6; cpu++){
    int cp = cpu;
    if (usched_set(0, USCHED_SET_CPU, &cp, sizeof(cp)) < 0) {
      printf("cpu%d: usched_set failed: %s\n", cpu, strerror(errno)); continue;
    }
    groom(64,224); r224=tcpb(2);
    groom(64,8);   r8=tcpb(2);
    printf("cpu%d: groom224 -> %d, groom8 -> %d %s\n", cpu, r224, r8,
           (r224!=r8) ? "<<<< FLIP" : "");
  }
  return 0;}